¿cómo crear una función definida por el usuario en vba?
Probablemente uno de los mayores beneficios de aprender VBA es la capacidad de crear sus propias funciones.
En Excel existen más de 450 funciones, y algunas de ellas son muy útiles en tu trabajo diario. Pero Excel te ofrece la opción de crear una función personalizada usando VBA. Sí, tiene usted razón. Función DEFINIDA POR EL USUARIO, abreviada como UDF, o también puede llamarla función VBA personalizada.
Y hay una cosa que puedo decir con confianza: todo usuario incipiente de VBA quiere aprender a crear una función definida por el usuario. ¿No tú? Di «Sí» en la sección de comentarios, si eres una de esas personas que desea crear una función personalizada.
Me alegra decirle que esta es una GUÍA COMPLETA para ayudarlo a crear su primera función personalizada usando VBA y, aparte de eso, he compartido algunos ejemplos de FUNCIONES DEFINIDAS POR EL USUARIO para ayudarlo a inspirarse.
- Aquí usaré las palabras función definida por el usuario, función personalizada y UDF indistintamente. Quédate conmigo, serás una estrella de rock de VBA en los próximos minutos.
- Para crear código para la función personalizada de VBA, debe escribirlo, no puede grabarlo usando la grabadora de macros .
Por qué deberías crear una función personalizada de Excel
Como dije, hay muchas funciones integradas en Excel que pueden ayudarte a resolver casi cualquier problema y realizar todo tipo de cálculos. Pero a veces, en situaciones específicas, es necesario crear una UDF.
Y a continuación he enumerado algunas de las razones o situaciones en las que debería utilizar una función personalizada.
1. Cuando no hay ninguna función para esto
Esta es una de las razones más comunes para crear una UDF con VBA, porque a veces necesitas calcular algo y no existe una función específica para eso. Puedo darte un ejemplo de contar palabras desde una celda y para ello descubrí que una UDF puede ser una solución perfecta.
2. Reemplazar una fórmula compleja
Si trabaja con fórmulas, estoy seguro de que sabrá que las fórmulas complejas son difíciles de leer y, a veces, más difíciles de entender para los demás. Entonces, una función personalizada puede ser una solución a este problema porque una vez que crea una UDF, no necesita escribir esta fórmula compleja una y otra vez.
3. Cuando no quieres usar SUB Rutina
Aunque puede utilizar código VBA para realizar un cálculo, los códigos VBA no son dinámicos*. Debe ejecutar este código nuevamente si desea actualizar su cálculo. Pero si convierte este código en una función, no necesita ejecutar este código una y otra vez porque simplemente puede insertarlo como una función.
Cómo crear su primera función definida por el usuario en Excel
Está bien, entonces mira. He dividido todo el proceso en tres pasos:
- Declare su procedimiento como una función
- Definir sus argumentos y su tipo de datos.
- Agregue código para calcular el valor deseado
Pero déjame darte:
Necesita crear una función que pueda devolver el nombre del día a partir de un valor de fecha. Bueno, tenemos una función que devuelve el número del día de la semana pero no el nombre. ¿Entiendes lo que te estoy diciendo? ¿Sí?
Entonces, sigamos los pasos a continuación para crear su primera función definida por el usuario:
- En primer lugar, abra su editor de Visual Basic usando la tecla de acceso directo ALT + F11 o vaya a la pestaña Desarrollador y simplemente haga clic en el botón «Visual Basic».
- Lo siguiente es insertar un módulo, así que haga clic derecho en la ventana del proyecto VBA, luego vaya a insertar y luego haga clic en «Módulo». (ALERTA: Debe ingresar una FUNCIÓN DEFINIDA POR EL USUARIO solo en los módulos estándar. Tanto el módulo Sheet como el ThisWorkbook son un tipo especial de módulo y si ingresa una UDF en estos dos módulos, Excel no reconoce que está creando una UDF) .
- Lo tercero es definir un nombre para la función y aquí estoy usando “myDayName”. Entonces necesitas escribir “Función mydayName”. ¿Por qué Función antes que Nombre? Cuando crea una función de VBA, el uso de la palabra «Función» le indica a Excel que trate este código como una función (asegúrese de leer el alcance de una UDF antes en el mensaje).
- Después de eso necesitas definir argumentos para tu función. Así que inserte paréntesis iniciales y escriba «InputDate As Date». Aquí, InputDate es el nombre del argumento y la fecha es su tipo de datos. Siempre es mejor definir un tipo de datos para el argumento.
- Ahora cierra el paréntesis y escribe “As String”. Aquí defines el tipo de datos del resultado que devuelve la función y como quieres el nombre del día que es un texto, entonces su tipo de datos debe ser “String”. Si desea que el resultado sea algo distinto de una cadena, asegúrese de configurar su tipo de datos en consecuencia. (myDayName (InputDate como fecha) como función de cadena).
- Al final, presione ENTER. En este punto, el nombre de su función, su argumento, el tipo de datos del argumento y el tipo de datos de la función están configurados y tiene algo como lo siguiente en su módulo:
- Ahora, en «Función» y «Función final», debe definir el cálculo o puede decir el funcionamiento de esta UDF. En Excel hay una función de hoja de cálculo llamada «Texto» y estamos usando la misma aquí. Y para esto tienes que escribir el código a continuación y con este código defines el valor que debe devolver la función. myDayName = WorksheetFunction.Text(InputDate, “dddddd”)
- Ahora cierre su editor VB y regrese a la hoja de trabajo y en la celda B2 ingrese “=myDayName(A2)” presione Enter y tendrá el nombre del día.
¡Felicidades! Acaba de crear su primera función definida por el usuario. Este es el momento de la verdadera alegría. ¿No es así? Escriba «Alegría» en la sección de comentarios.
Cómo funciona esta función y valor de retorno en una celda
Su primera función personalizada está aquí, pero el punto es que necesita comprender cómo funciona. Si digo en términos simples, es código VBA pero lo usaste como procedimiento de función. Dividámoslo en tres partes:
- Lo ingresa en una celda como una función y especifica el valor de entrada.
- Excel ejecuta el código detrás de la función y usa el valor al que hizo referencia.
- Tienes el resultado en la celda.
Pero es necesario comprender cómo funciona esta función desde adentro. Así que he dividido todo el proceso en tres partes diferentes donde puedes ver cómo funciona realmente el código que escribiste para la función.
Como ha especificado «InputDate» como argumento de la función y cuando ingresa la función en la celda y especifica una fecha, VBA toma ese valor de fecha y lo proporciona a la función de texto que utilizó en el código.
Y en el ejemplo que mencioné anteriormente, la fecha que tienes en la celda A1 es 01-ene-2019.
Después de eso, la función TEXTO convierte esta fecha en un día usando el código de formato “dddddd” que ya mencionó en el código de función. Y este día que devuelve la función TEXTO se asigna a «myDayName».
Entonces, si el resultado de la función TEXTO es martes, este valor se asignará a “myDayName”.
Y aquí termina el funcionamiento de la función. «myDayName» es el nombre de la función, por lo que cualquier valor asignado a «myDayName» será el valor del resultado y la función que insertó en la hoja de trabajo lo devolverá en la celda.
Cuando escribe código para una función personalizada, debe asegurarse de que el valor devuelto por ese código esté asignado al nombre de la función.
Cómo mejorar una UDF para siempre
Bueno, ya sabes cómo crear una función VBA personalizada.
AHORA…
Hay una cosa que debe asegurarse de que el código que utilizó para funcionar sea lo suficientemente bueno para manejar todas las posibilidades. Si estás hablando de la función que acabas de escribir arriba, puedes devolver el nombre del día a partir de una fecha.
Objetivo…
¿Qué pasa si el valor que especificaste no es una fecha? ¿Qué pasa si la celda a la que te refieres está vacía? Puede haber otras posibilidades, pero estoy seguro de que entiendes mi punto.
¿BIEN? Entonces, intentemos mejorar esta función personalizada que podría solucionar los problemas anteriores. BIEN. Primero, necesitas cambiar el tipo de datos del argumento y usar:
InputDate As Variant
Con esto, su función personalizada puede tomar cualquier tipo de datos como entrada. A continuación, necesitamos usar la declaración IF de VBA para verificar que InputDate cumpla con ciertas condiciones. La primera condición es si la celda está vacía o no. Y para esto, debes usar el siguiente código:
If InputDate = "" Then myDayName = ""
Esto hará que la función esté vacía si la celda a la que hizo referencia está vacía.
Un problema está resuelto, pasemos al siguiente. Además de una fecha, es posible que tengas un número o un mensaje de texto. Entonces, para esto también necesita crear una condición que verifique si el valor referenciado es una fecha real o no.
El código sería:
If IsDate(InputDate) = False Then myDateName = ""
Aquí estoy usando un espacio en blanco para ambas condiciones, de modo que si tiene muchos datos, pueda filtrar fácilmente los valores donde el valor de entrada no es válido. Entonces, después de agregar las condiciones anteriores, el código se vería así:
Function myDayName(InputDate As Variant) As String If InputDate = "" Then myDayName = "" Else If IsDate(InputDate) = False Then myDateName = "" Else myDayName = WorksheetFunction.Text(InputDate, "dddddd") End If End If End Function
Y así es como funciona ahora: estoy seguro de que aún puedes realizar cambios en esta función, pero estoy seguro de que entiendes claramente mi punto.
Cómo utilizar una función VBA personalizada
En este punto, ya sabes aproximadamente cómo crear una función VBA en Excel. Pero una vez que lo tienes, necesitas saber cómo usarlo. Y en esta parte de la publicación, compartiré contigo cómo y dónde puedes usarlo. Entonces, entremos.
1. Simplemente en una hoja de cálculo
¿Por qué estamos creando una función personalizada? Sencillo. Para usarlo en la hoja de cálculo. Simplemente puede ingresar una UDF en una hoja de cálculo usando el signo igual y el nombre del tipo de función, luego especificar sus argumentos.
También puede ingresar una función definida por el usuario desde la biblioteca de funciones. Vaya a la pestaña Fórmula ➜ Insertar función ➜ Definido por el usuario.
De esta lista puede elegir la UDF que desea insertar.
2. Utilizar otros subprocedimientos y funciones
También puede utilizar una función dentro de otras funciones o en un procedimiento «Sub». A continuación se muestra un código VBA en el que utilizó la función para obtener el nombre del día para la fecha actual.
Sub todayDay() MsgBox "Today is " & myDayName(Date) End Sub
Asegúrese de leer «Alcance de una UDF» más adelante en este artículo para obtener más información sobre el uso de una función en otros procedimientos.
3. Acceder a funciones desde otro libro de trabajo.
Si tiene una UDF en un libro de trabajo y desea usarla en otro libro de trabajo o en todos los libros de trabajo, puede hacerlo creando un complemento para él. Siga estos sencillos pasos:
- Primero, debe guardar el archivo (en el que tiene el código de función personalizado) como complemento.
- Para hacer esto, vaya a la pestaña Archivo ➜ Guardar como ➜ “Complementos de Excel (.xalm).
- Después de eso, haga doble clic en el complemento e instálelo.
Eso es todo. Ahora puede utilizar todas sus funciones de VBA en cualquier libro de trabajo.
Diferentes formas de crear una función VBA personalizada [nivel avanzado]
En este punto, ya sabes cómo crear una función personalizada en VBA. Pero la cuestión es que cuando usamos funciones integradas, vienen con diferentes tipos de argumentos.
Entonces, en esta sección de esta guía, aprenderá cómo crear una UDF con los diferentes tipos de argumentos.
- Sin ningún argumento
- Con un solo argumento
- Con varios argumentos
- Usando una matriz como argumento
… avanzando.
1. Sin argumentos
¿Recuerda funciones como AHORA y HOY en las que no necesita ingresar un argumento?
Sí. Puede crear una función definida por el usuario donde no necesita ingresar ningún argumento. Hagámoslo con un ejemplo:
Creemos una función personalizada que pueda devolver la ubicación del archivo actual. Y aquí está el código:
Function myPath() As String Dim myLocation As String Dim myName As String myLocation = ActiveWorkbook.FullName myName = ActiveWorkbook.Name If myLocation = myName Then myPath = "File is not saved yet." Else myPath = myLocation End If End Function
Esta función devuelve la ruta de la ubicación donde está almacenado el archivo actual y, si el libro no está almacenado en ningún lugar, mostrará un mensaje que dice «El archivo aún no se ha guardado».
Ahora, si prestas mucha atención al código de esta función, no necesitas definir un argumento (entre paréntesis). Acaba de definir el tipo de datos para el resultado de la función.
La regla básica para crear una función sin argumentos es un código en el que no es necesario escribir nada.
En pocas palabras, el valor que desea obtener de la función debe calcularse automáticamente.
Y en esta función tienes lo mismo.
Este ActiveWorkbook.FullName devuelve la ubicación del archivo y este ActiveWorkbook.Name devuelve el nombre. No tienes que introducir nada.
2. Con un solo argumento
Ya hemos cubierto esto aprendiendo cómo crear una función definida por el usuario. Pero profundicemos un poco más y creemos una función diferente. Esta es la función que creé hace unos meses para extraer la URL de un hipervínculo .
Function giveMeURL(rng As Range) As String On Error Resume Next giveMeURL = rng.Hyperlinks(1).Address End Function
Ahora en esta función solo tienes un argumento.
Cuando ingresa esto en una celda y luego especifica la celda donde tiene un hipervínculo, devolverá la URL del hipervínculo. Ahora bien, en esta función el trabajo principal lo realizan:
rng.Hyperlinks(1).Address
Pero el rng es lo que necesitas especificar. Diga «Fácil» en la sección de comentarios si le resulta fácil crear una UDF.
3. Con varios argumentos
Normalmente, la mayoría de las funciones integradas de Excel tienen varios argumentos. Por eso es esencial que aprendas a crear una función personalizada con múltiples argumentos.
Tomemos un ejemplo: desea eliminar letras particulares de una cadena de texto y desea conservar el resto de la parte.
Bueno, tienes funciones como DERECHA y LEN que vas a utilizar en esta función personalizada. Pero aquí no necesitamos eso. Todo lo que necesitamos es una función personalizada usando VBA.
Entonces, aquí está la función:
Function removeFirstC(rng As String, cnt As Long) As String removeFirstC = Right(rng, Len(rng) - cnt) End Functio
Bueno entonces mira:
En esta función tienes dos argumentos:
- rng: En este argumento, debes especificar la celda de la que deseas eliminar el primer carácter de un texto.
- cnt: Y en el argumento debe especificar la cantidad de caracteres que desea eliminar (si desea eliminar varios caracteres del texto).
Cuando lo ingresas en una celda, funciona como se muestra a continuación:
3.1 Crear una función definida por el usuario con argumentos opcionales y obligatorios
Si piensas en la función que acabamos de crear en el ejemplo anterior donde tienes dos argumentos diferentes, bueno, ambos son necesarios. Y, si omite alguno de estos, recibirá un error como este.
Ahora, si piensas lógicamente, la función que creamos es eliminar el primer carácter. Pero aquí debe especificar la cantidad de caracteres que desea eliminar. Entonces mi punto es que este argumento debería ser opcional y debería tomar uno como predeterminado.
¿Qué opinas?
Di «Sí» en la sección de comentarios si estás de acuerdo conmigo en esto.
Está bien, entonces mira. Para hacer que un argumento sea opcional, simplemente agregue «Opcional» antes. Así:
Pero lo importante es hacer que tu código funcione con o sin el valor de este argumento. Entonces nuestro nuevo código para la misma función se vería así: Ahora en el código, si ignoras especificar el segundo argumento.
4. Utilice Array como argumento
Hay algunas funciones integradas que pueden tomar argumentos de matriz y también puede crear su función VBA personalizada para hacer esto.
Hagamos esto con un ejemplo simple donde necesitas crear una función donde sumas los valores de un rango donde tienes números y texto. Aquí estamos.
Function addNumbers(CellRef As Range) Dim Cell As Range For Each Cell In CellRef If IsNumeric(Cell.Value) = True Then Result = Result + Cell.Value End If Next Cell addNumbers = Result End Function
En el código anterior de la función, utilizamos un rango de números enteros A1:A10 en lugar de un valor único o referencia de celda.
Usando el bucle FOR CADA, verificará cada celda en el rango y sumará el valor si la celda contiene un número.
El alcance de una función definida por el usuario
En términos simples, el alcance de una función significa si se puede llamar desde otros procedimientos o no. Una FDU puede tener dos tipos diferentes de alcances.
1. Audiencia
Puede hacer pública su función personalizada para poder llamarla en todas las hojas de trabajo del libro. Para hacer pública una función, simplemente use la palabra «Pública», como se muestra a continuación.
Pero una función es pública de forma predeterminada si no la hace privada. En todos los ejemplos que hemos cubierto, todos son públicos.
2. Privado
Cuando hace que una función sea privada, puede usarla en procedimientos en el mismo módulo.
Digamos que si tienes tu UDF en «Módulo1», solo puedes usarla en los procedimientos que tienes en «Módulo1». Y no aparecerá en la lista de funciones de la hoja de trabajo (cuando use el signo = e intente escribir el nombre), pero aún puede usarlo escribiendo su nombre y especificando argumentos.
Limitaciones de la función definida por el usuario [UDF]
Las UDF son muy útiles. Pero son limitados en determinadas situaciones. Aquí hay algunas cosas que quiero que tenga en cuenta y recuerde al crear una función personalizada en VBA.
- No puede editar, eliminar ni formatear celdas y rangos utilizando una función personalizada.
- Tampoco puede mover, cambiar el nombre, eliminar o agregar hojas de trabajo a un libro.
- Cambia el valor de otra celda.
- Tampoco puede cambiar las opciones del entorno.
¿Existe alguna diferencia entre una función incorporada y una función definida por el usuario?
Me alegra que hayas preguntado. Bueno, para responder a esa pregunta, quiero compartir algunos de los puntos que creo que son importantes para ti.
- Más lento que el integrado: si compara la velocidad de las funciones integradas y las funciones de VBA, encontrará que la primera es rápida. La razón detrás de esto es que las funciones integradas están escritas en C++ o FORTRAN.
- Dificultad para compartir archivos: a menudo compartimos archivos por correo electrónico y la nube. Si está utilizando alguna de las funciones personalizadas, debe compartir este archivo en formato «xlam» para que otra persona también pueda usar su función personalizada.
Pero como dije anteriormente en “Por qué debería crear una función de Excel personalizada”, hay situaciones específicas en las que puede optar por una función personalizada de VBA.
Conclusión
Crear una función definida por el usuario es simple. Todo lo que necesita hacer es usar «Función» antes del nombre para definirla como una función, agregar argumentos, establecer el tipo de datos de los argumentos y luego establecer el tipo de datos para el valor de retorno.
Al final, agregue código para calcular el valor que desea obtener de la función. Esta guía que compartí con ustedes hoy es la más fácil para aprender a crear una función personalizada en VBA y estoy seguro de que la encontró útil.
Pero ahora dime una cosa.
Las UDF son útiles, ¿qué opinas?
Por favor comparta sus puntos de vista conmigo en la sección de comentarios. Me encantaría saber de ti y no olvides compartir esta publicación con tus amigos, estoy seguro de que lo apreciarán.