6 de julio de 2009

Día especial

El día de hoy es el día 40,000 Excel. Y no porque Excel tenga 40,000 días en el mercado, sino porque este es el número serial que corresponde al 6 de julio de 2009. Recordemos que el sistema de fechas en Excel comienza el 1 de enero de 1900. Han pasado 40,000 días desde esa fecha.

Para comprobarlo, escribimos la fecha de hoy (Ctrl + Shift + ;) en una celda y posteriormente, aplicamos formato de número a la celda (Ctrl + Shift + 1).

22 de junio de 2009

Resultado inesperado - resolviendo el misterio

En relación a la nota Resultado inesperado, en la que comentaba algunos resultados aparentemente incomprensibles que Excel me devolvía, ckarlanga me hizo llegar su comentario y análisis de la situación, al que decidí dedicarle su nota propia dada su relevancia. Comenta ckarlanga:

"Hola, me hago llamar ckarlanga, y navegando por los foros di con esta info que me pareció bastante curiosa y sobre todo que alguien la mencionara, siendo un curioso del excel, estuve tratando de abrir la funcion de distribución normal, para ello intenté dar con el complemento que en excel lo contenía y me di la lata de abrir uno por uno los complementos, y por ahí di con el paquete que contiene atpvbes.xla atpvben.xla analisys32.xll funcres.xla y procdb.xla, les saque las claves a estos archivos y en los ATP tanto español como inglés, se encuentra la función networkdays y dias.lab, éste es el código:

Function Networkdays(start_date As Variant, end_date As Variant, Optional holidays As Variant) As Variant
Networkdays = Application.Run(GetMacroRegId("NETWORKDAYS"), start_date, end_date, holidays)

End Function

Cuando uno ejecuta esa function desde el excel va a esta función que ejecuta una función base para todas las creadas dentro de este paquete llamada GetMacroRegId. Esta a su vez, si logras convertir el archivo xla a xls, tiene una descripción de cada una de las funciones hechas dentro del xla:

Private Function GetMacroRegId(FuncText As String) As String
Debug.Print ("[GetMacroRegId] '" & FuncText & "' <") For i = LBound(FunctionIDs) To UBound(FunctionIDs)
If (LCase(FunctionIDs(i, 0)) = LCase(FuncText)) Then
If (Not (IsError(FunctionIDs(i, 1)))) Then
GetMacroRegId = FunctionIDs(i, 1)
Debug.Print ("[GetMacroRegId] '" & FuncText & "' -> '" & GetMacroRegId & "' >")
Exit Function
End If End If Next i
Debug.Print ("[GetMacroRegId] Error while finding '" & FuncText & "' >")
End Function

dentro del xla covertido a xls tienes esto ...

Function table
Labels VBAname Module Procedure Type text Function text Argument text Macro type Category Shortcut text Help topic Help text Arg1 Arg2 Arg3
HEX2DEC Hex2Dec hex2dec PP# HEX.A.DEC número 1 Ingeniería xlmain10.chm!1929

Convierte un número hexadecimal en decimal es el número hexadecimal que desea convertir

(encabezados)

y estos son los datos

NETWORKDAYS Networkdays networkdays PPPP# DIAS.LAB fecha_inicial;fecha_final;festivos 1 Fecha y hora xlmain10.chm!1963 Devuelve el número total de días laborables entre dos fechas es un número de serie que representa la fecha inicial es un número de serie que representa la fecha final.


El código al que haces referencia, 840368184, es el id de la macro que tiene adentro la fórmula de cálculo de los días hábiles, apenas tenga una respuesta específica dentro de que archivo se encuentra ( lo mas probable un dll) te lo informo...

un saludo...

perdona lo enredado de la respuestas... pero a esta hora no pienso más..."

Con esto comenzamos a resolver el misterio. Intentaré reproducir estos pasos en mi equipo para comparar resultados. Te agradezco esta colaboración, ckarlanga. Así mismo, te extiendo una cordial invitación a postear notas en este blog, las cuales, desde luego, llevarían tu firma. Si te gusta la idea, házmelo saber para otorgarte permisos de escritura.

27 de mayo de 2009

Formatear el eje y

Supongamos el siguiente gráfico:


Queremos que para facilitar la lectura del mismo, tengamos tres colores en la escala del eje y: el verde para los valores mayores o iguales a 30, negro para los resultados entre -10 y 30 y rojo para los menores de -10, quedando de esta manera:

Para lograrlo seguimos los siguientes pasos:

Clic derecho en el eje y - Formato de ejes..., activamos la ficha Número. Seleccionamos la Categoría Personalizado. En Tipo: escribimos el siguiente formato personalizado:

[verde][>=30]#,##0;[Rojo][<-10]-#,##0;Estándar

Aceptar. Recordemos, sin embargo, lo que vimos en la nota pasada: nuestro principal objetivo es contar una historia con la gráfica, más que impactar visualmente.

25 de mayo de 2009

Una buena gráfica

Como lo dice Chandoo en su blog, "una gráfica bién hecha nos cuenta una historia. Tan simple como eso."

Este es un ejemplo de lo que es una buena gráfica, "Tiempo empleado para comer por día vs tasa nacional de obesidad" (clic en la imagen para agrandarla):


x: minutos utilizados para comer por día
y: porcentaje de población con IMC > 30

Se toma unos cinco segundos en entender de qué es la gráfica. Y luego, conoces la historia. Lo más importante, estimula al lector a hacerse preguntas y entender los datos.

En sí misma, la gráfica es sencilla. Nada del otro mundo. Pero yuxtapone brillantemente dos piezas de datos: la tasa de obesidad en los países y el tiempo utilizado para comer, para contar una historia.

El artículo demuestra cabalmente uno de los fundamentos de Excel: el principal objetivo de una gráfica no es impactar visualmente, sino transmitir información clara rápidamente.

La gráfica de nuestro ejemplo dice más que esta otra, que aunque más visual, es más confusa:


Si una gráfica Excel no comunica información más rápidamente que una tabla de datos, podemos decir, con toda justicia, que es una mala gráfica. Sería mejor prescindir de ella y mostrar en su lugar solo los datos fuente.
Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Excel, Excel 2003, Excel 2007 y el logo XL son marcas registradas de Microsoft Corporation.