martes, 19 de julio de 2011

Programar una función de redondeo

Descargar el fichero: redondear.xlsm

Redondear un número es una tarea común que podemos hacer con la fórmula de Excel REDONDEAR. En éste post nos proponemos programar una función en VBA, mediante una macro, que produzca el redondeo.

Redondear a cero decimales

Comencemos redondeando a cero decimales. Así el número 3,14159 (¡me suena este número!) se puede redondear a cero decimales como 3. Y el número 2,7182818 (y éste ¿me debería sonar?) se puede redondear a cero decimales como 3.

Código:

Function Redondealo(n As Double) As Double
If n >= Int(n) + 0.5 Then
  Redondealo = Int(n) + 1
Else
  Redondealo = Int(n)
End If
End Function

El primer número visto es pi que se obtiene con la función de Excel

=PI()

El segundo número visto es e, que es la base de los logaritmos neperianos. También podemos decir que es la exponencial de 1. En Excel se puede calcular con la siguiente expresión:

=EXP(1)

Si aplicamos la función definida por el usuario Redondealo obtendremos en ambos casos el valor de 3.

=Redondealo(PI())
=Redondealo(EXP(1))

Redondear invocando la función de Excel

Todas las funciones disponibles en Excel se pueden invocar mediante una macro. El código requiere que la función a la que llamemos esté escrita en inglés. Para obtener un listado de la funciones en inglés puede consultar el siguiente enlace.

Glosario: Traducción de funciones

La función REDONDEAR en español equivale a la función ROUND en inglés. La expresión que hemos de utilizar en VBA para invocar a esta función es la siguiente:

Application.WorksheetFunction.round(número, precisión)

Código:

Function SuRedondeo(numero, precision)
SuRedondeo = Application.WorksheetFunction.Round(numero, precision)
End Function


Programemos la función

Con la función Redondealo fuimos capaces de redondear a cero decimales. En esta ocasión vamos a introducir la variable p que recoge la precisión del redondeo. La función se llama MiRedondeo y el código es el siguiente.

Código:

Function MiRedondeo(n As Double, p As Single) As Double
If n * 10 ^ p >= Int(n * 10 ^ p) + 0.5 Then
  MiRedondeo = Int(n * 10 ^ p + 1) / (10 ^ p)
Else
  MiRedondeo = Int(n * 10 ^ p) / (10 ^ p)
End If
End Function

Podemos ver el resultado aplicado a Pi y a e.

1 comentario: