Este tutorial le enseñará a crear y usar funciones con y sin parámetros en VBA
VBA contiene una gran cantidad de funciones integradas para que las use, pero también puede escribir las suyas propias. Cuando escribe código en VBA, puede escribirlo en un subprocedimiento o en un procedimiento de función. Un procedimiento de función puede devolver un valor a su código. Esto es extremadamente útil si desea que VBA realice una tarea para devolver un resultado. Las funciones de VBA también se pueden llamar desde dentro de Excel, al igual que las funciones integradas de Excel de Excel.
Crear una función sin argumentos
Para crear una función, debe definir la función dándole un nombre. La función se puede definir como un tipo de datos que indica el tipo de datos que desea que devuelva la función.
Es posible que desee crear una función que devuelva un valor estático cada vez que se llama, un poco como una constante.
123 | Función GetValue () como enteroGetValue = 50Función final |
Si ejecutara la función, la función siempre devolvería el valor de 50.
También puede crear funciones que se refieran a objetos en VBA, pero debe usar la palabra clave Establecer para devolver el valor de la función.
123 | Función GetRange () como rangoEstablecer GetRange = Range ("A1: G4")Función final |
Si tuviera que usar la función anterior en su código VBA, la función siempre devolvería el rango de celdas A1 a G4 en cualquier hoja en la que esté trabajando.
Llamar a una función desde un subprocedimiento
Una vez que crea una función, puede llamarla desde cualquier otro lugar de su código utilizando un Sub Procedimiento para llamar a la función.
Siempre se devolvería el valor de 50.
También puede llamar a la función GetRange desde un Sub Procedimiento.
En el ejemplo anterior, el Subprocedimiento llama a la función GetRange para poner en negrita las celdas del objeto de rango.
Creando funciones
Argumento único
También puede asignar un parámetro o parámetros a su función. Estos parámetros pueden denominarse Argumentos.
123 | Función ConvertKilosToPounds (dblKilo as Double) como DoubleConvertKiloToPounds = dblKilo * 2.2Función final |
A continuación, podemos llamar a la función anterior desde un Subprocedimiento para calcular cuántas libras tiene una cantidad específica de kilos.
Una función puede ser llamada desde múltiples procedimientos dentro de su código VBA si es necesario. Esto es muy útil porque evita que tenga que escribir el mismo código una y otra vez. También le permite dividir procedimientos largos en pequeñas funciones manejables.
En el ejemplo anterior, tenemos 2 procedimientos: cada uno de ellos usa la Función para calcular el valor en libras de los kilos que se les pasan en el dblKilo Argumento de la función.
Múltiples argumentos
Puede crear una función con varios argumentos y pasar los valores a la función mediante un subprocedimiento.
123 | Función CalculateDayDiff (Date1 como Date, Date2 como Date) como DoubleCalculateDayDiff = Date2-Date1Función final |
Luego podemos llamar a la función para calcular la cantidad de días entre 2 fechas.
Argumentos opcionales
También puede pasar argumentos opcionales a una función. En otras palabras, a veces es posible que necesite el argumento y, a veces, es posible que no, dependiendo del código con el que esté utilizando la función.
123456 | Función CalculateDayDiff (Date1 como Date, Date2 opcional como Date) como Double'verifique la segunda fecha y si no está allí, haga que Date2 sea igual a la fecha de hoy.Si Date2 = 0 entonces Date2 = Date'calcular la diferenciaCalculateDayDiff = Fecha2-Fecha1Función final |
Valor de argumento predeterminado
También puede establecer el valor predeterminado de los argumentos opcionales cuando está creando la función, de modo que si el usuario omite el argumento, se utilizará en su lugar el valor que ha establecido como predeterminado.
1234 | Función CalculateDayDiff (Date1 como Date, Date2 opcional como Date = "06/02/2020") como Double'calcular la diferenciaCalculateDayDiff = Date2-Date1Función final |
ByVal y ByRef
Cuando pasa valores a una función, puede usar el ByVal o ByRef palabras clave. Si omite alguno de estos, el ByRef se utiliza por defecto.
ByVal significa que está pasando una copia de la variable a la función, mientras que ByRef significa que se refiere al valor original de la variable. Cuando pasa una copia de la variable (ByVal), el valor original de la variable es NO cambiado, pero cuando hace referencia a la variable, la función cambia el valor original de la variable.
1234 | Función GetValue (ByRef intA As Integer) As IntegerintA = intA * 4GetValue = intAFunción final |
En la función anterior, el ByRef podría omitirse y la función funcionaría de la misma manera.
1234 | Función GetValue (intA As Integer) As IntegerintA = intA * 4GetValue = intAFunción final |
Para llamar a esta función, podemos ejecutar un subprocedimiento.
123456789 | Sub TestValues ()Dim intVal como entero'rellenar la variable con el valor 10intVal = 10'ejecuta la función GetValue y muestra el valor en la ventana inmediataDebug.Print GetValue (intVal)'muestra el valor de la variable intVal en la ventana inmediataDebug.Print intValEnd Sub |
Tenga en cuenta que las ventanas de depuración muestran el valor 40 en ambas ocasiones. Cuando pasa la variable IntVal a la función, el valor de 10 se pasa a la función y se multiplica por 4. El uso de la palabra clave ByRef (u omitiéndola por completo) ENMENDARÁ el valor de la variable IntVal. Esto se muestra cuando muestra primero el resultado de la función en la ventana inmediata (40), y luego el valor de la variable IntVal en la ventana de depuración (también 40).
Si NO queremos cambiar el valor de la variable original, tenemos que usar ByVal en la función.
1234 | Función GetValue (ByVal intA As Integer) As IntegerintA = intA * 4GetValue = intAFunción final |
Ahora bien, si llamamos a la función desde un subprocedimiento, el valor de la variable IntVal permanecerá en 10.
Función de salida
Si crea una función que prueba una determinada condición, y una vez que se determina que la condición es verdadera, desea devolver el valor de la función, es posible que deba agregar una declaración de función de salida en su función para salir de la función antes ha ejecutado todo el código en esa función.
12345678910111213 | Función FindNumber (strSearch como cadena) como enteroDim i como entero'recorre cada letra de la cadenaPara i = 1 a Len (strSearch)'si la letra es numérica, devuelve el valor a la funciónSi IsNumeric (Mid (strSearch, i, 1)) EntoncesFindNumber = Mid (strSearch, i, 1)'luego salga de la funciónFunción de salidaTerminara sipróximoFindNumber = 0Función final |
La función anterior recorrerá la cadena que se proporciona hasta que encuentre un número y luego devolverá ese número de la cadena. Solo encontrará el primer número de la cadena, ya que luego lo hará. Salida la función.
La función anterior puede ser llamada por una rutina secundaria como la que se muestra a continuación.
1234567 | Sub CheckForNumber ()Dim NumIs como entero'pasar una cadena de texto a la función de número de búsquedaNumIs = FindNumber ("Piso superior, 8 Oak Lane, Texas")'muestra el resultado en la ventana inmediataDebug.Print NumIsEnd Sub |
Usar una función desde dentro de una hoja de Excel
Además de llamar a una función desde su código VBA mediante un subprocedimiento, también puede llamar a la función desde su hoja de Excel. Las funciones que ha creado deben aparecer de forma predeterminada en su lista de funciones en la sección Definida por el usuario de la lista de funciones.
Clickea en el fx para mostrar el cuadro de diálogo Insertar función.
Seleccione Usuario definido de la lista de categorías
Seleccione la función que necesita de las disponibles Funciones definidas por el usuario (UDF).
Alternativamente, cuando comience a escribir su función en Excel, la función debería aparecer en la lista desplegable de funciones.
Si no desea que la función esté disponible dentro de una hoja de Excel, debe poner la palabra Privada delante de la palabra Función cuando cree la función en su código VBA.
123 | Función privada CalculateDayDiff (Date1 como Date, Date2 como Date) como DoubleCalculateDayDiff = Fecha2-Fecha1Función final |
Ahora no aparecerá en la lista desplegable que muestra las funciones de Excel disponibles.
Curiosamente, sin embargo, aún puede usar la función, ¡simplemente no aparecerá en la lista cuando la busque!
Si ha declarado el segundo argumento como Opcional, puede omitirlo dentro de la hoja de Excel, así como dentro del código VBA.
También puede usar la función a que ha creado sin argumentos en su hoja de Excel.