La quête de l'infobulle de la fonction personnalisée Excel

100

Cette question a été posée avant , mais à chaque fois la réponse acceptée est simplement une démission de fournir des descriptions de fonction à l' aide Application.MacroOptions( VBA6 ) ( VBA7 ), mais cette information ne semble pas vraiment comme une info - bulle, il ne résout pas mon problème.

Le but

Ce que nous souhaitons tous, c'est pouvoir définir des fonctions personnalisées par tous les moyens (complément VBA, VSTO ou COM) et faire bénéficier l'utilisateur d'une description contextuelle / info-bulle de la fonction et de ses paramètres, comme apparaît pour chaque fonction Excel intégrée, en ligne ou dans la barre de formule:

entrez la description de l'image ici

entrez la description de l'image ici

La réponse largement acceptée à ce besoin est qu'il n'est pas possible pour les fonctions personnalisées, mais je souhaite contester cette croyance.

Le problème

Actuellement, le mieux que j'ai vu quelqu'un faire est de définir des fonctions (souvent en utilisant l'appel MacroOptions ci-dessus) de sorte que lorsque vous ouvrez la boîte de dialogue de fonction (le bouton fx dans la barre de formule), leurs descriptions de fonctions et de paramètres apparaissent comme ci-dessous:

entrez la description de l'image ici

Comme vous pouvez le voir, c'est une fonction compliquée avec de nombreux paramètres. Si l'utilisateur n'est pas au courant de cette boîte de dialogue «arguments de fonction» et de la façon de le faire apparaître, et n'est plutôt familier qu'avec l'info-bulle standard d'Excel, il ne verra que le nom de la formule et aucune aide supplémentaire:

entrez la description de l'image ici

Avec lequel ils n'ont aucune chance de fournir correctement les paramètres requis. (Sans lire la documentation, ce que, bien sûr, aucun utilisateur ne fait jamais.)

Maintenant, un utilisateur expérimenté peut savoir qu'en tapant Ctrl+ Shift+ A, il se verra attribuer une liste auto-complétée de paramètres de fonction comme ceci:

entrez la description de l'image ici

Mais bien sûr, nous avons le même problème que ci-dessus, à savoir que les utilisateurs Excel standard ne seront habitués qu'au comportement par défaut de la première image et n'auront probablement jamais appris cette fonctionnalité.

Il devrait être clair à ce stade pourquoi cela ne suffit pas et nous voulons ce que chaque fonction intégrée a - l'info-bulle en ligne qui indique à l'utilisateur comment utiliser la fonction.

Le taquin

Au début, j'aurais peut-être été convaincu que ce n'est tout simplement pas possible sauf avec les fonctions natives de l'application Excel. Les compléments et VBA sont des fonctionnalités d'extensibilité, et cette info-bulle peut simplement ne pas être extensible. Mais cette théorie est remise en question par l'existence du complément Analysis Toolpak. Bien sûr, il est intégré à Microsoft, mais ANALYS32.xll est un complément XLL autonome, tout comme ceux qui peuvent être produits en VB, C, C ++ et C #. Effectivement, lorsque ce XLL est chargé dans l'application, les fonctions qu'il rend disponibles ont les mêmes info-bulles que les fonctions Excel natives:

entrez la description de l'image ici

Si ces informations sont en quelque sorte encodées dans ce fichier XLL et transmises à Excel, il existe un moyen de les répliquer avec nos propres compléments? J'en suis maintenant au point où je vais commencer à m'apprendre un peu la décompilation et voir si je peux faire de l'ingénierie inverse tout ce qui se passe dans le toolpak d'analyse.

Comment vous pouvez aider

Je suis presque certain d'avoir recherché toutes les informations disponibles publiquement sur ce problème. Si quelqu'un sait quelque chose que je ne sais pas qui pourrait aider avec cela, n'hésitez pas à intervenir. Je ne suis pas familier avec le reverse-engineering de dll / xlls compilés, donc si quelqu'un a envie d'ouvrir sa copie locale de Analysis32.xll et comprendre ce qui se passe avec ses définitions de fonctions personnalisées, je serais très obligé. Sinon, je continuerai à creuser moi-même jusqu'à ce que j'aie atteint toutes les impasses et que je rapporte ce que je trouve.

Alain
la source
4
Il n'est pas possible de créer ou d'afficher des info-bulles pour les arguments UDF dans les versions actuelles d'Excel en utilisant l'une des technologies disponibles. Source par MVP: answers.microsoft.com/en-us/office/forum/office_2007-customize/…
silkfire
.NET Reflector n'a pas pu ouvrir ANALYS32.xll, concluant qu'il ne s'agissait pas d'un assembly .NET. Cela me surprend. On dirait que je vais devoir essayer de le décompiler en langage d'assemblage?
Alain
5
Cela semble intéressant, mais j'ai dans le passé (office 97) créé des infobulles en utilisant winapi. Et de cette façon, vous pouvez le faire. Si cela est intéressant, je peux fouiller les informations et essayer d'en faire une réponse.
Archlight
1
Je l'aurai aussi vous, il faudra du temps pour creuser ça. Mais il devrait arriver ici pour que d'autres puissent l'utiliser. Son combo bas et maléfique de winapi / vba / et je pense que je l'ai fait en tant que vb.dll mais ce n'est pas un problème de le soulever à .net
Archlight
1
Apparemment, l'équipe de développement d'Excel prend des votes pour cette fonctionnalité ici: excel.uservoice.com/forums
Alain

Réponses:

40

J'ai publié un projet de preuve de concept sur GitHub en tant que projet Excel-DNA IntelliSense , mettant en œuvre cela.

En utilisant les classes UI Automation pour surveiller les événements appropriés de l'interface utilisateur Excel, un formulaire s'affiche le cas échéant.

Le code est enveloppé en tant que complément Excel-DNA et fonctionne sur ma machine Excel 2013 / Windows 8. J'ai testé sur une autre configuration (Excel 2010 64 bits sur Windows Server 2008) et j'ai eu de sérieux problèmes.

Pour une fonction C # définie avec les attributs Excel-DNA comme ceci:

[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;
}

on obtient à la fois la description de la fonction

Description de la fonction

et lors de la sélection de la fonction, nous obtenons une aide sur les arguments

Aide aux arguments

Cela a l'air bien, mais tout est encore très floconneux, ne fonctionne que sur ma machine et plante parfois Excel. Cela pourrait être un début, cependant ...


Mise à jour du 9 mai 2014:

J'ai fait des progrès pour savoir comment faire fonctionner l'argument sous les anciennes versions d'Excel et de Windows. Cependant, il faut encore beaucoup de travail pour que tout soit fiable. Toute personne souhaitant apporter son aide doit me contacter directement.


Mise à jour du 18 juin 2016:

La prise en charge d'Excel UDF IntelliSense pour les compléments Excel-DNA et les fonctions VBA est en cours de test. Consultez la page de mise en route sur GitHub pour obtenir des instructions.

Govert
la source
Malheureusement, il semble qu'Excel 2013 ou Windows 8 ou les deux soient nécessaires pour la prise en charge de TextRange Automation de l'interface utilisateur utilisée par l'aide d'argument. Je serais ravi d'entendre tous ceux qui ont une certaine expérience de l'automatisation de l'interface utilisateur Windows ...
Govert
Avez-vous essayé de référencer d'anciens assemblages Excel avant de compiler sur des machines plus anciennes?
Daniel Möller
1
Les références au modèle objet Excel n'y sont pas vraiment impliquées. Mais il existe certainement différentes versions d'UI Automation qui pourraient affecter les choses ...
Govert
1
Ce sont des rues avant tout ce qui existe jusqu'à présent, alors vous obtenez mon vote pour la prime. J'ai l'intention de voir si je peux contribuer à cette solution dans un proche avenir, alors gardez un œil sur ma pull request!
Alain
@Alain Bon travail à Govert! & Alain J'adorerais vous voir maîtriser ça.
CodeCamper du
1

Que diriez-vous

  1. Capturez le texte de saisie sur l'événement de pression de touche de la cellule. comme ça
  2. Vérifiez si le texte correspond aux fonctions personnalisées.
  3. Si cela correspond, affichez quelque chose comme une étiquette ou une forme pour faire semblant d'être une info-bulle. comme ça

Est-ce acceptable?

C'est un peu moche mais plus facile.

Clxy
la source
C'est un point de départ intéressant que j'ai envisagé, mais qui s'est heurté à des complications lorsque des formes plus avancées d'édition d'une formule sont rencontrées (comme cliquer quelque part au milieu et supprimer / ajouter des caractères, ou mettre en évidence et écraser une partie de la formule, ou utiliser une formule personnalisée au milieu d'une autre formule.) Ceux-ci nécessitent plus que la vérification des touches, nous aurions besoin de regarder le contenu actuel de la barre de formule ou de la cellule au milieu de l'édition. Cela peut également être accompli avec certaines bibliothèques de DLL importées et gérer le piratage. Cela vaut certainement la peine d'être exploré.
Alain
-1

Qu'est-ce que XLL?

Un XLL est une DLL qui exporte plusieurs procédures appelées par Excel ou le Gestionnaire de compléments Excel. http://msdn.microsoft.com/en-us/library/office/bb687861.aspx

Comment développez-vous le XLL?

Excel XLL SDK avec Visual C ++ (ou tout ce qui peut compiler une DLL et appeler les procédures du SDK)

Où puis-je trouver un guide rapide pour créer un XLL simple?

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

Comment obtenir des info-bulles?

  1. Implémentez votre fonction en tant que procédure et exportez-la
  2. Mettre en œuvre et exporter la procédure xlAutoOpen (void) - http://msdn.microsoft.com/en-us/library/office/bb687860.aspx
  3. xlAutoOpen a juste besoin d'appeler xlfRegister - http://msdn.microsoft.com/en-us/library/office/bb687900.aspx
  4. Pour les info-bulles, une attention particulière pour: pxArgumentText, pxFunctionHelp, pxArgumentHelp1

Malheureusement, le complément Analysis Toolpak n'a pas non plus d'infobulles.

Ma solution était erronée, mais avec des informations erronées publiées par l'affiche originale. Affichage d'une image avec BINOMDIST, si son lien montre clairement que ce n'est pas une fonction de ANALYS32.xll.

Cela signifie que j'essayais de résoudre une question impossible. Parce qu'il n'y a pas de XLL qui puisse faire ce que l'affiche a demandé. Si vous trouvez une version d'Excel qui affiche des info-bulles de XLL, veuillez me le faire savoir.

À propos de ce que l'affiche a demandé, en essayant d'imiter le comportement XLL, je suis sûr que ma réponse était la plus correcte par rapport à ce que fait ANALYS32.xll.

Marcos Zolnowski
la source
3
Malheureusement, l'enregistrement d'un UDF avec xlfRegister ne fait pas qu'Excel affiche ces informations sous forme d'infobulles Intellisense dans la feuille. Les descriptions, etc. qui y sont enregistrées ne sont affichées que dans la boîte de dialogue Arguments de fonction, qui apparaît lorsque vous appuyez sur le bouton fx. Mais ce n'est pas ce que demande l'affiche originale.
Govert
@Govert est-ce toujours comme ça maintenant en 2016?
beppe9000
@ beppe9000 Oui. Vous pouvez obtenir des info-bulles IntelliSense dans la feuille pour les UDF (définies dans un XLL ou VBA) en utilisant l'extension Excel-DNA IntelliSense: github.com/Excel-DNA/IntelliSense
Govert