So platzieren Sie einen Tooltip für eine benutzerdefinierte Funktion

78

Wie füge ich in Excel 2007 einer benutzerdefinierten Funktion eine Beschreibung und Parameterhinweise hinzu? Wenn ich einen Funktionsaufruf für eine integrierte Funktion eingebe, zeigt Excel eine Beschreibung und eine Parameterliste an - eine QuickInfo. Ich möchte dasselbe für die von mir definierten Funktionen tun.

Nicht nur für die Formel einfügen Assistenten, aber in der Formel - Box, also wenn ich Schlüssel "=myFun(", bei der "("die Tooltip erscheint genau wie es funktioniert für"=average("

Es gibt keine Hilfe in der VBA-Hilfe, keine in MSDN und keine in einem der Excel- und VBA-Foren, die ich finden kann. Dies ist also eindeutig ein langer Weg.

Marc Thibault
quelle
Kein Tooltip ... aber etwas ... xcell05.free.fr/english/index.html HTH!
Dr. Belisarius
Danke b. Es sieht ein wenig beängstigend aus, aber wenn es funktioniert, ist es eine Lösung.
Marc Thibault
Dies wird jetzt für VBA und andere Arten von Add-Ins (.NET, Python usw.) mit der Excel-DNA IntelliSense-Erweiterung unterstützt: excel-dna.net/2016/11/24/…
Govert
Normalerweise gebe ich meinen Benutzern die Anweisung, = myfunction ("help") einzugeben, um die Syntaxhilfe zu erhalten, und gebe einfach eine if-Anweisung ein, um den Intellisense zurückzugeben. neugierig, ob Goverts Ansatz auch funktioniert.
Clouse24

Antworten:

59

Die professionelle Excel-Entwicklung von Stephen Bullen beschreibt das Registrieren von UDFs, sodass eine Beschreibung im Dialogfeld Funktionsargumente angezeigt werden kann:

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

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

Geben Sie den Funktionsnamen ein und drücken Sie, um das Dialogfeld Funktionsargumente anzuzeigen CtrlA. Alternativ können Sie in der Formelleiste auf das Symbol "fx" klicken:

Geben Sie hier die Bildbeschreibung ein

Fionnuala
quelle
Neue Argumente in der Methode ermöglichen die Beschreibung von Funktionsparametern.
Wilhelm
Ich verstehe es immer noch nicht. Können Sie es bitte einfacher machen? Ist IFERROR die ursprüngliche Funktion, in der Sie die Beschreibung anzeigen, oder ist es eine Hilfsfunktion, die zum Registrieren der UDF benötigt wird?!
Schwarz
1
Einige Jahre später ist IFERROR die ursprüngliche Funktion. (un) RegisterUFD sind die Helfer, die den Hilfetext (un) darauf anwenden.
Felício
96

Keine Tooltip-Lösung, aber eine angemessene Problemumgehung:

Beginnen Sie mit der Eingabe der UDF =MyUDF(und drücken Sie CTRL+ Shift+. AIhre Funktionsparameter werden angezeigt. Solange diese Parameter aussagekräftige Namen haben, haben Sie zumindest eine brauchbare Eingabeaufforderung

Zum Beispiel:

=MyUDF(+ CTRL+ Shift+A

Wird daraus:

=MyUDF(sPath, sFileName)

AutomationMan
quelle
4
Trotz der Zweifel der Leute, dass es OP hilft, ist dies die am besten bewertete Eingabe im Thread (meine Stimme eingeschlossen). Was beweist, dass es bei SO nicht darum geht, bestimmten OP zu helfen, sondern darum, der Gemeinschaft im Allgemeinen zu helfen. Vielen Dank.
Hypers
12

Ich weiß, dass Sie eine Antwort darauf akzeptiert haben, aber es gibt jetzt eine Lösung, mit der Sie ein Vervollständigungsfeld für den Intellisense-Stil wie für die anderen Excel-Funktionen über ein Excel-DNA-Add-In oder durch Registrierung eines Intellisense-Servers in Ihrem Fenster öffnen können eigenes Add-In. Siehe hier .

Jetzt bevorzuge ich die C # -Methode - es ist viel einfacher, da in Excel-DNA jede Klasse, die implementiert IExcelAddinwird, vom Add-In- Framework aufgenommen wird AutoOpen()und AutoClose()ausgeführt wird, wenn Sie das Add-In öffnen / schließen. Sie benötigen dies also nur ::

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

und dann (und dies wird nur von der Github-Seite übernommen) müssen Sie nur die ExcelDNA-Annotationen für Ihre Funktionen verwenden:

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

Der Intellisense-Server, der mit den ExcelDNA-Annotationen kommentiert wird, nimmt die Argumentnamen und Beschreibungen auf.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Es gibt Beispiele für die Verwendung nur mit VBA, aber ich bin nicht zu sehr mit meinem VBA beschäftigt, daher verwende ich diese Teile nicht.

werden
quelle
1
Hier finden Sie eine Beschreibung der Verwendung der Excel-DNA IntelliSense-Erweiterung mit VBA: fastexcel.wordpress.com/2016/10/07/…
Govert
8

Ich erstelle gerade eine "Hilfe" -Version der Funktion. Wird bei der automatischen Vervollständigung direkt unter der Funktion angezeigt. Der Benutzer kann sie stattdessen in einer benachbarten Zelle für Anweisungen auswählen.

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

Die Wagenrückläufe verbessern die Lesbarkeit bei aktiviertem Zeilenumbruch. 2 Fliegen mit einer Klappe, jetzt hat die Funktion einige Unterlagen.

Scott K.
quelle
2
Ich mag diese Methode, weil sie all die verrückten Dinge vermeidet, die Sie tun müssen, wenn Sie echte Excel-ähnliche Tooltips für Ihre UDFs wünschen .
Marcus Mangelsdorf
Dies scheint eine großartige Idee zu sein. Wenn der Benutzer aufpasst, wird die alternative UDF mit dem Suffix _Help angezeigt. Ich habe es selbst versucht. Ich habe aber keine gute Zeit damit. Es durchläuft Neuberechnungszyklen, manchmal bis ich eine Zirkelreferenzwarnung erhalte. Ich bin mir nicht sicher, worum es geht. Keine Präzedenzfälle, nur eine Nullzeichenfolge an die Zelle zurückgeben. Bevor jemand fragt, habe ich keine application.volatile (entweder wahr oder falsch) in meiner UDF.
RiderBill
6

Sie können dieses Makro auch verwenden, um Argumenten und der UDF Beschreibungen zuzuweisen:

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

Dank an Kendall und den Originalbeitrag hier . Für die UDF-Kategorien

Rafa Barragan
quelle
Ich habe es in Workbook_Open () platziert und es muss öffentlich sein. Funktioniert hier in Excel 2013. Ausgezeichnet!
chingNotCHing
5

Die Methode von @ will ist die beste. Fügen Sie einfach ein paar Zeilen über die Details für die Personen hinzu, die ExcelDNA zuvor nicht wie ich verwendet haben.

Laden Sie Excel-DNA IntelliSense von https://github.com/Excel-DNA/IntelliSense/releases herunter

Es gibt zwei Versionen, eine für 64, überprüfen Sie Ihre Excel-Version. Für meinen Fall verwende ich die 64-Version.

Öffnen Sie Excel / Developer / Add-Ins / Browse und wählen Sie ExcelDna.IntelliSense64.xll aus.

Fügen Sie ein neues Blatt ein, ändern Sie den Namen in " IntelliSense " und fügen Sie eine Funktionsbeschreibung als https://github.com/Excel-DNA/IntelliSense/wiki/Getting-Started hinzu

Dann genieße es! :) :)

Geben Sie hier die Bildbeschreibung ein

Fischer
quelle
2

Leider gibt es keine Möglichkeit, QuickInfos für UDF-Argumente hinzuzufügen.
Um Remous Antwort zu erweitern, finden Sie unter http://www.jkp-ads.com/Articles/RegisterUDF00.asp einen umfassenderen, aber komplexeren Ansatz für Beschreibungen des Funktionsassistenten

Charles Williams
quelle
Seit Office 2010 können Argumente über diese Antwort kommentiert werden .
Wilhelm
@ Wilhelm, das ist richtig, bietet aber auch in XL 2010 noch keine Tooltips
Charles Williams
1

Viel um die Antwort herum zu tanzen. Sie können die UDF-Kontexthilfe hinzufügen, müssen jedoch das Modul exportieren und den Inhalt in einem Texteditor bearbeiten und dann erneut in VBA importieren. Hier ist das Beispiel von Chip Pearson: Hinzufügen von Code-Attributen

RexBarker
quelle
0

Ich habe den Ansatz von @ ScottK ausprobiert, zuerst als Nebenfunktion meiner funktionalen UDF, dann als eigenständige _Help-Suffix-Version, als ich auf Probleme stieß (siehe unten). Im Nachhinein ist der letztere Ansatz ohnehin besser - für einen Benutzer, der aufmerksam genug ist, um einen Tooltip zu sehen, offensichtlicher, und der Funktionscode wird nicht unübersichtlich.

Ich dachte mir, wenn ein unaufmerksamer Benutzer nur den Funktionsnamen eingibt und die Klammern schließt, während er darüber nachdenkt, wird Hilfe angezeigt und er ist auf dem Weg. Es schien jedoch keine gute Idee zu sein, eine Menge Text in eine einzelne Zelle zu kopieren, die ich nicht formatieren kann. Stattdessen, wenn die Funktion in eine Zelle ohne Argumente eingegeben wird, z

   = interpolateLinear() 
or
   = interpolateLinear_Help()

Eine msgBox wird mit dem Hilfetext geöffnet. Eine msgBox ist auf ~ 1000 Zeichen begrenzt, vielleicht ist es 1024. Aber das reicht (kaum 8 ^ /) für meine übermäßig ausgetrickste Interpolationsfunktion. Wenn nicht, können Sie jederzeit ein Benutzerformular öffnen und in die Stadt gehen.

Als sich das Meldungsfeld zum ersten Mal öffnete, sah es nach Erfolg aus. Es gibt jedoch einige Probleme. Zunächst muss der Benutzer natürlich wissen, dass er die Funktion ohne Argumente eingeben kann (+1 für das _Help-Suffix UDF).

Das große Problem ist, dass die msgBox mehrmals hintereinander spontan wieder geöffnet wird, während in nicht verwandten Teilen der Arbeitsmappe gearbeitet wird. Unnötig zu sagen, dass es sehr nervig ist. Manchmal geht es weiter, bis ich eine Rundschreiben-Warnung erhalte. Stelle dir das vor. Wenn eine UDF die Zellformel ändern könnte, hätte ich das getan, um sie zum Schweigen zu bringen.

Ich weiß nicht, warum Excel das Bedürfnis hat, die Formel immer wieder neu zu berechnen. Weder die eigenständige _Help-Version noch die Vollversion (im Hilfemodus) haben Präzedenzfälle oder abhängige Elemente. Es gibt nirgendwo eine application.volatile- Anweisung. Natürlich gibt die Funktion einen Wert an die aufrufende Zelle zurück. Vielleicht löst das die Neuberechnung aus? Aber genau das machen UDFs. Ich glaube nicht, dass Sie keinen Wert zurückgeben können.

Da Sie nicht ein Arbeitsblatt ändern Formel aus einer UDF, habe ich versucht , eine bestimmte Zeichenfolge --a zurückzukehren Wert --to der anrufenden Zelle (die einzige können Sie den Wert von einem UDF ändern), herauszufinden , würde ich das prüfen Zellenwert mit application.caller im nächsten Zyklus, erkennen Sie meine Zeichenfolge und wissen Sie, dass die Hilfemeldung nicht erneut angezeigt werden soll. Schien damals eine gute Idee zu sein - hat nicht funktioniert. Vielleicht habe ich in meinem Zustand ohne Schlaf etwas Dummes getan. Die Idee gefällt mir immer noch. Ich werde dies aktualisieren, wenn ich das Problem behebe. Meine schnelle Lösung bestand darin, eine Zeile in das Hilfefeld einzufügen: " Suchen Sie nur im Notfall Hilfe. Löschen Sie die beleidigende Formel, um das Elend zu beenden.

In der Zwischenzeit habe ich den Application.MacroOptions-Ansatz ausprobiert. Ziemlich einfach und es sieht professionell aus. Nur ein Problem zu lösen. Ich werde später eine separate Antwort auf diesen Ansatz veröffentlichen.

riderBill
quelle