viernes, noviembre 14, 2008

Un poco más sobre redondeos en Excel

Un lector dejó un comentario interesante en la nota Algo más sobre la función REDONDEAR tocando el tema de redondeo de sumas en las tiendas y supermercados. Decidí no publicar la nota ya que no estaba relacionada directamente con algún aspecto técnico de la nota y además el lector decidió quedar en el anonimato.

Nuestro anónimo lector comentaba sobre una cadena de supermercados que proponía a los clientes redondear los centavos y donar la diferencia a una institución de bien público. Por ejemplo, el monto de la compra era 99 pesos con 98 centavos, el cajero proponía al cliente redondear la suma a 100 pesos donando dos centavos. Esto parece loable, sólo que la donación era hecha a nombre de la empresa y no del cliente quien es el donante real. Otro aspecto interesante era que la cadena de supermercados podía descontar las donaciones de los impuestos generando de esta manera ganancias a cuenta del dinero de los clientes.

¿Cuál es el método de redondeo en Excel? Pues bien, hay varios y además existen diferencias entre el redondeo en Excel y en Vba, el lenguaje macro de Excel.
En la nota anterior mostrábamos que podíamos usar un redondeo negativo como

REDONDEAR(123,45;-2) = 100

El equivalente en Vba sería usar la función Round, pero esto genera un error




Sí podemos usar la función de Excel en Vba usando la propiedad WorksheetFunction de esta manera



El método común de redondeo (o simétrico o Round-Half-Up, de acuerdo a Wikipedia) que funciona de la siguiente manera:

1 - decidimos cuantos decimales queremos dejar;
2 - si el digito siguiente al que dejamos es mayor o igual a 5, redondeamos "hacia arriba" (por ejemplo, 123.45 redondeado a un decimal será 123.5);
3 - si el dígito siguiente es menor de 5 redondeamos "hacia abajo" (123.44 será 123.4).

Este es el método que usa Excel con la función redondear. La función TRUNCAR, en cambio, se limita a "cercenar" los dígitos no requeridos.

Existe un método de redondeo llamada, en inglés, Banker's rounding (o round to even, unbiased rounding, convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, siempre de acuerdo a Wikipedia) y me disculparan el inglés pero no he encontrado nada sobre el tema en castellano.


Este método consiste en redondear siempre hacia el número par más cercano. Por ejemplo, 1.5 y 2.5 se redondean como enteros a 2; 3.5 y 4.5 se redondean a 4. La lógica de este método es minimizar el desvío que se produce al redondear siempre 0.5 "hacia arriba".
En este ejemplo



he usado la fórmula =REDONDEAR(A1,0) en la columna B. En las celdas A5 y B5 he usado la función SUMA. Como pueden ver el resultado es problemático. No existe ninguna función nativa de Excel que funcione con el método de Banker's rounding.


Pero en Vba podemos usar estas funciones para este tipo de redondeo: CByte(), CInt(), CLng(), CCur() y Round().
Por ejemplo, podemos escribir esta funcion UDF (definida por el usuario) para redondear a enteros

Function bankers_round(monto As Double)
bankers_round = CInt(monto)
End Function


Si aplicamos esta función para redondear a enteros, obtenemos estos resultados




Por supuesto, también este método puede generar desvíos. Podríamos pensar en un método de redondeo aleatorio, pero este método podría dar resultados diferentes para un mismo grupo de datos. Es decir, puede ser inconsistente.

Quien esté interesado en profundizar en el tema puede ver esta nota en la base de conocimientos de Microsoft..


Technorati Tags:

miércoles, noviembre 05, 2008

Algo más sobre la función REDONDEAR (ROUND) de Excel.

La función REDONDEAR, una de las tantas funciones de redondeo que tiene Excel, tiene una curiosidad sobre la cual me llamaba la atención un lector.
Esta función redondea en forma simétrica a la cantidad de decimales deseada. Por ejemplo,

la fórmula =REDONDEAR(10,43;1) da 10.4

la fórmula =REDONDEAR(10,46;1) da 10.5

Si ponemos 0 como número de decimales, el redondeo es obviamente al número entero más cercano.

La curiosidad es que REDONDEAR también acepta números negativos como parámetro para el número de decimales. En ese caso, Excel redondea "hacia la izquierda" a la decena (-1), centena (-2), etc., más cercana.

Por ejemplo:

=REDONDEAR(123,45;-1) da 120

=REDONDEAR(123,45;-2) da 100

Y finalmente =REDONDEAR(123,45;-3) da 0

Si quisiéramos redondear el número 12345, los resultados serían

=REDONDEAR(12345;-1) = 12350

=REDONDEAR(12345;-2) = 12300

=REDONDEAR(12345;-3) = 12000

=REDONDEAR(12345;-4) = 10000

=REDONDEAR(12345;-5) = 0


Technorati Tags:

martes, noviembre 04, 2008

Filtrado de fechas en Excel con Autofiltro o Filtro Avanzado

Supongamos que queremos filtrar una lista de fechas de manera de dejar visibles sólo las fechas que caen en miércoles. Podemos hacer esto con Autofiltro o con Filtro Avanzado, pero cuál sería el criterio?
Si usamos Autofiltro necesitamos crear una columna auxiliar que nos dé el día de la semana para cada una de las fechas del rango. Luego filtramos de acuerdo a esta columna auxiliar.



¿Cómo calculamos el día de la semana para cada fecha? Dos posibilidades, una sencilla y otra complicada:

1 - La complicada, con funciones. Con la función DIASEM, por ejemplo

=DIASEM(A2,2) da 3.

Para transformar el resultado 3 en "miércoles" usamos la función ELEGIR de esta manera

=ELEGIR(DIASEM(A2,2),"lunes","martes","miércoles","jueves","viernes","sábado","domingo")

O con la función INDICE:
=INDICE(semana,DIASEM(A2,2)),

donde "semana" es un nombre que contiene un rango con los días de la semana o directamente los días de la semana.

2 - La posibilidad sencilla. Creamos en la columna auxiliar una referencia a la celda con la fecha (en B2 ponemos =A2) y cambiando el formato de B con el formato personalizado "dddd".

Si queremos usar Filtro Avanzado, tenemos que usar una fórmula lógica, es decir, que dé como resultado VERDADERO o FALSO. Agregamos algunas filas en blanco para poner las filas de criterios y en la celda A2 ponemos esta fórmula

=DIASEM(A5,2)=3



Luego usamos el menú de Filtro avanzado






La ventaja de usar Filtro Avanzado es que nos permite copiar los resultados a otro rango de la hoja o usar más de dos criterios para filtrar la lista.

Ahora veamos otros casos que se presentan.

Para dejar visibles sólo fechas que sean el primer día del mes usamos la fórmula

=A2=FECHA(AÑO(A2),MES(A2),1)

Si la fecha en A2 coincide con el primer día del mes el resultado será VERDADERO. En caso contrario, FALSO. Luego filtramos la lista usando como criterio VERDADERO en la columna auxiliar.



Si queremos usar Filtro Avanzado, usamos la misma fórmula como criterio






Para filtrar las fechas que sean el último día del mes usamos la fórmula

=A2=FECHA(AÑO(A2),MES(A2)+1,0)

Para filtrar el primer día hábil del mes usamos la fórmula

=A2=FECHA(AÑO(A2),MES(A2),1)+ELEGIR(DIASEM(FECHA(AÑO(A2),MES(A2),1),2),0,0,0,0,0,2,21

La primer parte de esta fórmula calcula la fecha del primer día del mes. En la segunda parte de la fórmula DIASEM calcula el número de día de la semana de esta fecha. Este resultado es usado como parámetro en la función ELEGIR, que agrega 0 (cero) si el día de semana cae entre lunes y viernes, suma 2 si el día de semana del primer día del mes cae un sábado o 1 si es domingo.

Para filtrar el último día hábil del mes usamos la fórmula

=A2=FECHA(AÑO(A2),MES(A2)+1,0)-(MAX(0,DIASEM(FECHA(AÑO(A2),MES(A2)+1,0),2)-5))

Como en los casos anteriores, si queremos usar Autofiltro usamos la fórmula para construir una columna auxiliar. Si queremos usar Filtro Avanzado usamos la fórmula en la celda de criterio.





Technorati Tags: