Una función personalizada (UDF) en VBA es una función que tú escribes y que puedes usar directamente en las celdas de Excel, igual que SUMA o PROMEDIO.
Con las UDF puedes resolver cálculos específicos de tu empresa que las funciones nativas de Excel no cubren. Por ejemplo: calcular el ISR de un salario mensual o las deducciones del IMSS según las tablas vigentes en México.
Estructura de una UDF en VBA
Una UDF se declara con la palabra clave Function en lugar de Sub. La diferencia clave: Function devuelve un valor; Sub no devuelve nada.
Plantilla básica:
Function NombreFuncion(parametro1 As TipoDato, parametro2 As TipoDato) As TipoRetorno
' Lógica del cálculo
NombreFuncion = resultado
End Function
Reglas obligatorias:
- El nombre de la función no puede tener espacios.
- Debes asignar el resultado al nombre de la función antes de
End Function. - Declarar el tipo de dato de retorno (
As Double,As String, etc.) es una buena práctica. - Las UDF van en un módulo estándar, no en el módulo de una hoja ni en
ThisWorkbook.
Ejemplo 1: Función simple de bono por ventas
Supón que en Liverpool se paga un bono del 8% sobre ventas si el monto supera $50,000. Si no supera ese umbral, el bono es del 3%.
Function CalcularBono(ventas As Double) As Double
If ventas > 50000 Then
CalcularBono = ventas * 0.08
Else
CalcularBono = ventas * 0.03
End If
End Function
Uso en celda:
=CalcularBono(B2)
Si la celda B2 contiene $72,000, la función devuelve $5,760.
Si contiene $40,000, devuelve $1,200.
Esta función ya es reutilizable en cualquier celda del libro.
Ejemplo 2: Cálculo de cuota IMSS del trabajador
En México, el trabajador paga una cuota al IMSS sobre su salario base. Una de las cuotas más comunes es la de Enfermedades y Maternidad, que equivale al 0.375% sobre el salario mensual (para rangos de salario moderado, según las tablas del IMSS vigentes).
La siguiente UDF calcula la deducción total estimada del trabajador al IMSS, sumando las tres cuotas obrero más frecuentes:
- Enfermedades y Maternidad: 0.375%
- Invalidez y Vida: 0.625%
- Retiro (AFORE cuota obrero): 1.125%
Total aproximado: 2.125% del salario mensual.
Function DeduccionIMSS(salarioMensual As Double) As Double
Dim tasaObrero As Double
tasaObrero = 0.02125
DeduccionIMSS = salarioMensual * tasaObrero
End Function
Uso en celda:
=DeduccionIMSS(C2)
Si el salario en C2 es $18,500, la función devuelve $393.12 aproximadamente.
Nota: Las tasas del IMSS cambian periódicamente. Siempre verifica las tablas oficiales del IMSS y el DOF antes de implementar esta lógica en producción.
Ejemplo 3: Cálculo simplificado de ISR mensual
Este es el ejemplo más completo. El SAT publica tablas de ISR mensual con rangos de ingreso, cuota fija y tasa marginal. La siguiente UDF implementa una versión simplificada con tres rangos representativos para ilustrar la lógica.
Tabla simplificada (valores ilustrativos, no oficiales):
| Límite inferior | Límite superior | Cuota fija | Tasa marginal |
|---|---|---|---|
| $0.01 | $8,000 | $0 | 1.92% |
| $8,000.01 | $20,000 | $153.60 | 6.40% |
| $20,000.01 | $40,000 | $921.60 | 10.88% |
Function CalcularISR(salarioBruto As Double) As Double
Dim cuotaFija As Double
Dim tasaMarginal As Double
Dim limiteInferior As Double
Dim isr As Double
If salarioBruto <= 8000 Then
limiteInferior = 0
cuotaFija = 0
tasaMarginal = 0.0192
ElseIf salarioBruto <= 20000 Then
limiteInferior = 8000
cuotaFija = 153.6
tasaMarginal = 0.064
ElseIf salarioBruto <= 40000 Then
limiteInferior = 20000
cuotaFija = 921.6
tasaMarginal = 0.1088
Else
limiteInferior = 40000
cuotaFija = 3097.6
tasaMarginal = 0.16
End If
isr = cuotaFija + (salarioBruto - limiteInferior) * tasaMarginal
CalcularISR = isr
End Function
Uso en celda:
=CalcularISR(D2)
Si el salario bruto en D2 es $25,000:
- Límite inferior:
$20,000 - Cuota fija:
$921.60 - Excedente:
$5,000 × 10.88% = $544 - ISR total:
$1,465.60
Esta UDF la puedes combinar con DeduccionIMSS para calcular el salario neto directamente en Excel:
=D2 - CalcularISR(D2) - DeduccionIMSS(D2)
Si D2 = $25,000, el resultado sería aproximadamente $23,002.
Cómo insertar una UDF en el Editor de VBA
- Abre Excel y presiona
Alt + F11para abrir el Editor de VBA. - En el menú, ve a Insertar → Módulo. Esto crea un módulo estándar.
- Escribe tu función dentro del módulo.
- Cierra el editor con
Alt + F4o simplemente regresa a Excel. - En cualquier celda, escribe
=NombreDeTuFuncion(...)y Excel la reconoce automáticamente.
Importante: El archivo debe guardarse como .xlsm (libro habilitado para macros). Si lo guardas como .xlsx, las UDF se eliminan.
Errores comunes al crear UDF
Error 1: Escribir la UDF dentro del módulo de una hoja
Si colocas la función en Hoja1 (Código) en lugar de un módulo estándar, Excel no la reconoce como función de celda. Siempre usa Insertar → Módulo para crear un módulo estándar.
Error 2: No asignar el resultado al nombre de la función Este error silencioso hace que la función siempre devuelva cero o vacío.
' INCORRECTO
Function CalcularBono(ventas As Double) As Double
Dim resultado As Double
resultado = ventas * 0.08
' Falta: CalcularBono = resultado
End Function
' CORRECTO
Function CalcularBono(ventas As Double) As Double
CalcularBono = ventas * 0.08
End Function
Error 3: Intentar modificar celdas desde una UDF
Una UDF solo puede devolver un valor. No puede escribir en otras celdas, cambiar formatos ni ejecutar acciones secundarias. Si necesitas hacer eso, usa una Sub, no una Function.
' ESTO CAUSA ERROR EN TIEMPO DE EJECUCIÓN
Function MiFuncion(valor As Double) As Double
Range("B1").Value = valor * 2 ' Prohibido en una UDF
MiFuncion = valor
End Function
Error 4: Usar nombres de función que coinciden con funciones nativas de Excel
Si nombras tu función SUMA, MAX o PROMEDIO, Excel puede ignorar tu versión o generar conflictos. Usa prefijos descriptivos como FEMSA_ISR, BIMBO_Bono o simplemente nombres únicos.
Comparación: Function vs Sub
| Característica | Function (UDF) |
Sub (Macro) |
|---|---|---|
| Devuelve un valor | Sí | No |
| Usable en celdas de Excel | Sí | No |
| Puede modificar celdas | No | Sí |
Se ejecuta con Alt + F8 |
No | Sí |
Se invoca con =Nombre() |
Sí | No |
Buenas prácticas para UDF en contexto empresarial
Documenta cada función con un comentario inicial. Incluye el propósito, los parámetros esperados y la fuente de las tasas o reglas que usas (por ejemplo: "Tasas IMSS 2024, DOF 28-dic-2023").
Valida los parámetros de entrada. Si el salario es negativo o cero, la función debe devolver cero o un mensaje de error, no un resultado sin sentido.
Function DeduccionIMSS(salarioMensual As Double) As Double
If salarioMensual <= 0 Then
DeduccionIMSS = 0
Exit Function
End If
DeduccionIMSS = salarioMensual * 0.02125
End Function
Centraliza tus UDF en un módulo dedicado. Nómbralo modFunciones o modUDF para que cualquier colega pueda encontrarlas fácilmente en proyectos de Bimbo, FEMSA o cualquier empresa grande con múltiples hojas.