TL;DR — El
Roundde VBA no es elROUNDque usas en una celda. Redondea una mitad al dígito par más cercano (redondeo bancario), así queRound(2.5)es2yRound(3.5)es4—las mitades no siempre suben—. ElROUNDde la hoja redondea las mitades alejándose de cero (2.5→3). Cuando el total de una macro tiene que coincidir con la hoja, llama aApplication.WorksheetFunction.Rounden vez delRoundnativo.
Sub RoundingIsNotWhatYouThink()
Debug.Print Round(2.5) ' 2 - mitad al PAR, no 3
Debug.Print Round(3.5) ' 4 - mitad al PAR
Debug.Print Round(2.5, 0) ' 2 - misma regla con el argumento de digitos
Debug.Print Application.WorksheetFunction.Round(2.5, 0) ' 3 - coincide con =ROUND(2.5,0)
End Sub
Round, Mod y Rnd son tres herramientas matemáticas que
parecen primas de las de la hoja de cálculo pero se comportan distinto en silencio, porque VBA es un
lenguaje de programación de propósito general, no la hoja de cálculo. El redondeo es el que cuesta dinero:
equivócate en la regla y los totales de una macro se desvían un céntimo respecto a las celdas que todo el
mundo está leyendo.
Lo que aprenderás
- El modelo mental — la aritmética de VBA no es la de la hoja de cálculo, y
Roundlo demuestra - Qué es el redondeo bancario y por qué
Round(2.5)es2mientras la celda da3 - El error número uno — un total de macro que se desvía un céntimo del
=ROUND()de la hoja - Cómo igualar la hoja de cálculo exactamente con
Application.WorksheetFunction.Round - Por qué
IntyFixtruncan en lugar de redondear, y discrepan con los números negativos
El modelo mental: la aritmética de VBA no es la de la hoja de cálculo
Ya sabes cómo se comporta =ROUND(2.5, 0) en una celda —da 3—. Así que la primera vez que una macro
imprime 2, parece un error. No lo es. La función Round de VBA sigue una regla distinta y deliberada
llamada redondeo al par más cercano (redondeo bancario; formalmente, redondeo de la mitad al par):
cuando un número cae justo en la marca de la mitad, redondea al dígito par más cercano en lugar de
siempre hacia arriba.
Debug.Print Round(0.5) ' 0 (0 es par)
Debug.Print Round(1.5) ' 2 (2 es par)
Debug.Print Round(2.5) ' 2 (2 es par)
Debug.Print Round(3.5) ' 4 (4 es par)
Fíjate en que las mitades alternan hacia abajo, hacia arriba, hacia abajo, hacia arriba. Ese es todo el sentido de la regla: a lo largo de muchos valores, redondear las mitades siempre hacia arriba introduce un pequeño sesgo al alza, y redondear al par lo cancela. Es la elección estadísticamente más justa —que es exactamente por lo que un lenguaje diseñado para el cálculo general la adoptó, y por lo que la hoja de cálculo, hecha para la aritmética cotidiana, no lo hizo—.
Quédate con una frase y el resto del artículo se deriva de ella: el nombre de la función es el mismo, la
regla no. Todo lo que viene debajo es consecuencia de que Round redondea al par.
El error número uno: un total que se desvía un céntimo
Este es el fallo que manda a la gente a buscar. Una macro suma las líneas de una factura y redondea cada
una a dos decimales; el total general sale un céntimo por debajo de la columna =ROUND(...) que el equipo
de finanzas mantiene en la hoja, y ahora los dos números no cuadran:
' Redondea cada medio centimo al par - se aleja del =ROUND() de la hoja
lineTotal = lineTotal + Round(price * qty, 2)
Cada Round individual se desvía como mucho medio céntimo, pero a lo largo de cientos de valores de medio
céntimo el redondeo al par y el redondeo de la hoja alejándose de cero tiran en direcciones distintas, y
los céntimos se acumulan. Nada da error; los números simplemente no coinciden. Cuando tu resultado tiene
que coincidir con una celda, no uses el Round de VBA:
' Redondea igual que =ROUND() en la hoja - mitad alejandose de cero
lineTotal = lineTotal + Application.WorksheetFunction.Round(price * qty, 2)
Application.WorksheetFunction.Round (también puedes escribir Application.Round) es el ROUND de la
hoja, llamado desde VBA, así que redondea las mitades alejándose de cero y tu total cuadra hasta el
céntimo. La regla práctica es tajante: dinero y cualquier cifra que deba coincidir con la hoja →
WorksheetFunction.Round; deja el Round nativo para la estadística, donde redondear al par es justo lo
que quieres.
El redondeo no es truncar: Int y Fix
El redondeo decide hacia dónde va una fracción; a veces no quieres ninguna fracción, quieres cortarla de raíz. Eso es truncar, y VBA tiene dos funciones para ello —que, cómo no, discrepan entre sí con los números negativos—:
Debug.Print Int(2.7) ' 2 Fix(2.7) ' 2 - identicos para positivos
Debug.Print Int(-2.7) ' -3 Fix(-2.7) ' -2 - se separan en negativos
Int redondea hacia abajo, hacia el infinito negativo (un suelo de verdad), así que Int(-2.7) es -3.
Fix redondea hacia cero (simplemente descarta los decimales), así que Fix(-2.7) es -2. Para los
números positivos son iguales; en cuanto aparece un negativo, tienes que saber a cuál te referías. Ninguno
es Round —nunca miran la parte fraccionaria para decidir, simplemente la eliminan—.
Tampoco hay un RoundUp ni un RoundDown integrados en VBA. Cuando necesites «siempre hacia arriba» o
«siempre hacia abajo» a un número de decimales, recurre a las versiones de la hoja:
Application.WorksheetFunction.RoundUp(x, 2) y RoundDown(x, 2).
La nota al pie sobre el punto flotante
Bajo todo redondeo acecha una sorpresa más: los valores Double se almacenan en binario, y algunos
decimales de aspecto pulcro no se pueden representar de forma exacta. El ejemplo clásico es
Round(2.675, 2), que devuelve 2.67, no 2.68 —porque 2.675 en realidad se guarda como
2.67499999..., así que no es realmente una mitad—. Esto no es un fallo de Round; es la naturaleza del
punto flotante. Cuando importa la exactitud hasta el céntimo, trabaja con el tipo Currency o Decimal, o
redondea a través de WorksheetFunction.Round, que está hecho para suavizar estos huecos de
representación.
Cuándo el redondeo bancario es la elección correcta
Nada de esto significa que el Round de VBA esté roto —significa que apunta a otro trabajo—. Si estás
calculando una media, un resumen estadístico o cualquier cosa donde miles de mitades sesgarían el resultado
al alza, redondear al par es la elección correcta y la regla de la hoja de alejarse de cero es la sesgada.
Ahí usa el Round nativo a propósito. El error no es usar Round; es usarlo para dinero que tiene que
cuadrar con una hoja de cálculo, donde las dos reglas divergen en silencio.
Cómo te ayuda ExcelMaster
El redondeo es una decisión con tres bifurcaciones silenciosas —redondear al par frente a alejarse de cero
(Round nativo frente a WorksheetFunction.Round), redondear frente a truncar (Round frente a
Int/Fix, que a su vez discrepan con los negativos), y si el punto flotante está guardando siquiera una
mitad de verdad— y cada giro equivocado falla en silencio: un total desviado un céntimo, un negativo llevado
al suelo por el lado equivocado, un 2.675 que no quiere redondear hacia arriba.
ExcelMaster te deja decir lo que de
verdad quieres —«redondea cada línea a dos decimales para que el total coincida con la columna ROUND de la
hoja»— y elige WorksheetFunction.Round porque dijiste coincide con la hoja, usa Int o Fix a
propósito cuando quieres truncar, y señala la trampa del dinero en Double antes de que te cueste un
céntimo. Tú conservas el libro y el código.
Preguntas frecuentes
¿Por qué VBA Round(2.5) devuelve 2 en lugar de 3?
Porque el Round de VBA usa el redondeo bancario —redondeo de la mitad al par—. Cuando un valor está
justo en la mitad, va al dígito par más cercano, así que Round(2.5) es 2 (2 es par) y Round(3.5) es
4 (4 es par). El =ROUND(2.5,0) de la hoja usa una regla distinta, redondear la mitad alejándose de
cero, que da 3. Mismo nombre, distinta regla.
¿Cómo hago que VBA redondee igual que el ROUND de la hoja de cálculo?
Llama a la función de la hoja desde VBA: Application.WorksheetFunction.Round(x, 2) (o
Application.Round(x, 2)). Redondea las mitades alejándose de cero exactamente como =ROUND() en una
celda, así que los totales calculados en una macro cuadran con una columna ROUND de la hoja. Reserva el
Round nativo para los casos en que redondear al par es de verdad lo que quieres.
¿Cómo redondeo a 2 decimales en VBA?
Pasa el número de dígitos como segundo argumento: Round(value, 2) para el redondeo bancario, o
Application.WorksheetFunction.Round(value, 2) para coincidir con la hoja. Para redondear siempre hacia
arriba o hacia abajo a dos decimales, usa WorksheetFunction.RoundUp(value, 2) o RoundDown(value, 2)
—VBA no tiene un RoundUp ni un RoundDown nativos—.
¿Cuál es la diferencia entre Int y Fix en VBA?
Ambos eliminan la parte fraccionaria, pero discrepan con los negativos. Int lleva al suelo hacia el
infinito negativo, así que Int(-2.7) es -3. Fix trunca hacia cero, así que Fix(-2.7) es -2. Para
los números positivos son idénticos. Ninguno redondea —descartan los decimales en vez de mirarlos, a
diferencia de Round—.
¿Por qué Round(2.675, 2) da 2.67 y no 2.68?
Porque 2.675 no se puede almacenar de forma exacta como un Double —en realidad se guarda como
2.67499999..., así que no es una mitad real y redondea hacia abajo—. Esto es representación de punto
flotante, no un fallo de redondeo. Para el dinero, usa el tipo Currency o Decimal, o redondea a través
de Application.WorksheetFunction.Round.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 18/09/2026.
Guías relacionadas: VBA Mod · VBA Rnd · VBA Format · VBA Number Format · VBA WorksheetFunction
