Cómo redondear con VBA en Excel

El redondeo de números es muy común en las hojas de cálculo y en ocasiones necesitamos redondear en VBA al programar una función UDF para obtener algún cálculo específico. Para implementar el redondeo de números utilizaremos la función ROUND la cual revisaremos con detenimiento en esta ocasión.

No es lo mismo REDONDEAR que ROUND

Antes de iniciar debo decir que es desafortunado encontrar algunos artículos en Internet que hablan de cómo redondear con VBA y sin embargo hacen una mezcla de la función REDONDEAR de Excel con la función ROUND de VBA. Es muy importante que todo usuario de Excel sepa que las funciones VBA y las funciones de Excel son diferentes y aunque algunas de ellas hacen cosas muy similares, no significa que son lo mismo y lo voy a demostrar a continuación.

En la siguiente imagen puedes observar en la columna B el comportamiento de la función de Excel REDONDEAR sobre el conjunto de números de la columna A y en la columna C podrás observar los resultados devueltos por la función ROUND:

Cómo redondear con VBA en Excel

Pon especial atención al resultado devuelto en la fila 7 de la hoja. La función REDONDEAR hizo el redondeo del número hacia arriba mientras que la función ROUND lo hizo hacia abajo. Esta es una prueba evidente de que las funciones son totalmente diferentes.

Tal vez este malentendido se ve ayudado por el hecho de que, si tienes Excel en inglés, ambas funciones se llamarán ROUND y podrías pensar que, si tienen el mismo nombre, entonces son la misma función. Pero ya que tú estás en el camino para convertirte en un experto en Excel, deberás distinguir muy bien entre las funciones de Excel y las funciones VBA.

La función ROUND en VBA

La función ROUND en VBA devuelve un número redondeado a una cantidad especificada de dígitos y para ello cuenta con dos argumentos:

  • Number (Obligatorio): La expresión numérica que será redondeada.
  • NumDigitsAfterDecimal (Opcional): La cantidad de decimales a las que será redondeada la expresión numérica. Si se omite este parámetro, se devolverá un valor entero.

En la siguiente imagen puedes observar el comportamiento de la función ROUND con diferentes valores para su segundo argumento. Para la columna B he omitido por completo el segundo argumento pero en las columnas C y D he colocado los valores 1 y 2 respectivamente.

Redondear en VBA en Excel

Redondear al número par más cercano

Cuando hablamos de redondear números siempre tenemos alguna postura respecto a los números que terminan con el decimal 5, ya sea que necesitamos que el número sea redondeado hacia arriba o hacia abajo, pero la función ROUND no tiene ninguno de esos comportamientos.

La función ROUND implementa una lógica conocida como redondeo al número par más cercano es decir, si el último decimal es un 5, el redondeo se hará hacia el número par más cercano ya sea hacia arriba o hacia abajo. Para dejar en claro este comportamiento, en la siguiente imagen podrás observar el resultado de la función al redondear este tipo de números:

Redondear decimales en VBA

Todos los números de la columna A terminan con el decimal 5 y todos los números redondeados de la columna B terminan con un número par. Observa que el número 2.15 es redondeado hacia arriba, mientras que el número 2.25 es redondeado hacia abajo, lo cual comprueba que la función ROUND utiliza la lógica de redondeo al número par más cercano.

Es de vital importancia que recuerdes este comportamiento al utilizar la función ROUND ya que muchos usuarios piensan que están obteniendo resultados incorrectos aunque en realidad ese sea el comportamiento natural de la función.

Redondear hacia arriba en VBA

SI lo que necesitas es redondear el decimal 5 hacia arriba, tendrías la opción de crear tu propia función UDF, pero no hay necesidad de hacerlo ya que podemos utilizar la función REDONDEAR de Excel desde nuestro código VBA. Para hacer eso debemos utilizar la siguiente instrucción:

Application.WorksheetFunction.Round

Las funciones de Excel pueden ser accedidas desde VBA a través del objeto WorksheetFunction el cual contiene todas las funciones de la hoja de cálculo y la única condición es que tendremos que especificar su nombre en inglés. El siguiente código utiliza la función ROUND de VBA en la columna B y la función REDONDEAR (ROUND) de Excel en la columna C para redondear los números de la columna A:

Private Sub CommandButton1_Click()

For i = 2 To 10
    Cells(i, 2).Value = Round(Cells(i, 1).Value, 1)
    Cells(i, 3).Value = Application.WorksheetFunction.Round(Cells(i, 1).Value, 1)
Next i

End Sub

En la siguiente imagen puedes ver los resultados de este código y podrás notar que la columna C hace el redondeo hacia arriba.

Cómo redondear hacia arriba en VBA

Observa que los números de la columna C terminan en par o impar, ya que la función de Excel hará el redondeo del decimal 5 siempre hacia arriba mientras que la función de VBA lo hará hacia el número par más cercano.

Redondear hacia abajo en VBA

Si alguna vez necesitas hacer el redondeo del decimal 5 hacia abajo, entonces será necesario aplicar un truco a la función REDONDEAR de Excel y que será restar una cantidad muy pequeña al número antes de redondearlos. Por ejemplo, a nuestro código anterior agregaré una nueva línea para hacer el redondeo hacia abajo en la columna D:

Private Sub CommandButton1_Click()

For i = 2 To 10
    Cells(i, 2).Value = Round(Cells(i, 1).Value, 1)
    Cells(i, 3).Value = Application.WorksheetFunction.Round(Cells(i, 1).Value, 1)
    Cells(i, 4).Value = Application.WorksheetFunction.Round(Cells(i, 1).Value - 0.000001, 1)
Next i

End Sub

Observa que estoy restando el valor 0.000001 al número que voy a redondear y como consecuencia obtendré un redondeo hacia abajo. La única condición es que el valor a restar debe tener muchos más decimales que los números que estás redondeando de manera que no afecte el resultado final.

Redondeo de números en VBA

En estos ejemplos he mostrado cómo utilizar la función ROUND de VBA y también cómo llamar a la función REDONDEAR (ROUND) de Excel desde el mismo código VBA. Nada impide que utilices el objeto WorksheetFunction para llamar el resto de funciones para redondear de Excel y aprovechar su comportamiento desde tu código VBA.

Descarga el libro de trabajo y accede al código implementado en cada uno de los ejemplos. Revísalo con detenimiento para despejar cualquier duda respecto al comportamiento de la función ROUND en VBA.