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.

1 comentario:

  1. Leonel, agradezco mucho la invitación, pero te comento que por tiempo mi participacion podria ser minima, aunque ahora estoy trabajando en el desarrollo de opciones financieras en excel, y aun siendo un tema muy comun... puedo entregar informacion que puede ser util a los lectores.

    Un saludo,
    Carlos Alberto

    ResponderEliminar

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.