Funciones VBA – Llamada, valor de retorno y parámetros
In this Article
Este tutorial le enseñará a crear y utilizar funciones con y sin parámetros en VBA
VBA contiene una gran cantidad de funciones incorporadas disponibles para ti, pero también puedes escribir las tuyas propias. Cuando escribes código en VBA, puedes escribirlo en un subprocedimiento o en una función definida por el usuario. Una Función es capaz de devolver un valor a su código. Esto es extremadamente útil si quiere que VBA realice una tarea para devolver un resultado. Las funciones VBA también pueden ser llamadas desde dentro de Excel, al igual que las funciones incorporadas de Excel.
Creando una Función sin Argumentos
Para crear una función es necesario definir la función dándole un nombre. A continuación, la función puede definirse como un tipo de datos, indicando el tipo de datos que desea que la función devuelva.
Es posible que quieras crear una función que devuelva un valor estático cada vez que sea llamada – algo así como una constante.
Function obtenerValor() As Integer
obtenerValor= 50
End Function
Si se ejecuta la función, la función siempre devolverá el valor de 50.
También puedes crear funciones que se refieran a objetos en VBA pero necesitas usar la palabra clave Set para devolver el valor de la función.
Function obtenerRango() as Range
Set obtenerRango = Range("A1:G4")
End Function
Si utilizas la función anterior en tu código VBA, la función siempre devolverá el rango de celdas A1 a G4 en cualquier hoja en la que estés trabajando.
Llamada a una función desde un subprocedimiento
Una vez que creas una función, puedes llamarla desde cualquier otra parte de tu código utilizando un Sub Procedimiento para llamar a la función.
Siempre se devolverá el valor 50. También puede llamar a la función obtenerRango desde un subprocedimiento.
En el ejemplo anterior, la función obtenerRango es llamada por el subprocedimiento para colocar en negrillas las celdas del objeto rng.
Creando Funciones
Argumento Único
También puede asignar un parámetro o parámetros a su función. Estos parámetros pueden ser referidos como Argumentos.
Function ConvertirKilosALibras(dblKilo as Double) as Double
ConvertirKilosALibras = dblKilo*2.2
End Function
Podemos entonces llamar a la función anterior desde un subprocedimiento para calcular cuántas libras son 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 los procedimientos largos en pequeñas funciones manejables.
En el ejemplo anterior, tenemos 2 procedimientos – cada uno de ellos está usando la Función para calcular el valor de los kilos que se les pasa en el Argumento dblKilo de la función.
Argumentos múltiples
Puede crear una Función con múltiples argumentos y pasar los valores a la Función por medio de un Sub Procedimiento.
Function calcularDias(Date1 as Date, Date2 as Date) as Double
calcularDias = Date2-Date1
End Function
Podemos entonces 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 puedes necesitar el argumento, y a veces no – dependiendo del código con el que estés usando la Función.
Function calcularDias(Date1 as Date, Optional Date2 as Date) as Double
'chequea si existe la segunda fecha y si no existe, le asigna la fecha actual a la variable Date2.
If Date2=0 then Date2 = Date
'calcula los dias
calcularDias= Date2-Date1
End Function
Valor por defecto de los argumentos
También puede establecer el valor por defecto de los argumentos Opcionales cuando esté creando la función, de forma que si el usuario omite el argumento, se utilizará en su lugar el valor que haya puesto por defecto.
Function calcularDias2(Date1 as Date, Optional Date2 as Date="06/02/2020") as Double
'Calcular días
calcularDias2 = Date2-Date1
End Function
ByVal y ByRef
Cuando se pasan valores a una función, se pueden utilizar las palabras clave ByVal o ByRef. Si omite cualquiera de ellas, se utiliza ByRef por defecto.
ByVal significa que se pasa una copia de la variable a la función, mientras que ByRef significa que se hace referencia al valor original de la variable. Cuando se pasa una copia de la variable(ByVal), el valor original de la variable NO cambia, pero cuando se hace referencia a la variable, el valor original de la variable es cambiado por la función.
Function obtenerValor(ByRef intA As Integer) As Integer
intA = intA * 4
obtenerValor= intA
End Function
En la función anterior, el ByRef podría omitirse y la función funcionaría de la misma manera.
Function obtenerValor(intA As Integer) As Integer
intA = intA * 4
obtenerValor = intA
End Function
Para llamar a esta función, podemos ejecutar un subprocedimiento.
Sub probarValores()
Dim intVal As Integer
'Asignar el valor 10 a la variable
intVal = 10
'correr la función obtenerValor, y mostrar el valor en la ventana inmediato
Debug.Print obtenerValor(intVal)
'mostrar el valor de la variable intVal en la ventana inmediato
Debug.Print intVal
End Sub
Observe 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. Usando la palabra clave ByRef (u omitiéndola por completo), modificará el valor de la variable IntVal. Esto se muestra cuando se 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, debemos utilizar ByVal en la función.
Function obtenerValor(ByVal intA As Integer) As Integer
intA = intA * 4
obtenerValor = intA
End Function
Ahora si llamamos a la función desde un subprocedimiento, el valor de la variable IntVal seguirá siendo 10.
Función de salida
Si creas una función que comprueba una determinada condición, y una vez que la condición es verdadera, quieres devolver el valor de la función, puede que necesites añadir una sentencia Exit Function en tu función para salir de la función antes de haber ejecutado todo el código de esa función.
Function encontrarNumero(strSearch As String) As Integer
Dim i As Integer
'Bucle a través de cada letra en la cadena de texto
For i = 1 To Len(strSearch)
'si el caracter es númerico, retorna el valor a la función
If isNumeric(Mid(strSearch, i, 1)) Then
encontrarNumero = Mid(strSearch, i, 1)
'entonces sale de la función
Exit Function
End If
Next
encontrarNumero = 0
End Function
La función anterior recorrerá la cadena proporcionada hasta encontrar un número, y luego devolverá ese número de la cadena. Sólo encontrará el primer número de la cadena, ya que entonces saldrá de la función.
La función de arriba puede ser llamada por una sub-rutina como la de abajo.
Sub comprobarNumero()
Dim NumIs as Integer
'Pasar una cadena de texto a la función encontrarNumero
NumIs = encontrarNumero("Upper Floor, 8 Oak Lane, Texas")
'Muestra el resultado en la ventana inmediato
Debug.Print NumIs
End Sub
Usando una Función desde una Hoja de Excel
Además de llamar a una función desde su código VBA utilizando un subprocedimiento, también puede llamar a la función desde dentro de su hoja de Excel. Las funciones que ha creado deberían aparecer por defecto en su lista de funciones en la sección Definida por el usuario de la lista de funciones. Haga clic en el botón fx para mostrar el cuadro de diálogo Insertar función.
Seleccione Definido por el usuario en la lista de categorías
Seleccione la función que necesita de las funciones definidas por el usuario (UDF) disponibles.
Alternativamente, cuando empiece a escribir su función en Excel, la función debería aparecer en la lista desplegable de funciones.
Si no quiere que la función esté disponible dentro de una hoja de Excel, debe poner la palabra Private delante de la palabra Function cuando cree la función en su código VBA.
Private Function calcularDias(Date1 as Date, Date2 as Date) as Double
calcularDias= Date2-Date1
End Function
Ahora no aparecerá en la lista desplegable que muestra las funciones de Excel disponibles.
Sin embargo, es interesante saber que puede seguir utilizando la función, sólo que no aparecerá en la lista cuando la busque
Si ha declarado el segundo argumento como Opcional, puede omitirlo tanto en la hoja de Excel como en el código VBA.
También puede utilizar la función que ha creado sin argumentos en su hoja de Excel.