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

VBA Round en Excel — redondeo bancario y por qué difiere de la hoja de cálculo

|

VBA Round en Excel — redondeo bancario y por qué difiere de la hoja de cálculo

TL;DR — El Round de VBA no es el ROUND que usas en una celda. Redondea una mitad al dígito par más cercano (redondeo bancario), así que Round(2.5) es 2 y Round(3.5) es 4 —las mitades no siempre suben—. El ROUND de la hoja redondea las mitades alejándose de cero (2.53). Cuando el total de una macro tiene que coincidir con la hoja, llama a Application.WorksheetFunction.Round en vez del Round nativo.

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 Round lo demuestra
  • Qué es el redondeo bancario y por qué Round(2.5) es 2 mientras la celda da 3
  • 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é Int y Fix truncan 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