Funciones VBA – Llamada, valor de retorno y parámetros

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on febrero 18, 2022

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.

 

Función definida por usuario sin parametros

 

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.

Prueba de funcion

Siempre se devolverá el valor 50. También puede llamar a la función obtenerRango desde un subprocedimiento.

Obtener rango

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.

Funcion con parametros

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.

Funcion con parametros doble llamada

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.

Funcion con varios parametros

 

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

 

Funcion con parametros opcionales

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

Funcion con valores por defecto

 

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

byVal byRef

 

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.

byVal byRef 2

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

 

Funcion de salida

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.

Print fx

Seleccione Definido por el usuario en la lista de categorías

Menu funciones definidas

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.

Acceso a funciones definidas desde excel

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.

Funciones definidas desde excel privada

Sin embargo, es interesante saber que puede seguir utilizando la función, sólo que no aparecerá en la lista cuando la busque

Funciones definidas desde excel privada 2

Si ha declarado el segundo argumento como Opcional, puede omitirlo tanto en la hoja de Excel como en el código VBA.

Funciones definidas desde excel privada3

También puede utilizar la función que ha creado sin argumentos en su hoja de Excel.

Funciones definidas desde excel 4

vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples