Wie man die Prozedur oder Funktion name zur Laufzeit?
Ist es alle Weg, um wieder den Namen einer Funktion oder Prozedur zur Laufzeit?
Ich bin derzeit Fehlerbehandlung so etwas wie dieses:
Sub foo()
Const proc_name as string = "foo"
On Error GoTo ErrHandler
' do stuff
ExitSub:
Exit Sub
ErrHandler:
ErrModule.ShowMessageBox "ModuleName",proc_name
Resume ExitSub
End Sub
Ich vor kurzem eine meiner Konstanten lügt mich an, nachdem ich aktualisiert, eine Funktion Namen, aber nicht dem Konstanten Wert. Ich möchte den Namen der Prozedur an, mein Fehler-handler.
Ich weiß, dass ich haben, um die Interaktion mit der VBIDE.CodeModule
Objekt, um es zu finden. Ich habe mich ein bisschen meta-Programmierung mit Microsoft Visual Basic für Applications Extensibility Bibliothek, aber ich habe nicht hatte keinen Erfolg mit dabei zur Laufzeit. Ich glaube nicht, dass meine bisherigen versuche, und bevor ich Graben meine Fersen in, zu versuchen, diese wieder, ich möchte wissen, ob es überhaupt möglich gemacht haben.
Dinge, die nicht funktionieren
- Mit einigen eingebauten VBA-Bibliothek für Zugriff auf den call-stack. Es existiert nicht.
- Umsetzung meiner eigenen Aufruf-stack durch drücken und knallen, Verfahren, Namen aus einem array, wie ich Sie betreten und verlassen jeder. Dies erfordert weiterhin, dass ich übergeben Sie die proc name irgendwo sonst als string.
- Einen Dritten tool wie vbWatchDog. Diese hat Arbeit, aber ich kann nicht ein Drittanbieter-Werkzeug verwenden für dieses Projekt.
Hinweis
vbWatchdog scheint dies durch direkten Zugriff auf den kernel-Speicher über API-Aufrufe.
OnError GoTo...
stellt sich die Fehler in der aufrufenden Prozedur (nicht das Verfahren, in dem Fehler tritt, und der call stack ist nicht ausgesetzt, die Sie über VBA, das beste was ich tun konnte, war, um eine Globale string-variable, und weisen Sie die "active" - procedure-name am Anfang jeder proc. Nicht perfekt, denn ein sub kann mehrere Verfahren vor der Rücksendung auf Fehler in der "main" sub (ohne re-zuweisen der Zeichenfolge), aber nah genug für meine Bedürfnisse.Das ist eine gute Idee @DavidZemens. Ich könnte versuchen, dass es scheint, viel einfacher als messing mit der Erweiterungs-Bibliothek. Tonnen weniger Aufwand zu. Danke.
Siehe auch: cpearson.com/excel/InsertProcedureNames.aspx bestätigt "In VBA, es gibt keine Möglichkeit, programmgesteuert bestimmen, den Namen des aktuell Laufenden Verfahren. Das heißt, es gibt keine Möglichkeit für ein Verfahren zu bekommen Ihren eigenen Namen. Eine solche Funktion wäre sehr nützlich beim generieren von debug-und Diagnose-Berichte"... Und geht weiter zu beschreiben, etwas ähnliches wie das, was ich oben erwähnt. Letztlich glaube ich nicht, ti ist auch sehr sinnvoll, es sei denn jedes Verfahren hat seine eigenen Fehler-handling wegen der Einschränkung, die ich oben zitiert 🙂
Wir sind immer sehr gesprächig, aber ich vor kurzem gehackt - err... Verbessert, Steve McMahon, die registry-Klasse, so dass es funktioniert in vba. Hinzugefügt ein paar Routinen zu. Meine version auf google drive. Ich schrieb ein DSN-Klasse oben drauf.
Ich konnte nicht die
Erl
Methode zu arbeiten. Auch wenn ich nummeriert die Zeilen wie 999 On Error GoTo <label>
die Erl
Funktion zurückkehren würde 999
aber die CodeMod.Find()
würde nicht berechnen mit dem Wert 999
wie es buchstäblich sieht an der Linie 999
anstelle des alias 999
🙁InformationsquelleAutor RubberDuck | 2014-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht ganz sicher, wie hilfreich das sein wird...
Die gute Sache ist, dass Sie nicht haben, um sorgen über die sub/function name - Sie sind frei, es zu ändern. Alle, die Sie haben zu kümmern, ist die Einzigartigkeit der Fehler-handler Bezeichnung.
Beispielsweise
wenn Sie Vermeidung von duplicate error-handler-Etiketten in anderen subs/functions
nicht ⇩⇩⇩⇩⇩
dann den code unten sollte Arbeit.
Hinweis: ich habe nicht in der Lage gewesen, um es zu testen gründlich, aber ich bin sicher, Sie können Sie modifizieren und bekommen es funktionieren, wenn es von jeder Hilfe.
Hinweis: Fügen Sie Verweise auf
Visual Basic for Applications Extensibility 5.3
über Extras -> Verweise im VBEnicht sicher, warum dies wäre ein Albtraum? Alles was es braucht ist, um die einzigartigen labels und übergeben Sie es als parameter.
Das ist genau, warum. Ich denke, es wird alles in Ordnung sein. Ich würde nur noch zu aktualisieren meine
insertErrorHandling()
Routinen zu packen, wird der name der Prozedur zum erstellen der..... Fehler label-Namen. Zurück zu square one, es sei denn, ich bin fehlt etwas. Bin Ich?Ich werde akzeptiere Ihre Antwort, als Sie kam am nächsten an meine Anforderungen.
Application.VBE.ActiveCodePane.CodeModule.Name
gibt den Namen des Moduls an, die derzeit geöffnet ist im VBA-editor, nicht die, die aktuell ausgeführt wird.InformationsquelleAutor
Ich eine verknüpfte node-basierte stack-Klasse, eingewickelt in ein singleton, Global instanziert (durch Attribute)
CallStack
Klasse. Es erlaubt mir zu führen Fehler in der Handhabung wie David Zemens schlägt (das speichern wird der name der Prozedur jedes mal):Wäre es hilfreich für die Diskussion, ich kann nach den zugehörigen code. Der CallStack-Klasse hat eine
Peek
Methode, um herauszufinden, was die zuletzt genannte Funktion ist und eineStackTrace
- Funktion, um einen string-Ausgabe für den gesamten Stapel.Konkret zu deiner Frage, ich war schon immer interessiert in der Verwendung von VBA-Erweiterbarkeit hinzufügen der boiler-plate error-handling-code (wie oben) automatisch. Ich habe noch nie dazu gekommen, es tatsächlich zu tun, aber ich glaube, es ist durchaus möglich.
proc_name
konstant, wenn es nicht mit der eigentlichen Prozedur-Namen.Es ist absolut möglich. Ich benutze die Erweiterbarkeit der Bibliothek, um meine boiler-plate error-handling in meinen Modulen.
href="http://msdn.microsoft.com/en-us/magazine/dd347981.aspx" >Interessant zu Lesen. ich kann mir vorstellen, dass COM-Introspektion, die es erlauben würde, die Möglichkeit der Suche nach Namen von Klassen und Mitgliedern, aber wahrscheinlich nicht in dem aktiven VBA-Funktion:
Das ist interessant zu Lesen. Ich brauche einige Zeit um es zu verdauen ein wenig.
InformationsquelleAutor Blackhawk
Folgende nicht genau meine Frage beantworten, aber es hat mein problem zu lösen. Es müssen ausgeführt werden, während der Entwicklung, vor der Veröffentlichung der Anwendung.
Mein workaround beruht auf der Tatsache, dass alle meine Konstanten, die denselben Namen, denn ich bin mit CPearson code einfügen der Konstanten in meinem Verfahren während der Entwicklung.
Der VBIDE-Bibliothek nicht unterstützt Verfahren gut, so dass ich wickelte Sie in ein Klassenmodul mit dem Namen
vbeProcedure
.Dann habe ich noch eine Funktion um mein
DevUtilities
Modul (das ist später noch wichtig) erstellen Sie einevbeProcedure
Objekt und eine Sammlung von Ihnen.Next I Schleife durch jedes Verfahren in einem bestimmten code-Modul.
Schließlich der Aufruf der sub für jedes code-Modul in meinem Projekt aktiv ist (solange es nicht meine "DevUtilities" - Modul).
Komme ich zurück, wenn ich jemals herausfinden, auf welche Art von Zauberei vbWatchDog verwenden setzen Sie den vba-Aufruf-stack.
Ich habe letztendlich herausgefunden, dass viel aus, aber nicht in der Lage zu replizieren vbWatchdog-Funktionalität. Also, abgesehen von einigen Verbesserungen, um die Klassen hier, das ist genau das, was ich Tue. Es ist ein bisschen hässlich. Viele Kessel-Platte und es dauert ein bisschen Gedanken darüber, wo genau ein Fehler gemeldet werden sollte. Wenn Sie interessiert sind, den aktuellen Stand der Klassen, die ich hier erwähnt, werden die aktualisierten Versionen stehen in meinem VBEX repo auf Github, aber der code, den ich verwenden, um zu reparieren, meine Projekte leider nicht.
InformationsquelleAutor RubberDuck
Verwenden Err.Erhöhen
"Für den parameter Source übergeben:
InformationsquelleAutor Mark Ronollo