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

12 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:
      https://exceltotal.com/el-libro-de-macros-personal-en-excel/

  2. 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.

  3. 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

  4. 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.

  5. 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:
      https://exceltotal.com/como-crear-un-complemento-de-excel/

  6. 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.