2013-06-04 14 views
9

Fehler in VBA-Benutzerformularen, außerhalb derer, die in dem Initialize-Ereignis auftreten, scheint nicht bis zur aufrufenden Methode bubbliert werden. Gibt es eine Möglichkeit, den Fehler zu erzwingen?Wie übergeben Fehler in VBA-Benutzerformular an aufrufende Methode

VBA Userforms enthält einen Namen userform_error Ereignis, das als

Private Sub UserForm_Error(
    ByVal Number As Integer, 
    ByVal Description As MSForms.ReturnString, 
    ByVal SCode As Long, 
    ByVal Source As String, 
    ByVal HelpFile As String, 
    ByVal HelpContext As Long, 
    ByVal CancelDisplay As MSForms.ReturnBoolean 
) 

definierte Es erscheint logisch, dass das Ereignis UserForm_Error aufgerufen wird, wenn ein Fehler in einem Benutzerformular auftritt, aber das scheint nicht der Fall zu sein . In der Tat kann ich keine Dokumentation für Userform_Error finden.

Ich habe MSDN, Bing, Google, StackOverflow, DuckDuckGo durchsucht, und ich war nicht in der Lage, eine gute Methode oder irgendeine Dokumentation zu finden, was UserForm_error tatsächlich tut.

+1

Excel VBA? Zugriff auf VBA? Kannst du Beispiel mit Code angeben, was versuchst du zu tun? – shahkalpesh

+0

Dies ist keine Microsoft Office-Anwendung. – lfrandom

+0

Ich versuche, ein Makro mit einem Benutzerformular zu erstellen. Ereignisse im Benutzerformular könnten einen Fehler enthalten. Ich möchte, dass dieser Fehler dem Hauptmodul gemeldet wird, anstatt einen Fehlerhandler in jedes Ereignis im Formular einbauen zu müssen. – lfrandom

Antwort

1

Sie könnten die Fehler in Ihrem UserForm-Code (eine Klasse) abfangen und dann in Ihrem Fehlerfangcode die Fehlerdetails an Ihren Hauptcode weitergeben, indem Sie eine Prozedur in einem Modul aufrufen.

Alternativ können Sie Ihre UserForm-Variable WithEvents im aufrufenden Code deklarieren und bei Auftreten eines Fehlers Ihr eigenes Fehlerereignis auslösen.

+0

Ich habe Angst, dass es nicht möglich ist zu deklarieren UserForm-Variable WithEvents im Standardmodul wird nicht kompiliert: Kompilierfehler: Nur gültig im Objektmodul. – dee

+0

Entschuldigung, ich nahm an, dass Sie es von einem anderen Formular aus angerufen haben, welches ein Klassenmodul ist. Sie müssten dann mit der ersten Option gehen. –

2

Also, ich habe das untersucht, weil ich das gleiche Problem hatte. Super komisch über das Error Event, aber ich konnte einige Informationen darüber finden. Wenn Sie Fehler in der Entwicklerreferenz in der IDE nachschlagen, aber nicht den Offline-Inhalt der Online-Inhalte. Das sagen sie: "Tritt auf, wenn ein Steuerelement einen Fehler erkennt und die Fehlerinformationen nicht an ein aufrufendes Programm zurückgeben kann ... Das Fehler-Ereignis wird ausgelöst, wenn ein Fehler auftritt, für den die Anwendung nicht geeignet ist." Jetzt führt mich das zu der Annahme, dass dieses Ereignis nur ausgelöst wird, wenn ein katastrophaler Fehler vorliegt. Sieht so aus, als hättest du kein Glück damit.

Es gibt keine Möglichkeit zu sprudeln, weil der Fehler des Non-Basic-Code enter image description here

um diese Mein Weg war für jeden Userform einen eigenen Fehlerbehandlung Mechanismus zu haben, irgendwie ärgerlich, aber das ist das Beste, was ich konnte, machen. Anders als das, in etwas Licht und ich meine sehr Licht und hatte keine/begrenzte Interaktion mit dem System war ich in der Lage, eine On Error Resume Next am Anfang des Codes zu tun, und sobald ich das userform überprüfte If Err.Number>0 Then Err.Raise Err.Number so den Fehler Handler fängt es ab. Wie Sie wahrscheinlich wissen, sollten Sie jedoch vorsichtig vorgehen, wenn Sie die zweite Option wählen.

Hoffe, dass hilft. Lass mich wissen, was du entscheidest.

5

Es ist schwierig, Ihnen genaue Informationen dafür zu geben, die Komponente ist alt. Nur ein bisschen Hintergrund.

Das UserForm-Objekt wird von Microsoft Forms 2.0, einer ActiveX-Komponentenbibliothek, implementiert. Es war eine universelle Bibliothek zum Hinzufügen von Formularen zu beliebigen Anwendung, es war nicht nur auf Office-Anwendungen beschränkt. Sie finden es wieder auf Ihrem Computer in C: \ Windows \ syswow64 \ fm20.dll (System32 für eine 32-Bit-Maschine). Die Dokumentation für diese Komponente wurde früher von fm20.chm bereitgestellt. Diese Hilfedatei ist nicht mehr von Microsoft verfügbar, Sie können sie immer noch mit einer Google-Abfrage finden. Allerdings sehen die meisten Websites, die es anbieten, sehr schattig aus. This one sah am wenigsten schleimig aus. Das Anzeigen dieser Datei ist ziemlich mühsam, ich kann das Inhaltsverzeichnis durchsuchen, aber keine der Seiten zeigt Text mehr an.

Eine Problemumgehung, die ich fand, war, die Datei mit dem HTML Workshop-Dienstprogramm zu dekompilieren. Das erzeugt eine Datei namens f3evtError.htm, es wie folgt aus (bearbeitet für den Inhalt) aussieht:


Fehler Ereignis

Tritt ein, wenn ein Steuerelement einen Fehler erkennt und nicht die Fehlerinformation zu einem Aufrufprogramm zurück.

Syntax

Private Sub object_Error(ByVal Number As Integer, ByVal Description As MSForms.ReturnString, _ 
    ByVal SCode As SCode, ByVal Source As String, ByVal HelpFile As String, _ 
    ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean) 

Die Fehlerereignissyntax besteht aus folgenden Teilen:

  • Objekt Erforderlich. Ein gültiger Objektname.
  • Index: Erforderlich. Der Index der Seite in einer MultiPage, die diesem Ereignis zugeordnet ist.
  • Nummer: Erforderlich. Gibt einen eindeutigen Wert an, mit dem das Steuerelement den Fehler identifiziert.
  • Beschreibung: Erforderlich. Eine textuelle Beschreibung des Fehlers.
  • SCode: Erforderlich. Gibt den OLE-Statuscode für den Fehler an. Die niederwertigen 16 Bits geben einen Wert an, der mit dem Number-Argument identisch ist.
  • Quelle: Erforderlich. Die Zeichenfolge, die das Steuerelement identifiziert, das das Ereignis ausgelöst hat.
  • HelpFile: Erforderlich. Gibt einen vollständig qualifizierten Pfadnamen für die Hilfedatei an, die den Fehler beschreibt.
  • HelpContext: Erforderlich. Gibt die Kontext-ID des Hilfedateithemas an, das eine Beschreibung des Fehlers enthält.
  • CancelDisplay: Erforderlich. Gibt an, ob die Fehlerzeichenfolge in einem Meldungsfeld angezeigt werden soll.

Bemerkungen

Der Code für das Fehlerereignis geschrieben bestimmt, wie die Steuerung an den Fehlerzustand reagiert.

Die Fähigkeit, Fehlerbedingungen zu handhaben, variiert von Anwendung zu Anwendung. Das Fehlerereignis wird ausgelöst, wenn ein Fehler auftritt, für den die Anwendung nicht eingerichtet ist.


Das ist alles, leider. Es ist vage, weil die Komponente in so vielen verschiedenen Arten von ActiveX-Hosts verwendet werden kann und die Fehlerbehandlung ein Detail der Host-Implementierung ist. Ich denke, der letzte Absatz ist das, worüber du wirklich fragst. Ich würde sagen, es ist ziemlich sicher davon auszugehen, dass diese Office-Apps dieses Ereignis nicht auslösen, da die Office-Dokumentation dies nicht erwähnt. Die Tatsache, dass das Ereignis noch im VBA-Editor sichtbar ist, ist nur ein Nebeneffekt der Funktionsweise des Objektmodells. Es gibt keine einfache Möglichkeit für den Editor, es herauszufiltern, es zeigt einfach alle der veröffentlichten Ereignisse des Objekts an.

Verwandte Themen