Creando una función VBA

Como hemos visto en el artículo Tu primera macro con VBA, una subrutina nos ayuda a organizar y agrupar las instrucciones en nuestro código. El día de hoy te mostraré cómo crear una función VBA, la cual es similar a una subrutina excepto por una cosa.

A diferencia de las subrutinas, las funciones VBA fueron diseñadas para retornar un valor. A través de una función podemos agrupar código que nos ayudará a hacer algún cálculo específico y obtener un resultado de regreso. Una función VBA también es conocida como Función Definida por el Usuario, UDF por sus siglas en inglés, y una vez creada puede ser utilizada de la misma manera que las funciones incluidas en Excel como la función SUMAR o la función BUSCARV. Esto hace que las funciones VBA sean una herramienta muy poderosa.

A continuación mostraré una función que toma un rango y regresa la suma de cada una de sus celdas. Es importante insertar el código dentro de un Módulo tal como se muestra en el artículo Tu primera macro con VBA. Posteriormente iré explicando el detalle de la función.

Función VBA

La palabra clave Function

La primera línea de código comienza con la palabra Function la cual define el inicio de la función. Observa también cómo la última línea de código es End Function que está especificando el término de la función.

Inmediatamente después de la palabra clave Function se debe especificar el nombre de la función que en este ejemplo es MiSuma seguida de paréntesis que de manera opcional pueden contener una lista de parámetros.

Parámetros  de una función VBA

Los parámetros son el medio por el cual pasamos información de entrada a la función. Algunas funciones necesitarán de dichas entradas para realizar algún cálculo y algunas otras no, es por ello que los parámetros de una función son opcionales. Puedes incluir tantos parámetros como sean necesarios y solamente debes recordar separarlos por una coma.

Un parámetro no es más que una variable y por lo tanto puedes observar que en el ejemplo he definido la variable rango que será del tipo Range.

Valor de retorno

Como mencioné al principio, la característica principal de una función es que puede regresar un valor. Es por eso que al definir una función se debe indicar el tipo del valor de retorno que tendrá dicha función. En este caso el valor de retorno será de tipo Double y se está especificado por las palabras As Double que aparecen después de los paréntesis.

Cuerpo de la función VBA

Una vez definida la función se pueden especificar todas las instrucciones que serán ejecutas. En el ejemplo he comenzado por definir un par de variables, la variable celda que será del tipo Range y la variable resultado del tipo Double. En ésta última variable es donde se irá acumulando la suma de todas las celdas.

La parte central de la función se encuentra en la instrucción For Each ya que realiza un recorrido por todas las celdas del rango que fue especificado como parámetro. Para cada celda que se encuentra se va sumando su contenido en la variable resultado.

Retornando el valor

Una vez que se han hecho los cálculos necesarios, es importante regresar el valor. Para hacerlo es indispensable igualar el nombre de la función al valor o variable que contiene el valor que se desea regresar.  En nuestro ejemplo, la variable resultado es la que contiene la suma de todas las celdas por lo que se iguala con el nombre de la función en la línea MiSuma = resultado.

Probando la función VBA

Finalmente probaré la funciónVBA recién creada dentro de una hoja de Excel. Tal como lo definimos en el código, el único parámetro de la función debe ser un rango del cual me regresará la suma de los valores de la celda. Observa el siguiente ejemplo.

Probando una función VBA

Aunque la función MiSuma hace lo mismo que la función de Excel SUMAR, nos ha servido de ejemplo para introducir el tema de las funciones en VBA. Con este ejemplo tan sencillo hemos creado nuestra primera función VBA.

Artículos relacionados
Tu primera macro con VBA
El Editor de Visual Basic

23 comentarios en “Creando una función VBA

  1. Andres Aguirre

    mas que un comentario es una consulta si yo creo una funcion en un archivo, la funcion creada se puede usar en cada libro o archivo que yo cree, o tendria que usar el archivo como modelo para poder usar la funcion creada.

    gracias por su respuesta.

    1. Moisés Ortíz Autor

      Hola Andrés, las funciones solamente se pueden utilizar en el archivo donde fueron creadas. Una opción es guardarlas en el libro personal de macros para que puedan estar disponibles para todos los libros en tu equipo. Más información sobre el libro personal de macros en el siguiente artículo:
      http://exceltotal.com/el-libro-de-macros-personal-en-excel/

  2. Víctor

    Buenas tardes,
    llevo horas intentando insertar una función SI con una variable metida en una celda mediante VBA y no lo he conseguido. El código es el siguiente:

    Dim variable As String
    variable = “hola”
    Sheets(“hoja1″).Select
    Range(“A2″).Select
    ActiveCell.Formula = “=SI(A1=1;” & variable & “;0)”

    Me da un error definido por la aplicación o el objeto y no se cómo arreglarlo. Con otras funciones sí que he conseguido meterlas en una celda utilizando variables, pero no con el SI. He probado utilizando IF y FormulaR1C1, pero nada de nada ha funcionado. ¿Qué estoy haciendo mal?

    Espero que podáis resolverme la duda, porque me estoy volviendo loco…

    Muchas gracias!!

    1. Moisés Ortíz Autor

      Hola Víctor, las funciones de Excel (desde VBA) deben ser usadas con su nombre en inglés. Además te hace falta una doble comilla alrededor de la variable. Utiliza la siguiente instrucción:
      ActiveCell.Formula = "=IF(A1=1;" & Chr(34) & variable & Chr(34) & ";0)"

  3. Carlos

    Buenas tardes Moises, he estado intentando realizar tu funcion de ejemplo pero no tengo éxito me sale: #¿NOMBRE?, la estoy insetando en un módulo del libro personal de macros, ¿Eso es correcto?

    1. Moisés Ortíz Autor

      Hola Carlos, no es indispensable que coloques la función en el libro personal de macros.
      De hecho, si apenas comienzas a utilizar VBA, te sugiero que hagas este ejercicio insertando el código en un módulo de un archivo normal.

      1. Gustavo

        Moises, muchas gracias por tu contribución al conocimiento…Con respecto al problema, a mí me pasa exactamente lo mismo Moisés, tengo el código en el editor relacionado con la Hoja5. Cuando busco la función ni siquiera me aparece en el listado de funciones de Excel y me da como resultado #¿NOMBRE?…que crees que pueda ser??…mi código es:

        Function MiSuma(rango As Range) As Double
        Dim celda As Range
        Dim resultado As Double

        For Each celda In rango.Cells
        resultado = Application.WorksheetFunction.Sum(resultado, celda.Value)

        MiSuma = resultado

        End Function

        1. Moisés Ortíz Autor

          Hola Gustavo, ¿Donde estás colocando este código?

  4. Martín

    Hola Moises, primero que todo felicitarte por esta iniciativa y entregar tus conocimientos a todos los interesados en este excelente programa como lo es el excel. mi Duda es la siguiente, estoy tratando de ejecutar la macro de tu ejemplo sin embargo me sale #¿NOMBRE? y al ingresar a la formula me sale que esta función no tiene argumentos ¿porque ocurre esto?

    Public Function MISUMA(Range As Range) As Double
    Dim celda As Range
    Dim resultado As Double

    For Each celda In rango.Cells
    resultado = Application.WorksheetFunction.Sum(resultado, celda.Value)
    Next celda
    MISUMA = resultado

    End Function

    1. Moisés Ortíz Autor

      Martín, “Range” es una palabra reservada en VBA y la estás utilizando incorrectamente en la primera línea:
      Range As Range

      Debes remover el primer “Range” y en su lugar colocar el nombre del argumento. En el código del ejemplo yo utilizo lo siguiente:
      rango As Range

  5. Isaura

    buen dia, mi problema es que necesito que excel reciba una funcion f(x,y) y coloque dos columnas como “x” y “y” pero ahora necesito utilizar la misma funcion para calcular f(x+h,y+k) y me gustaria utilizar un InputBox para introducir la funcion que deseo y esa funcion pueda evaluarla tanto en (x,y) como en (x+h,y+k) como puedo hacerle? de antemano agradezco su atencion

    1. Moisés Ortíz Autor

      Hola Isaura, después de recibir el texto del InputBox utiliza la instrucción Eval para ejecutar la instrucción, por ejemplo:
      funcion = InputBox()
      Eval(funcion)

      Por su puesto que será mandatorio introducir la instrucción correcta en el InputBox.

  6. Antonio Alcocer

    Hola Moises, tengo una duda.

    Como le puedo hacer para llamar una funcion desde el codigo de una macro, es una funcion que yo cree de la misma forma que lo comentaste anteriormente.
    ¿como le hago?

    1. Moisés Ortíz Autor

      Hola Antonio, solo debes llamar la función por su nombre y especificar cada uno de sus argumentos. La única condición es que la función debe estar dentro del mismo libro (no necesariamente dentro del mismo módulo de código).

  7. Saul

    Hola tengo una pregunta con respecto a las funciones..
    yo cree una función que busca el ultimo dato de una columna y funciona bien el problema es que cuando estos datos cambian el resultado de la función no lo hace.
    tengo que seleccionar la celda donde introduje la funciona y darle entre si no no actualiza los datos nuevos.
    mi pregunta es como solucionar esto..

    este es el codigo

    Function UltimaCoordenada(Celda As Range)
    columna = Celda.Column
    Fila = Celda.Row

    For Fila = 11 To 213
    If Cells(Fila, columna) “” Then
    UltimaCoordenada = Cells(Fila, columna).Address(Rowabsolute:=False, Columnabsolute:=False)
    Else
    Fila = Fila + 1
    End If
    Next Fila
    End Function

    1. Moisés Ortíz Autor

      Hola Saúl, coloca la función dentro del evento Worksheet_Change y eso hará que se ejecute la función al tener un cambio en una celda.

  8. Sergio Ruz

    Hola.
    ¿Existe alguna forma de poder cambiar el nombre con el cual llamo a una función?
    Tengo varias funciones que deseo guardar en el libro personal de macros, las cuales utilizo a menudo en mi trabajo, pero ocurre que cuando las grabo en el libro personal y luego intento ejecutarlas solo puedo hacerlo a través del botón función y no directamente tras anotar el signo igual.

    Function Edad(FechaNacimiento As Date) As Byte
    Edad = Int((Date – FechaNacimiento) / 365.25)
    End Function

    Esta por ejemplo es una de esas funciones. SI la grabo en un libro normal puedo escribir =Edad(rago de la fecha) y me entrega la edad, pero al cargar la función al libro personal me aparece #¿NOMBRE? si sescribo =Edad(rago de la fecha) y la única forma es escribir =PERSONAL.XLSB!Edad(rago de la fecha)

    Atentamente.

    1. Moisés Ortíz Autor

      Sergio, la única manera de utilizar una función que se encuentra en el libro personal de macros es la que mencionas: =PERSONAL.XLSB!Edad(rango de la fecha). No existe otra.
      Sin embargo, hay otra opción alterna al libro personal de macros y es guardar las funciones como complemento (Add-in). Después de instalar dicho complemento en Excel, las funciones estarán disponibles en todos los libros. Consulta el siguiente artículo si quieres saber cómo crear un complemento en Excel:
      http://exceltotal.com/como-crear-un-complemento-de-excel/

  9. Luis Felipe

    Como puedo agregar una descripcion a una funcion desde VBA. Me he liado todo el dia intentando agregar una descripcion a una funcion que ya cree pero no he podido

    1. Moisés Ortíz Autor

      Hola Luis Felipe, ve al editor de VBA y abre el Examinador de objetos y en la primera lista desplegable selecciona la opción “VBAProject”. Posteriormente busca tu función y haz clic derecho sobre ella para seleccionar la opción Propiedades y ahí encontrarás un recuadro para indicar la Descripción.

  10. Diana

    Hola Moises
    tengo una pregunta ¿qué function en VBA puedo utilizar para que me haga la suma de un rango de celdas condicionada con otro rango de celdas
    ejemplo: suma las celdas (A1:A20) donde las celdas (C1:C20) tengan “pajaro” no se si me di a entender pero espero tu respuesta.
    Gracias

    1. Moisés Ortíz Autor

      Hola Diana, si te refieres a una función VBA, la verdad es que no existe. Si quieres resolver este tema solo con instrucciones VBA tendrás que crear un bucle para recorrer las celdas del rango C1:C20 y evaluar su valor para saber si alguno de ellos es igual a “pajaro”. En caso de cumplirse dicha condición acumular la suma de la celda correspondiente de la columna A.
      Otra opción es utilizar directamente desde VBA la función de Excel SUMIF de la siguiente manera:
      Application.WorksheetFunction.SumIf(Range(“C1:C20″), “pajaro”, Range(“A1:A20″))

      1. Diana

        GRACIAS !!