web-dev-qa-db-fra.com

Comment mettre une info-bulle sur une fonction définie par l'utilisateur

Dans Excel 2007, comment ajouter une description et des indicateurs de paramètre à une fonction définie par l'utilisateur? Lorsque je commence à saisir une invocation de fonction pour une fonction intégrée, Excel affiche une description et une liste de paramètres - une info-bulle. J'aimerais faire la même chose pour les fonctions que je définis.

Pas seulement pour l'assistant d'insertion de formule, mais dans la zone de formule, donc si je saisis "=myFun(", l'info-bulle apparaît comme dans "(", exactement comme pour "=average("

Il n'y a pas d'aide dans l'aide VBA, aucune sur MSDN et aucune des forums dédiés à Excel et à VBA que je peux trouver, il s'agit donc clairement d'un long plan.

65
Marc Thibault

Professional Excel Development de Stephen Bullen explique comment enregistrer des fichiers UDF, ce qui permet d’afficher une description dans la boîte de dialogue Arguments de la fonction:

Function IFERROR(ByRef ToEvaluate As Variant, ByRef Default As Variant) As Variant
    If IsError(ToEvaluate) Then
        IFERROR = Default
    Else
        IFERROR = ToEvaluate
    End If
End Function

Sub RegisterUDF()
    Dim s As String
    s = "Provides a shortcut replacement for the common worksheet construct" & vbLf _
    & "IF(ISERROR(<expression>, <default>, <expression>)"

    Application.MacroOptions macro:="IFERROR", Description:=s, Category:=9
End Sub

Sub UnregisterUDF()
    Application.MacroOptions Macro:="IFERROR", Description:=Empty, Category:=Empty
End Sub

De: http://www.ozgrid.com/forum/showthread.php?t=78123&page=1

Pour afficher la boîte de dialogue Arguments de la fonction, tapez le nom de la fonction et appuyez sur CtrlA. Sinon, cliquez sur le symbole "fx" dans la barre de formule:

enter image description here

53
Fionnuala

Pas une solution d'info-bulle mais une solution de contournement adéquate:

Commencez à taper le code UDF =MyUDF( puis appuyez sur CTRL + Shift + A et vos paramètres de fonction seront affichés. Tant que ces paramètres ont des noms significatifs, vous avez au moins une invite viable

Par exemple, ceci:

=MyUDF(CTRL + Shift + A

Se transforme en ceci:

=MyUDF(sPath, sFileName)

86
AutomationMan

Je sais que vous avez accepté une réponse à cette question, mais il existe maintenant une solution qui vous permet d'afficher une boîte de dialogue de style IntelliSense comme pour les autres fonctions Excel, via un complément Excel-DNA ou en enregistrant un serveur intellisense dans votre ordinateur. propre add in. Voir ici .

Maintenant, je préfère la manière de faire C # - c'est beaucoup plus simple, car dans Excel-DNA, toute classe implémentant IExcelAddin est récupérée par le framework d'addin et a AutoOpen() et AutoClose() à l'exécution/fermeture de l'add-in. juste besoin de ceci:

namespace MyNameSpace {
    public class Intellisense : IExcelAddIn {
        public void AutoClose() {
        }
        public void AutoOpen() {
            IntelliSenseServer.Register();
        }
    }
}

et ensuite (et cela vient de la page github), il vous suffit d’utiliser les annotations ExcelDNA sur vos fonctions:

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

annotés à l’aide des annotations ExcelDNA, le serveur intellisense récupérera les noms et les descriptions des arguments.

 enter image description here  enter image description here

Il existe des exemples d'utilisation de VBA uniquement, mais je ne suis pas trop dans mon VBA, je n'utilise donc pas ces parties.

8
will

Je viens de créer une version "aide" de la fonction. S'affiche juste en dessous de la fonction en saisie semi-automatique - l'utilisateur peut la sélectionner à la place dans une cellule adjacente pour des instructions.

Public Function Foo(param1 as range, param2 as string) As String

    Foo = "Hello world"

End Function

Public Function Foo_Help() as String

Foo_Help = "The Foo function was designed to return the Foo value for a specified range a cells given a specified constant." & CHR(10) & "Parameters:" & CHR(10)
& "  param1 as Range   :   Specifies the range of cells the Foo function should operate on." & CHR(10)
&"  param2 as String  :   Specifies the constant the function should use to calculate Foo"
&" contact the Foo master at [email protected] for more information."

END FUNCTION

Les retours de chariot améliorent la lisibilité avec Word Wrap. 2 oiseaux avec une pierre, la fonction a maintenant une documentation.

7
Scott K

Vous pouvez aussi utiliser cette macro pour assigner des descriptions aux arguments et à la FDU:

Private Sub RegisterMyFunction()
Application.MacroOptions _
    Macro:="SampleFunction", _      '' Your UDF name
    Description:="calculates a result based on provided inputs", _
    Category:="My UDF Category", _  '' Or use numbers, a list in the link below
    ArgumentDescriptions:=Array( _  '' One by each argument
        "is the first argument.  tell the user what it does", _
        "is the second argument.  tell the user what it does")
End Sub

Crédits à Kendall et à l'article original ici . Pour les Catégories UDF

2
Rafa Barragan

Beaucoup de danse autour de la réponse. Vous pouvez ajouter l'aide contextuelle UDF, mais vous devez exporter le module et modifier le contenu dans un éditeur de texte, puis le réimporter dans VBA. Voici l'exemple de Chip Pearson: Ajout d'attributs de code

2
RexBarker

Malheureusement, il n’ya aucun moyen d’ajouter des info-bulles pour les arguments UDF.
Pour étendre la réponse de Remou, vous pouvez trouver une approche plus complète, mais plus complexe, des descriptions de la fonction Wizard à
http://www.jkp-ads.com/Articles/RegisterUDF00.asp

2
Charles Williams

La méthode de @ will est la meilleure. Ajoutez juste quelques lignes sur les détails pour les personnes qui n’utilisaient pas ExcelDNA auparavant comme moi.

Téléchargez Excel-DNA IntelliSense à partir de https://github.com/Excel-DNA/IntelliSense/releases

Il existe deux versions, une pour 64, vérifiez votre version Excel. Pour mon cas, j'utilise la version 64.

Ouvrez Excel/Developer/Add-Ins/Browse et sélectionnez ExcelDna.IntelliSense64.xll.

Insérez une nouvelle feuille, changez le nom en "IntelliSense", ajoutez une description de la fonction, comme https://github.com/Excel-DNA/IntelliSense/wiki/Getting-Started

Alors profitez-en! :)

 enter image description here

1
Fisher

J'ai essayé l'approche de @ ScottK, d'abord en tant que fonctionnalité secondaire de mon fichier UDF fonctionnel, puis en tant que version autonome du suffixe _Help lorsque j'ai rencontré des problèmes (voir ci-dessous). Avec le recul, cette dernière approche est quand même préférable - elle est plus évidente pour un utilisateur assez attentif pour voir une info-bulle, et elle n’encombre pas le code fonctionnel.

Je me suis dit que si un utilisateur inattentif se contentait de taper le nom de la fonction et de fermer les parenthèses pendant qu'il y réfléchissait, de l'aide apparaitrait et il arriverait. Mais déposer un tas de texte dans une seule cellule que je ne pouvais pas formater ne semblait pas être une bonne idée. Au lieu de cela, lorsque la fonction est entrée dans une cellule sans argument, c'est-à-dire.

   = interpolateLinear() 
or
   = interpolateLinear_Help()

un msgBox s'ouvre avec le texte d'aide. Une msgBox est limitée à environ 1 000 caractères, peut-être 1024. Mais cela suffit (à peine 8 ^ /) pour ma fonction d'interpolation trop élaborée. Si ce n'est pas le cas, vous pouvez toujours ouvrir un formulaire utilisateur et vous rendre en ville.

La première fois que la boîte de message s'est ouverte, cela semblait être un succès. Mais il y a quelques problèmes. Bien sûr, l'utilisateur doit d'abord savoir qu'il doit entrer la fonction sans argument (+1 pour le suffixe _Help UDF).

Le problème avec big est que la msgBox rouvre plusieurs fois de suite, spontanément, tout en travaillant dans des parties non reliées du classeur. Inutile de dire que c'est très ennuyeux. Parfois, cela continue jusqu'à ce que je reçois un avertissement de référence circulaire. Allez comprendre. Si un fichier UDF pouvait changer la formule de la cellule, j'aurais fait cela pour la faire taire.

Je ne sais pas pourquoi Excel ressent le besoin de recalculer la formule encore et encore; ni _Help autonome, ni la version complète (en mode aide) n'a de précédents ou de personnes à charge. Il n'y a pas d'instruction application.volatile nulle part. Bien entendu, la fonction renvoie une valeur à la cellule appelante. Peut-être que cela déclenche la recalcul? Mais c'est ce que font les FDU. Je ne pense pas que vous puissiez pas renvoyer une valeur.

Étant donné que vous ne pouvez pas modifier une feuille de calcul formule à partir d'un fichier UDF, j'ai essayé de renvoyer une chaîne spécifique --a valeur - dans la cellule appelante (la seule que vous pouvez modifier le valeur depuis un fichier UDF), en supposant que j'inspecterais la valeur de cellule à l'aide de application.caller au cycle suivant, repérer ma chaîne et savoir ne pas afficher à nouveau le message d'aide. Cela semblait être une bonne idée à l'époque - cela n'a pas fonctionné. Peut-être que j'ai fait quelque chose de stupide dans mon état de manque de sommeil. J'aime toujours l'idée. Je mettrai à jour ceci quand (si) je résoudrai le problème. Ma solution rapide a été d’ajouter une ligne dans la boîte d’aide: "Ne cherchez de l’aide qu'en cas d’urgence. Supprimez la formule incriminée pour mettre fin à la misère.

En attendant, j'ai essayé l'approche Application.MacroOptions. Assez facile, et ça a l'air professionnel. Juste un problème à résoudre. Je posterai une réponse séparée sur cette approche plus tard.

0
riderBill