🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Mod en Excel — el operador de resto, los negativos y la trampa del signo

|

VBA Mod en Excel — el operador de resto, los negativos y la trampa del signo

TL;DRMod te da el resto tras la división entera: 7 Mod 3 es 1. Es un operador, no una función, así que escribes a Mod b sin paréntesis. Dos cosas sorprenden a la gente: VBA redondea primero ambos operandos a números enteros (6.7 Mod 3 se comporta como 7 Mod 3), y el resultado toma el signo del dividendo —el número de la izquierda—, así que -7 Mod 3 es -1, no el 2 de la hoja.

Sub RemaindersAndTheSignTrap()
    Debug.Print 7 Mod 3      ' 1   - resto de 7 / 3
    Debug.Print 10 Mod 2     ' 0   - divide exacto, asi que "es 10 par?" -> True
    Debug.Print -7 Mod 3     ' -1  - el signo sigue al DIVIDENDO (-7), no al divisor
    Debug.Print 6.7 Mod 3    ' 1   - 6.7 se redondea a 7 primero, luego 7 Mod 3
End Sub

Mod, Round y Rnd son tres herramientas matemáticas que parecen primas de las de la hoja de cálculo pero se comportan distinto en silencio. Mod es la que la gente porta directamente de una fórmula de celda a una macro y luego no entiende por qué los negativos salieron mal.

Lo que aprenderás

  • El modelo mental — Mod es el resto tras la división entera, y es un operador
  • Por qué VBA redondea los operandos a números enteros antes de dividir
  • El error número uno — -7 Mod 3 es -1 en VBA pero 2 en la hoja, porque la regla del signo difiere
  • Los modismos de cada día — es-par, cada N filas, recorrer una lista en ciclo
  • Cómo forzar un resultado siempre positivo, y por qué x Mod 0 lanza un error de ejecución

El modelo mental: el resto tras la división entera

La división te da dos cosas —cuántas veces cabe un número dentro de otro, y qué sobra—. Mod te entrega lo que sobra. 17 Mod 5 es 2, porque 5 cabe en 17 tres veces y sobran 2. Esa es toda la idea, y es por lo que Mod aparece dondequiera que se repite un patrón: un resto de 0 significa «divide exacto», que es como compruebas si esto es par, si esta es la fila N, si hemos completado un grupo entero.

Dos propiedades hacen del Mod de VBA algo propio. Primero, es un operador, como + o *, no una función —escribes a Mod b, nunca Mod(a, b)—. Segundo, trabaja con números enteros: si le pasas decimales, VBA redondea cada operando a un entero antes de tomar el resto.

Debug.Print 6.7 Mod 3     ' 1   - 6.7 se redondea a 7, luego 7 Mod 3 = 1  (no 0.7)
Debug.Print 5.4 Mod 2     ' 1   - 5.4 se redondea a 5, luego 5 Mod 2 = 1

Si de verdad necesitas un resto fraccionario, Mod no te lo dará —calcúlalo tú mismo con a - Int(a / b) * b—. Pero nueve de cada diez veces Mod es justo lo que quieres, precisamente porque trabaja con recuentos enteros.

El error número uno: los negativos cambian de signo

Este es el que llena los foros. Tienes una fórmula que funciona en la hoja, pegas la misma aritmética en VBA, y los negativos salen con el signo equivocado:

Debug.Print -7 Mod 3      ' VBA:            -1
' =MOD(-7, 3) en la hoja da:                2

Ambos son «correctos» —siguen reglas distintas y documentadas—. El Mod de VBA toma el signo del dividendo (el operando de la izquierda): -7 Mod 3 es -1, 7 Mod -3 es 1. El MOD de la hoja toma el signo del divisor: MOD(-7, 3) es 2. Así que una fórmula en la que confiabas en una celda puede producir en silencio un número distinto en cuanto la mueves a una macro, y nada te avisa.

Si lo que de verdad quieres es un resultado que nunca sea negativo —el caso habitual cuando estás dando la vuelta a un índice sobre una lista—, no pelees contra la regla del signo, neutralízala:

' Siempre cae en 0 .. b-1, sea cual sea el signo de a
result = ((a Mod b) + b) Mod b
Debug.Print ((-7 Mod 3) + 3) Mod 3     ' 2   - la respuesta de la hoja, a proposito

La lección no es «VBA está mal». Es: cuando pueden aparecer negativos, decide el signo que quieres y constrúyelo —no supongas que el Mod de VBA coincide con la celda de la que copiaste—.

Los modismos que vale la pena memorizar

La mayoría de los usos reales de Mod son uno de un puñado de patrones. Apréndete estos y los reconocerás en todas partes:

If n Mod 2 = 0 Then ...              ' n es par?  (impar = 1)
If i Mod 3 = 0 Then ...              ' cada 3er elemento (bandas de filas, lotes)
colour = palette(i Mod paletteCount) ' recorre en ciclo una lista fija, dando la vuelta

El caso de las bandas de filas es donde Mod se gana el pan dentro de un bucle: sombrear cada tercera fila, insertar un separador cada diez registros, alternar un color con i Mod 2. Cada uno es solo «¿el resto es cero?» —el mismo test con distinta ropa—.

El límite que da error: dividir por cero

Un caso no falla en silencio —detiene la macro—. x Mod 0 lanza el error de ejecución 11, «Division by zero», exactamente igual que haría x / 0, porque el resto no está definido cuando no hay nada por lo que dividir. Si el divisor puede ser cero (un recuento que podría estar vacío, un paso proporcionado por el usuario), protégelo primero:

If groupSize > 0 Then
    If i Mod groupSize = 0 Then InsertSeparator i
End If

Un límite emparentado es el tamaño: Mod trabaja dentro de los tipos enteros de VBA, así que operandos enormes declarados como Integer o Long pueden desbordarse. Si trabajas con valores por encima de unos dos mil millones, decláralos como LongLong (VBA de 64 bits) o Double y deja que VBA redondee a un número entero.

Cómo te ayuda ExcelMaster

Mod parece el operador más simple de VBA, y esconde tres trampas que fallan todas sin avisar: un dividendo negativo invierte el signo respecto a la hoja de la que copiaste la fórmula, un operando decimal se redondea en silencio antes de la división, y un divisor que se cuela a cero detiene la macro entera con el error 11.

ExcelMaster te deja describir el patrón —«inserta un subtotal cada 12 filas» o «marca las facturas de número impar»— y escribe el test del resto de la forma correcta: lo envuelve con ((a Mod b) + b) Mod b cuando necesitas un resultado no negativo, mantiene los operandos enteros a propósito, y protege el divisor para que un grupo vacío nunca haga fallar la ejecución. Tú conservas el libro y el código.

Preguntas frecuentes

¿Por qué -7 Mod 3 da -1 en VBA pero 2 en la hoja de cálculo?

Porque los dos usan reglas de signo distintas. El operador Mod de VBA toma el signo del dividendo (el operando de la izquierda), así que -7 Mod 3 es -1. La función MOD de la hoja toma el signo del divisor, así que MOD(-7, 3) es 2. Para obtener en VBA la respuesta siempre positiva de la hoja, escribe ((a Mod b) + b) Mod b.

¿Mod es una función o un operador en VBA?

Es un operador, como + o *. Escribes a Mod b, no Mod(a, b) —no hay paréntesis ni coma—. Se coloca dentro de una expresión y devuelve el resto de la división entera de a entre b.

¿Funciona VBA Mod con decimales?

No directamente —VBA redondea ambos operandos a números enteros antes de tomar el resto, así que 6.7 Mod 3 se comporta como 7 Mod 3 y devuelve 1—. Si necesitas un resto fraccionario de verdad, calcúlalo tú mismo con a - Int(a / b) * b.

¿Cómo compruebo si un número es par o impar en VBA?

Usa el resto contra 2: If n Mod 2 = 0 es verdadero para los números pares y falso (resto 1) para los impares. El mismo patrón, i Mod k = 0, comprueba «cada k-ésimo» para cualquier k —cada tercera fila, cada diez registros, y así sucesivamente—.

¿Qué pasa si uso Mod con cero?

x Mod 0 lanza el error de ejecución 11, «Division by zero», porque el resto no está definido sin divisor. Si el divisor podría ser cero —un recuento vacío o un paso proporcionado por el usuario—, compruébalo con If divisor > 0 Then antes de usar Mod.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 18/09/2026.

Guías relacionadas: VBA Round · VBA Rnd · VBA For Loop · VBA If Then Else · VBA WorksheetFunction