10/01/2020
En el mundo de la programación con Visual Basic for Applications (VBA), la manipulación de números es una tarea cotidiana. Sin embargo, a menudo nos encontramos con una pregunta clave: ¿cómo podemos redondear números de manera precisa y controlada? Específicamente, ¿existe una función nativa como Floor para redondear siempre hacia abajo? La respuesta corta es no, VBA no tiene una función `Floor` incorporada. Pero no te preocupes, esto no es un callejón sin salida. Gracias a la profunda integración de VBA con Excel, tenemos a nuestra disposición un arsenal de funciones de hoja de cálculo que podemos invocar directamente desde nuestro código, abriendo un mundo de posibilidades para el redondeo avanzado.

En este artículo, exploraremos a fondo no solo la función de redondeo estándar de VBA, sino que también nos sumergiremos en cómo utilizar las potentes funciones de la hoja de cálculo de Excel como `RoundUp`, `RoundDown`, `Ceiling.Math` y, por supuesto, `Floor.Math`, para tener un control absoluto sobre nuestros cálculos numéricos.
El Punto de Partida: La Función Nativa `Round` de VBA
Antes de llamar a los refuerzos de Excel, es fundamental conocer la herramienta que VBA nos ofrece de serie: la función `Round`. Su propósito es simple: redondear un número a una cantidad específica de decimales.
Sintaxis de `Round`
La estructura de la función es muy sencilla:
Round(Expresión, [Decimales])- Expresión: Es el número que deseamos redondear. Puede ser un número directo o una variable.
- Decimales (Opcional): Un número entero que indica a cuántos lugares decimales se debe redondear. Si se omite, el valor por defecto es 0, redondeando al entero más cercano.
Ejemplos Prácticos con `Round`
Veamos cómo funciona con un ejemplo simple, redondeando a un decimal:
Sub EjemploRound() MsgBox Round(7.25, 1) ' El resultado será 7.2 End SubNormalmente, trabajaremos con variables. Si almacenamos el valor en una variable de tipo `Double` (para permitir decimales), el código se vería así:
Sub RoundConVariable() Dim miNumero As Double miNumero = 7.25 MsgBox "El valor redondeado es " & Round(miNumero, 1) End SubTambién es posible aplicar esta función directamente sobre el valor de una celda:
Sub RoundCelda() ' Suponiendo que la celda A1 tiene un valor como 8.4567 Range("A1").Value = Round(Range("A1").Value, 2) ' El nuevo valor de la celda A1 será 8.46 End SubExpandiendo Horizontes: Usando las Funciones de Hoja de Cálculo de Excel
Aquí es donde la magia realmente sucede. VBA puede acceder a la mayoría de las funciones de hoja de cálculo de Excel a través del objeto `Application.WorksheetFunction`. Esto nos da acceso a herramientas de redondeo mucho más específicas que no existen de forma nativa en VBA.
VBA `RoundUp`: Redondeo Siempre Hacia Arriba
Si necesitas que un número siempre se redondee hacia arriba, alejándose del cero, `RoundUp` es tu función. VBA no la tiene, pero Excel sí.
Cómo usar `WorksheetFunction.RoundUp`
La sintaxis es similar a la de la hoja de cálculo. Para redondear un número hacia arriba a 4 decimales, haríamos lo siguiente:
Sub EjemploRoundUp() Dim miNumero As Double Dim numeroRedondeado As Double miNumero = 7.075711 numeroRedondeado = Application.WorksheetFunction.RoundUp(miNumero, 4) MsgBox "El valor redondeado hacia arriba es " & numeroRedondeado ' Resultado: 7.0758 End SubPara redondear al entero superior más cercano, simplemente usamos 0 como segundo argumento:
MsgBox Application.WorksheetFunction.RoundUp(7.1, 0) ' Resultado: 8VBA `RoundDown`: Redondeo Siempre Hacia Abajo
De forma análoga a `RoundUp`, la función `RoundDown` nos permite redondear siempre hacia abajo, acercándose al cero.
Cómo usar `WorksheetFunction.RoundDown`
El método es idéntico, solo cambiamos el nombre de la función.
Sub EjemploRoundDown() Dim miNumero As Double Dim numeroRedondeado As Double miNumero = 5.225193 numeroRedondeado = Application.WorksheetFunction.RoundDown(miNumero, 3) MsgBox "El valor redondeado hacia abajo es " & numeroRedondeado ' Resultado: 5.225 End SubY para redondear al entero inferior más cercano:
MsgBox Application.WorksheetFunction.RoundDown(7.8, 0) ' Resultado: 7La Solución a la Pregunta Inicial: `Floor.Math` en VBA
Llegamos al núcleo de la cuestión. La función `Floor.Math` es la herramienta de Excel que nos permite redondear un número hacia abajo al múltiplo de una cifra significativa especificada. Es mucho más potente que un simple `RoundDown`.
Sintaxis y Uso de `Floor.Math`
La sintaxis en Excel es `FLOOR.MATH(Número, [Cifra_significativa], [Modo])`. En VBA, la invocamos así:
Application.WorksheetFunction.Floor_Math(Number, [Significance], [Mode])- Number: El número a redondear.
- Significance (Opcional): El múltiplo al que se desea redondear. Si se omite, es 1.
- Mode (Opcional): Afecta a los números negativos. Si es un valor distinto de cero, los redondea alejándose del cero.
Ejemplo de `Floor.Math` en VBA
Supongamos que queremos redondear el número 4.55 hacia abajo al múltiplo de 2 más cercano.
Sub EjemploFloorMath() Dim miNumero As Double Dim resultadoFloor As Double miNumero = 4.5555 resultadoFloor = Application.WorksheetFunction.Floor_Math(miNumero, 2) MsgBox "El resultado de Floor.Math es " & resultadoFloor ' Resultado: 4 End SubEl código anterior redondea 4.5555 hacia abajo al múltiplo de 2 más cercano, que es 4. Si usáramos 3 como `Significance`, el resultado sería 3.
El Complemento Perfecto: `Ceiling.Math` en VBA
Así como existe `Floor` para redondear hacia abajo a un múltiplo, existe `Ceiling` para redondear hacia arriba al múltiplo deseado. Es el equivalente a `RoundUp` pero con la flexibilidad de los múltiplos.
Uso de `Ceiling.Math` en VBA
La sintaxis es prácticamente la misma que la de `Floor.Math`:
Application.WorksheetFunction.Ceiling_Math(Number, [Significance], [Mode])Ejemplo de `Ceiling.Math` en VBA
Si queremos redondear 4.1221 hacia arriba al múltiplo de 5 más cercano:
Sub EjemploCeilingMath() Dim miNumero As Double Dim resultadoCeiling As Double miNumero = 4.1221 resultadoCeiling = Application.WorksheetFunction.Ceiling_Math(miNumero, 5) MsgBox "El resultado de Ceiling.Math es " & resultadoCeiling ' Resultado: 5 End SubEn este caso, el múltiplo de 5 superior más cercano a 4.1221 es 5.
Tabla Comparativa de Funciones de Redondeo
Para visualizar mejor las diferencias, veamos una tabla comparativa con un número de ejemplo: 8.7654
| Función | Parámetros | Código VBA de Ejemplo | Resultado |
|---|---|---|---|
| Round | 2 decimales | Round(8.7654, 2) | 8.77 |
| RoundUp | 2 decimales | WorksheetFunction.RoundUp(8.7654, 2) | 8.77 |
| RoundDown | 2 decimales | WorksheetFunction.RoundDown(8.7654, 2) | 8.76 |
| Floor.Math | Significance = 0.5 | WorksheetFunction.Floor_Math(8.7654, 0.5) | 8.5 |
| Ceiling.Math | Significance = 0.5 | WorksheetFunction.Ceiling_Math(8.7654, 0.5) | 9.0 |
Preguntas Frecuentes (FAQ)
¿VBA tiene una función `Floor` nativa?
No, VBA no incluye una función `Floor` o `Ceiling` de forma nativa. Para utilizarlas, debes invocar las funciones de la hoja de cálculo de Excel mediante `Application.WorksheetFunction.Floor_Math` y `Application.WorksheetFunction.Ceiling_Math`.
¿Cuál es la diferencia entre `RoundDown` y `Floor.Math`?
La principal diferencia radica en su argumento. `RoundDown` redondea un número hacia abajo basándose en un número específico de posiciones decimales. En cambio, `Floor.Math` redondea un número hacia abajo basándose en el múltiplo de una cifra significativa que tú definas. Esto hace a `Floor.Math` mucho más flexible para escenarios como agrupar valores en rangos (por ejemplo, redondear al múltiplo de 5 más cercano).
¿Por qué debo usar `Application.WorksheetFunction`?
Este objeto actúa como un puente entre tu código VBA y la rica biblioteca de funciones incorporadas en Excel. Te permite usar funciones como `SUM`, `VLOOKUP`, `MATCH`, y por supuesto, las de redondeo avanzado, que no están disponibles directamente en el lenguaje VBA. Es una práctica esencial para cualquier desarrollador de macros en Excel que quiera ir más allá de lo básico.
¿Este método funciona en otras aplicaciones de Office como Word o Access?
Sí, es posible, pero requiere un paso adicional. Deberás establecer una referencia a la biblioteca de objetos de Excel en tu proyecto de VBA de Word o Access. Sin embargo, el uso más natural y común de estas funciones es dentro del propio entorno de VBA de Excel, donde la conexión ya está establecida por defecto.
Si quieres conocer otros artículos parecidos a Guía de Redondeo en VBA: Funciones Floor y Más puedes visitar la categoría Juegos.
