Curso Excel VBA y Macros – Cap. 31 – Creando Funciones y UDF para usar en fórmulas
En este tutorial veremos cómo desarrollar funciones en VBA desde cero, tanto para usarse en procedimientos como en celdas de Excel. Cuando desarrollamos funciones que serán usadas en celdas, se les llama UDF o Funciones Definidas por el usuario (User Defined Functions).
Veremos la diferencia entre Procedimientos Sub y Procedimientos de tipo Función. En el capítulo anterior vimos cómo pasar argumentos (ByVal y ByRef) a un procedimiento, haciendo que funcionen similar a las funciones, solo que las funciones se usan para devolver valores únicos o de matriz.
Ver video Capítulo 31 Excel VBA & Macros
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Qué son las funciones
En VBA una función es un procedimiento que realiza cálculos y devuelve un valor. Las funciones pueden usarse en Procedimientos Sub (macros) o mandarlas llamar desde una celda, siempre y cuando la función no sea privada.
Diferencia entre Procedimientos Sub y Procedimientos de Función
Procedimientos Sub
- Pueden ser considerados macros.
- Pueden ser llamados desde otro procedimiento o desde un botón.
- Se pueden ejecutar con una combinación de celdas.
- Pueden recibir argumentos.
Funciones
- Pueden ser llamadas desde otros procedimientos.
- Devuelven valores únicos o matrices.
- Pueden llamar desde Formulario y devolver el resultado en un control de TextBox.
- Se pueden invocar desde celdas de una hoja, de la misma manera que llamamos a las funciones predefinidas en Excel, como SUMA, CONTAR.SI, BUSCARV, etc.
- Pueden usarse en una fórmula usada en Formato condicional.
Funciones personalizadas UDF (User Defined Function)
Una función personalizada, puede ser pública o privada. Si es pública la podemos invocar desde una celda en Excel, pero si es privada, solo podrá ser llamada desde procedimientos.
Estas funciones las podremos encontrar en el cuadro de diálogo Insertar función, en la categoría Definidas por el usuario y podremos tener una interfaz gráfica para insertar los argumentos.
Cuando ingresamos el sigo de igual “=” en una celda, vamos a poder visualizar las UDF, siempre y cuando el archivo o add-in que las contenga esté abierto. Excel tiene más de 450 funciones, más las que desarrolles.
Una UDF nos permite optimizar cálculos para no repetir código.
Hay que considerar que las UDF son lentas con respecto a las funciones predefinidas en Excel y los archivos que las contengan deben estar habilitados para macros.
Sintaxis de la función
La sintaxis es muy similar a la que tenemos en los Procedimientos SUB
[Public | Private | Friend] [ Static ] Function name [ ( arglist ) ] [ As type ]
[ statements ]
[ name = expression ]
[ Exit Function ]
[ statements ]
[ name = expression ]
End Function
ELEMENTO | DESCRIPCIÓN |
Public | Indica que la función es pública. Disponible para todos los procedimientos y hojas de Excel del mismo archivo. |
Private | Indica que la función es privada. Solo está disponible en el módulo en el que es declarada. |
Friend | Usado en módulos de clase. Indica que el procedimiento de tipo Función es disponible a través del proyecto. |
Static | Indica que los valores de la variables locales declaradas en el procedimiento de tipo Función se conservan entre llamadas de procedimientos. |
name | Nombre de la función, respetando las reglas de nombres. |
arglist | Lista de parámetros que serán enviados como argumentos en la llamada a la función. |
type | Tipo de dato devuelto por la Funcion; puede ser Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (no es compatible actualmente), Date, String (excepto la longitud fija), Object, Variant o cualquier tipo definido por el usuario. |
statements | Instrucciones que se ejecutarán para realizar los cálculos. |
expresión | Devuelve el valor de la función. |
Sintaxis de los argumentos de la función
[ Opcional ] [ ByVal | ByRef ] [ ParamArray ] varname [()] [ As type ] [ = DefaultValue ]
Donde:
ELEMENTO | DESCRICIÓN |
Optional | Indica que el argumento a pasar es opcional. |
ByVal | El argumento se pasa por valor. El procedimiento accede a una copia de la variable por lo que el valor de la variable se mantiene intacto. |
ByRef | Es la manera predeterminada en la que se envían los argumentos. Indica que el argumento se pasa por referencia. El procedimiento puede acceder al valor de la variable y lo puede modificar. |
ParamArray | Se usa para enviar una matriz de valores. |
As type | Indica el tipo de valor que tendrá el parámetro. |
varname | Nombre del argumento. |
defaultvalue | Cualquier valor o constante. Es válido solo para argumentos opcionales. |
Código VBA de las funciones
La siguiente función se llama SumaDos y tiene dos parámetros numero1 y numer2. El valor devuelto por la función será la suma de ambos valores.
Function SumaDos(numero1 As Integer, numero2 As Integer) SumaDos = numero1 + numero2 End Function
Si usamos la función en celda ingresamos
=SumaDos(A1,A2)
La siguiente macro invocará a la función SumaDos.
Sub Macro() Dim num1 As Integer Dim num2 As Integer num1 = 10 num2 = 20 MsgBox SumaDos(num1, num2) End Sub
Ahora, la siguiente función se llama ExtraeNumero y nos ayudará a devolver los números que se encuentran en una cadena de texto o en una celda.
Function ExtraeNumeros(Texto As Variant) Dim Largo As Integer Dim i As Integer Dim Valor As String Dim Valor1 As String Application.Volatile Largo = VBA.Len(Texto) For i = 1 To Largo Valor = VBA.Mid(Texto, i, 1) If VBA.Asc(Valor) >= 48 And VBA.Asc(Valor) <= 57 Then Valor1 = Valor1 & Valor Else 'Nada End If Next i ExtraeNumeros = Valor1 End Function
En la siguiente macro mandamos llamar la función ExtraeNumero.
Sub LlamarFuncion() MsgBox ExtraeNumeros("ABC1523DEF34") End Sub
Si mandamos llamar la función en una celda usamos:
=ExtraeNumeros(A1)
Recomendado:
Descarga el archivo de ejemplo
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.