miércoles, diciembre 24, 2008

Fechas anteriores al año 1900 en Excel

Hagamos la siguiente prueba: en la celda A7 ponemos la fecha 01/01/1900 (el primero de enero del 1900); luego arrastramos el valor con el mouse hasta la celda A1. Supuestamente tendríamos que ver la siguiente sucesión:

A6 = 31/12/1899
A5 = 30/12/1899
A4 = 29/12/1899
A3 = 28/12/1899
A2 = 27/12/1899
A1 = 26/12/1899

Veamos que pasa en la práctica



Extraño, no? Hagamos otro experimento. En una celda ponemos esta fórmula

=FECHA(1899,12,31)

¿Cuál será el resultado? Sería de esperar 31/12/1899, sin embargo el resultado será 31/12/3799



Es decir Excel ha calculado el año en la función agregando 1900 al número 1899. Esto se debe a que Excel no sabe, o mejor dicho, no ha sido programado para calcular fechas anteriores al primero de enero del 1900. Como ya hemos explicado en más de una nota Excel usa una serie de números para las fechas donde el número 1 representa el 01/01/1900, el 2 la fecha 02/01/1900 y así sucesivamente. Es decir que si queremos calcular la edad de alguien nacido antes del 1900 o si queremos manejar una base de datos genealógicos con Excel tendremos que encontrar algún rodeo.

En esta nota veremos algunos rodeos conocidos para superar este problema.

La solución oficial de Microsoft es una UDF (user defined function – función definido por el usuario). Para usar la función (en realidad son dos funciones) deben copiar el código en la hoja del enlace y pegarlo a un módulo normal de Vba (preferentemente en el cuaderno Personal.xls).

La función tiene dos variables: fecha de comienzo (startdarte) y fecha final (enddate). Fechas anteriores a 01/01/1900 deben ser texto. Por ejemplo, si nuestro abuelo nació el 18/02/1877 y falleció el 25/04/1963, la función da como resultado 86.
El problema con esta macro es que funciona con la notación americana, mes/día/año. Si tratamos de usarlo con la notación corriente en la mayoría de los países, d+ia/mes/año, el resultado será “invalid date”.


Otra solución es descargar e instalar el complemento XDATE (eXtended Date) desarrollado por John Walkenbach. Una vez descargado e instalado, una serie de funciones son incorporadas al grupo de funciones de fechas del asistente de funciones



Ahora podemos volver al ejemplo de mi abuelito y utilizar XDATEDIF para calcular cuántos días vivió: 31476



Para calcular cuantos años usamos XDATEYEARDIF.



Este complemento agrega otras funciones como por ejemplo XDATEDOW que calcula el día de la fecha (1 = domingo).

Un problema similar existe con fechas posteriores al 31/12/9999. En otras palabras, para Excel el mundo fue creado el 1 de enero del 1900 (en la versión para McIntosh, en 1904) y tendrá su fin el 31 de diciembre del 10000.






Technorati Tags:

martes, diciembre 23, 2008

Actualización automática de gráficos con listas.

Allá por el verano del 2006 (o el invierno, dependiendo de donde resida el lector) expliqué como crear un gráfico que se actualice automáticamente a medida que le agregamos datos.

La técnica consistía en usar rangos dinámicos en la función SERIES del gráfico. La ventaja de esta técnica es que es consistente con todas las versiones de Excel. Pero si usamos la versión 2003 o 2007 de Excel podemos usar una técnica mucho más sencilla.

Supongamos que tenemos esta tabla de ventas por mes a partir de la cual creamos un sencillo gráfico de columnas




Queremos que al agregar los próximos meses el gráfico se actualice automáticamente. Para hacerlo sacaremos provecho de la funcionalidad Datos--Listas.


Empezamos por seleccionar alguna de las celdas de la tabla, por ejemplo A1 y abrimos el menú Datos-Lista-Crear Lista



Excel selecciona automáticamente todo el área de la tabla



Después de controlar que la selección es la deseada, apretamos Aceptar. Excel ha creado ahora una lista y expandirá el área de la tabla automáticamente cada vez que agreguemos (o quitemos) una fila. Excel también abre la barra de herramientas de listas donde tenemos todo tipo de herramientas para administrarla



Para agregar una fila a la lista seleccionamos alguna celda del área. Veremos que aparece un marco azul alrededor del área de la lista y una estrella azul en la primer celda libre, donde debemos poner los datos



Todo los que nos queda por hacer es agregar los datos y el gráfico se actualizará automáticamente



En Excel 2007 esta técnica funciona de la misma manera pero con, como no podía ser de otra manera, algunas diferencias funcionales:

# - La funcionalidad no se llama Lista sino Tablas y no se encuentra en la pestaña Datos como en Excel 2003 sino en la pestaña Insertar



# - Al seleccionar alguna celda de la lista/tabla no aparece una nueva línea en blanco en la tabla. De todas maneras si agregamos un mes inmediatamente debajo del último registro de la tabla, Excel expande la lista en forma automática. Otra técnica en Excel 2007 es usar la tecla Tab. Por ejemplo, si después de introducir el dato de setiembre en la celda B10 apretamos TAB, Excel selecciona automáticamente la celda A11 y expande la tabla.

Microsoft ha agregado muchas otras herramientas y funcionalidades a las tablas en Excel 2007, pero esto será tema de una futura nota.



Technorati Tags:

lunes, diciembre 22, 2008

Insertar un calendario permanente en Excel 2007.

Hace ya más de dos años publiqué la nota sobre como insertar un calendario permanente en hojas de calculo Excel con Controles ActiveX. Eran los días previos a la aparición de Excel 2007 y los controles estaban ligados a dos barras de herramientas, Formularios y Cuadros de Controles (controles ActiveX).
En Excel 2007 no hay barras de herramientas y los controles están ubicados en la pestaña Programador de la cinta de opciones




Nótese que todas las herramientas necesarias están a nuestra vista en la misma sección de la pestaña (Modo diseño, Propiedades, etc.).

Como pueden ver, al apretar Insertar vemos de hecho las mismas barras de herramientas a las que estábamos acostumbrados en las versiones anteriores de Excel.

También el modelo de validación de fechas programando un evento que muestre el calendario si se cumplen ciertas condiciones podemos usarlo en Excel 2007. Si bien la interfaz del editor de Visual Basic no ha cambiado algunos lectores me comentan que no encuentran el botón de controles adicionales. Al igual que en las versiones anteriores podemos usar el menú Herramientas-Controles Adicionales o hacer un clic con el botón derecho del mouse en cuadro de herramientas del UserForm



También podemos crear un calendario permanente en una hoja de Excel sin usar controles. Esto puede hacerse con fórmulas matriciales, como en este modelo desarrollado por John Walkenbach



Este modelo usa fórmulas matriciales de rango, es decir una fórmula que da el resultado en varias celdas simultáneamente. Para crear este modelo empezamos por introducir en la celda B2 el mes y el año del calendario. Podemos hacer esto poniendo en B2 la fórmula =HOY() y dando un formato “mmmm,aaaa” a la celda. Luego seleccionamos el rango B4:H9 asegurándonos que la celda activa sea B4, introducimos esta fórmula en la celda activa

=SI(MES(FECHA(AÑO(B2);MES(B2);1))<>MES(FECHA(AÑO(B2);MES(B2);1)-(DIASEM(FECHA(AÑO(B2);MES(B2);1))-1)+{0\1\2\3\4\5}*7+{1;2;3;4;5;6;7}-1);"";FECHA(AÑO(B2);MES(B2);1)-(DIASEM(FECHA(AÑO(B2);MES(B2);1))-1)+{0\1\2\3\4\5}*7+{1;2;3;4;5;6;7}-1)

y apretamos simultáneamente Ctrl+Mayúsculas+Enter

Podemos usar una fórmula más sencilla,

=FECHA(AÑO(B13);MES(B13);1)-(DIASEM(FECHA(AÑO(B13);MES(B13);1))-1)+{0\7\14\21\28\35}+{0;1;2;3;4;5;6}

pero que mostrará las fechas en todas las casillas del rectángulo



Como ven, estos calendarios son “gringos” con la semana comenzando en domingo. Si queremos que la primer columna de la semana sea el lunes, modificamos levemente la fórmula

=SI(MES(FECHA(AÑO(B2);MES(B2);1))<>MES(FECHA(AÑO(B2);MES(B2);1)-(DIASEM(FECHA(AÑO(B2);MES(B2);1))-1)+{0\1\2\3\4\5}*7+{1;2;3;4;5;6;7});"";FECHA(AÑO(B2);MES(B2);1)-(DIASEM(FECHA(AÑO(B2);MES(B2);1))-1)+{0\1\2\3\4\5}*7+{1;2;3;4;5;6;7})



O esta fórmula

=FECHA(AÑO(B13);MES(B13);1)-(DIASEM(FECHA(AÑO(B13);MES(B13);1))-2)+{0\7\14\21\28\35}+{0;1;2;3;4;5;6}

para el modelo sencillo







Technorati Tags: