Does VBA have a floor math function?

Guía de Redondeo en VBA: Funciones Floor y Más

10/01/2020

Valoración: 3.98 (6299 votos)

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.

Does VBA have a floor math function?
The result is: VBA does not have a Floor.Math function equivalent either. However, once again, if you want to round a number down to the nearest integer or to the nearest specified multiple of significance, then you can call Excel’s Floor.Math worksheet function from VBA.

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.

Índice de Contenido

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 Sub

Normalmente, 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 Sub

Tambié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 Sub

Expandiendo 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 Sub

Para redondear al entero superior más cercano, simplemente usamos 0 como segundo argumento:

MsgBox Application.WorksheetFunction.RoundUp(7.1, 0) ' Resultado: 8

VBA `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 Sub

Y para redondear al entero inferior más cercano:

MsgBox Application.WorksheetFunction.RoundDown(7.8, 0) ' Resultado: 7

La 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 Sub

El 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 Sub

En 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ónParámetrosCódigo VBA de EjemploResultado
Round2 decimalesRound(8.7654, 2)8.77
RoundUp2 decimalesWorksheetFunction.RoundUp(8.7654, 2)8.77
RoundDown2 decimalesWorksheetFunction.RoundDown(8.7654, 2)8.76
Floor.MathSignificance = 0.5WorksheetFunction.Floor_Math(8.7654, 0.5)8.5
Ceiling.MathSignificance = 0.5WorksheetFunction.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.

Subir