La búsqueda de la descripción emergente de la función personalizada de Excel

100

Esta pregunta se ha hecho antes , pero cada vez que la respuesta aceptada es simplemente una renuncia para proporcionar descripciones de funciones usando Application.MacroOptions( VBA6 ) ( VBA7 ), pero esta información en realidad no aparece como información sobre herramientas, por lo que no resuelve mi problema.

La meta

Lo que todos deseamos es poder definir funciones personalizadas por cualquier medio (complemento VBA, VSTO o COM) y brindarle al usuario el beneficio de una descripción emergente / emergente de la función y sus parámetros, como aparece para cada función incorporada de Excel, ya sea en línea o en la barra de fórmulas:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

La respuesta ampliamente aceptada a esta necesidad es que no es posible para funciones personalizadas, pero deseo desafiar esa creencia.

El problema

Actualmente, lo mejor que he visto hacer a alguien es definir funciones (a menudo usando la llamada MacroOptions anterior) de modo que cuando aparezca el cuadro de diálogo de función (el botón fx en la barra de fórmulas), sus descripciones de funciones y parámetros aparezcan como se muestra a continuación:

ingrese la descripción de la imagen aquí

Como puede ver, esta es una función complicada con muchos parámetros. Si el usuario no conoce este diálogo de "argumentos de función" y cómo abrirlo, y en cambio está familiarizado solo con la información sobre herramientas estándar de Excel, solo verá el nombre de la fórmula y ninguna ayuda adicional:

ingrese la descripción de la imagen aquí

Con lo cual no tienen posibilidad de proporcionar correctamente los parámetros requeridos. (Sin leer la documentación, lo que, por supuesto, ningún usuario lo hace).

Ahora, un usuario avanzado puede saber que al escribir Ctrl+ Shift+ A, se le otorgará una lista de parámetros de función completada automáticamente como esta:

ingrese la descripción de la imagen aquí

Pero, por supuesto, tenemos el mismo problema que el anterior, que es que los usuarios de Excel estándar solo estarán acostumbrados al comportamiento predeterminado de la primera imagen y probablemente nunca hayan aprendido esa función.

En este punto, debe quedar claro por qué esto no es suficiente y queremos lo que tiene cada función incorporada: la información sobre herramientas en línea que le dice al usuario cómo usar la función.

El tease

Al principio, podría haberme convencido de que esto simplemente no es posible excepto con las funciones nativas de la aplicación Excel. Los complementos y VBA son características de extensibilidad, y esta información sobre herramientas puede simplemente no ser extensible. Pero esa teoría se ve desafiada por la existencia del complemento Analysis Toolpak. Claro, está integrado en Microsoft, pero ANALYS32.xll es un complemento XLL independiente como los que se pueden producir en VB, C, C ++ y C #. Efectivamente, cuando este XLL se carga en la aplicación, las funciones que pone a disposición tienen la misma información sobre herramientas de las funciones nativas de Excel:

ingrese la descripción de la imagen aquí

Seguramente si esta información se codifica de alguna manera en este archivo XLL y se pasa a Excel, ¿hay una manera de replicarla con nuestros propios complementos? Ahora estoy en el punto en el que voy a empezar a aprender un poco sobre la descompilación y ver si puedo aplicar ingeniería inversa a lo que esté sucediendo en el paquete de herramientas de análisis.

Cómo puedes ayudar

Estoy casi seguro de haber investigado toda la información disponible públicamente sobre este problema. Sin embargo, si alguien sabe algo que no sé que podría ayudar con esto, no dude en intervenir. No estoy muy familiarizado con dlls / xlls compilados de ingeniería inversa, así que si alguien tiene ganas de abrir su copia local de Analysis32.xll y Averiguar qué está pasando con sus definiciones de funciones personalizadas, estaría muy agradecido. De lo contrario, seguiré investigando esto yo mismo hasta que llegue a todos los callejones sin salida e informe lo que encuentre.

Alain
fuente
4
No es posible crear o mostrar información sobre herramientas para argumentos UDF en las versiones actuales de Excel utilizando cualquiera de las tecnologías disponibles. Fuente de MVP: answers.microsoft.com/en-us/office/forum/office_2007-customize/…
silkfire
.NET Reflector no pudo abrir ANALYS32.xll, concluyendo que no es un ensamblado .NET. Esto me sorprende. ¿Parece que voy a tener que intentar descompilarlo en lenguaje ensamblador?
Alain
5
Suena interesante, pero en el pasado (Office 97) hice información sobre herramientas usando el winapi. Y de esa forma puedes hacerlo. Si eso es interesante, puedo desenterrar la información y tratar de encontrar una respuesta.
Archlight
1
Yo también lo conseguiré, llevará algún tiempo desenterrar esto. Pero debería subir aquí para que otros lo usen. Es un combo bajo y malvado de winapi / vba / y creo que lo hice como vb.dll, pero no es un problema
subirlo
1
Aparentemente, el equipo de desarrollo de Excel está votando
Alain

Respuestas:

40

Publiqué un proyecto de prueba de concepto en GitHub como el proyecto Excel-DNA IntelliSense , implementando esto.

Usando las clases de Automatización de la IU para monitorear los eventos de la interfaz de usuario de Excel apropiados, se muestra un formulario cuando corresponde.

El código está empaquetado como un complemento de Excel-DNA y funciona en mi máquina Excel 2013 / Windows 8. Probé en otra configuración (Excel 2010 de 64 bits en Windows Server 2008) y tuve problemas graves.

Para una función de C # definida con los atributos de Excel-DNA como este:

[ExcelFunction(Description = 
    "A useful test function that adds two numbers, and returns the sum.")]
public static double AddThem(
    [ExcelArgument(Name = "Augend", 
                   Description = "is the first number, to which will be added")] 
    double v1,
    [ExcelArgument(Name = "Addend", 
                   Description = "is the second number that will be added")]     
    double v2)
{
    return v1 + v2;
}

obtenemos tanto la descripción de la función

Función descriptiva

y al seleccionar la función, obtenemos la ayuda del argumento

Ayuda de argumentos

Eso se ve bien, pero todavía es muy inestable, solo funciona en mi máquina y, a veces, falla Excel. Aunque podría ser un comienzo ...


Actualización 9 de mayo de 2014:

He progresado un poco al descubrir cómo hacer que la ayuda del argumento funcione en versiones anteriores de Excel y Windows. Sin embargo, todavía se necesita mucho trabajo para que todo sea confiable. Cualquiera que desee ayudar con esto debe comunicarse conmigo directamente.


Actualización 18 de junio de 2016:

Se está probando la compatibilidad de Excel UDF IntelliSense para complementos de Excel-DNA y funciones VBA. Consulte la página de Introducción en GitHub para obtener instrucciones.

Govert
fuente
Lamentablemente, parece que Excel 2013 o Windows 8 o ambos son necesarios para la compatibilidad con TextRange de automatización de la interfaz de usuario que utiliza la ayuda de argumentos. Me encantaría saber de cualquiera que tenga alguna experiencia en automatización de la interfaz de usuario de Windows ...
Govert
¿Intentó hacer referencia a ensamblajes de Excel más antiguos antes de compilar en máquinas más antiguas?
Daniel Möller
1
Las referencias al modelo de objetos de Excel no están realmente involucradas en esto. Pero ciertamente hay diferentes versiones de UI Automation que podrían afectar las cosas ...
Govert
1
Esto está muy por delante de todo lo que hay hasta ahora, así que obtienes mi voto a favor de la recompensa. Tengo la intención de ver si puedo contribuir a esta solución en un futuro cercano, ¡así que esté atento a mi solicitud de extracción!
Alain
@Alain ¡Buen trabajo para Govert! & Alain Me encantaría verte dominar esto.
CodeCamper
1

Qué tal si

  1. Capture la entrada de texto en el evento de pulsación de tecla de la celda. Me gusta esto
  2. Compruebe si el texto coincide con las funciones personalizadas.
  3. Si coincide, muestre algo como una etiqueta o forma para simular que es una información sobre herramientas. Me gusta esto

¿Es esto aceptable?

Es un poco feo pero más fácil.

Clxy
fuente
Este es un punto de partida interesante que consideré, pero encontré complicaciones cuando se encuentran formas más avanzadas de editar una fórmula (como hacer clic en algún lugar en el medio y eliminar / agregar caracteres, o resaltar y sobrescribir una parte de la fórmula, o usar una fórmula personalizada en medio de alguna otra fórmula). Estos requieren más que verificar pulsaciones de teclas, tendríamos que mirar el contenido actual de la barra de fórmulas o celda en mitad de la edición. Esto también podría lograrse con algunas bibliotecas dll importadas y manejar la piratería. Ciertamente vale la pena explorarlo.
Alain
-1

¿Qué es XLL?

Un XLL es una DLL que exporta varios procedimientos que son llamados por Excel o el Administrador de complementos de Excel. http://msdn.microsoft.com/en-us/library/office/bb687861.aspx

¿Cómo se desarrolla el XLL?

Excel XLL SDK con Visual C ++ (o cualquier cosa que pueda compilar una DLL y llamar a los procedimientos del SDK)

¿Dónde puedo encontrar una guía rápida para crear un XLL simple?

http://support.microsoft.com/kb/178474

¿Cómo obtengo información sobre herramientas?

  1. Implementa tu función como procedimiento y expórtala
  2. Implementar y exportar el procedimiento xlAutoOpen (void) - http://msdn.microsoft.com/en-us/library/office/bb687860.aspx
  3. xlAutoOpen solo necesita llamar a xlfRegister - http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
  4. Para la información sobre herramientas, especial atención a: pxArgumentText, pxFunctionHelp, pxArgumentHelp1

Lamentablemente, el complemento Analysis Toolpak tampoco tiene información sobre herramientas.

Mi solución fue incorrecta, pero con información incorrecta publicada por el póster original. Mostrando una imagen con BINOMDIST, si su enlace muestra claramente que esta no es una función de ANALYS32.xll.

Esto significa que estaba tratando de resolver una pregunta imposible. Porque no hay ningún XLL que pueda hacer lo que pidió el cartel. Si encuentra una versión de Excel que muestre información sobre herramientas de XLL, hágamelo saber.

Sobre lo que preguntaba el cartel, tratando de imitar el comportamiento de XLL, estoy seguro de que mi respuesta fue la más correcta en relación a lo que hace ANALYS32.xll.

Marcos Zolnowski
fuente
3
Lamentablemente, el registro de una UDF con xlfRegister hace no causa Excel para mostrar que la información que en la ficha técnica intelisense información sobre herramientas. Las descripciones, etc. registradas allí solo se muestran en el cuadro de diálogo Argumentos de función, que aparece cuando presiona el botón fx. Pero eso no es lo que pregunta el póster original.
Govert
@Govert, ¿sigue siendo así ahora en 2016?
beppe9000
@ beppe9000 Sí. Puede obtener información sobre herramientas de IntelliSense en hoja para UDF (definido en un XLL o VBA) utilizando la extensión Excel-DNA IntelliSense: github.com/Excel-DNA/IntelliSense
Govert