certmundo.
es‑mx

7 min de lectura

¿Cómo crear funciones personalizadas (UDF) en VBA?

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

  1. Abre Excel y presiona Alt + F11 para abrir el Editor de VBA.
  2. En el menú, ve a Insertar → Módulo. Esto crea un módulo estándar.
  3. Escribe tu función dentro del módulo.
  4. Cierra el editor con Alt + F4 o simplemente regresa a Excel.
  5. 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 No
Usable en celdas de Excel No
Puede modificar celdas No
Se ejecuta con Alt + F8 No
Se invoca con =Nombre() 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.


Puntos clave

Puntos clave

  • Declara tus funciones personalizadas con `Function ... End Function` en un módulo estándar; así Excel las reconoce como funciones de celda.
  • Siempre asigna el resultado al nombre de la función (`CalcularISR = isr`) antes de `End Function`; si omites este paso, la función devuelve cero sin avisar.
  • Una UDF solo puede devolver un valor: no puede escribir en otras celdas ni cambiar formatos. Para esas acciones usa una `Sub`.
  • Guarda el archivo como `.xlsm` (libro habilitado para macros); si lo guardas como `.xlsx`, todas tus UDF se perderán.
  • Valida siempre los parámetros de entrada con `If` al inicio de la función para evitar cálculos incorrectos cuando una celda está vacía o contiene un valor negativo.

Comparte esta lección: