{"id":55000641,"date":"2008-12-01T00:00:00","date_gmt":"2021-03-22T16:20:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=641"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBAFehlerbehandlung_revolutioniert","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/","title":{"rendered":"VBA-Fehlerbehandlung revolutioniert"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es kracht hin und wieder beim Ausf&uuml;hren Ihres VBA-Codes und Sie klicken auf die Debuggen-Schaltfl&auml;che der Fehlermeldung Macht nichts &#8211; das kommt vor. Sie verteilen Ihr Werk und der Benutzer berichtet von seltsamen Fenstern und sich &ouml;ffnendem VBA-Editor Weniger sch&ouml;n. Sie liefern Ihre Datenbank mit der Access-Runtime aus und der Kunde meldet ungehalten, dass sich die Anwendung allenthalben einfach schlie&szlig;e Sp&auml;testens dann ist Schluss. Es geht aber auch anders &#8230;<\/b><\/p>\n<p>Die Fehlerbehandlung ist fester Bestandteil jedes Programmcodes &#8211; oder sollte es zumindest sein. Es ist sicher legitim, w&auml;hrend der Entwicklung einer Prozedur oder eines Moduls Fehlerbehandlungsmechanismen au&szlig;en vor zu lassen. Das ist im Gegenteil sogar hilfreich, weil bei auftretenden Fehlern der VBA-Debugger an der richtigen Stelle anh&auml;lt, diese markiert und Sie nun etwa Variablen auf falsche Werte inspizieren k&ouml;nnen. Sobald jedoch andere Benutzer oder sogar Kunden mit der Anwendung arbeiten, sollten Fehlerbehandlungen in allen Prozeduren eingebaut sein, damit die Benutzer nicht mit kryptischen Meldungen konfrontiert werden oder gar den VBA-Editor zu Gesicht bekommen.<\/p>\n<p>Besonders wichtig ist das, wenn Ihre Datenbank mit der Runtime-Version von Access gestartet wird, denn diese verzeiht keine Nachl&auml;ssigkeiten und beendet sich kurzerhand bei jedem unbehandelten Fehler selbst. Das kann auch Datenverlust nach sich ziehen.<\/p>\n<p>M&ouml;glichkeiten zur Fehlerbehandlung von VBA-Routinen wurden in Access im Unternehmen bereits vielfach dargestellt. Ob Sie in den Zweig zur Fehlerauswertung einfach eine schn&ouml;de Messagebox setzen, die die Fehlerbeschreibung ausgibt, oder die Fehlerbearbeitung an eine separate Fehlerfunktion delegieren, die sich um Ausgabe, Loggen oder gar Versenden per E-Mail k&uuml;mmert, von einer Arbeit kann Sie niemand befreien: In jede einzelne Prozedur Ihres Projekts m&uuml;ssen entsprechende Anweisungen geschrieben werden, die das Verhalten bei einem auftretenden Fehler regeln.<\/p>\n<p>Zwar erleichtern Ihnen Hilfsmittel, wie die MZ-Tools, die Arbeit beim Anlegen eines Rahmens zur Fehlerbehandlung und optional beim Durchnummerieren der Code-Zeilen. Im Eifer des Gefechts wird es Ihnen versehentlich aber sicher immer wieder passieren, dass Sie mal schnell eine Funktion in ein Modul hineinschreiben, die ohne Fehlerbehandlung bleibt. Lehnen Sie sich zur&uuml;ck! Mit dem brandneuen <b>SimplyVBA Global VBA Error Handler<\/b> [1] hat Wayne Phillips von <b>everythingaccess.com <\/b>eine revolution&auml;re Schnittstelle geschaffen, die Fehlerbehandlung unter VBA auf ein neues Level hebt, ganz neue Konzepte erschlie&szlig;t und Sie in Zukunft ruhig schlafen l&auml;sst.<\/p>\n<p><b>The SimplyVBA Global Error Handler &#8211; SVGEH<\/b><\/p>\n<p>Der Name Wayne Phillips d&uuml;rfte den meisten Access-Entwicklern kein Begriff sein. Er ist kaum in Foren pr&auml;sent, kein MVP und doch m&ouml;glicherweise der Entwickler mit den tiefsten Kenntnissen zu Interna von Access und VBA weltweit &#8211; au&szlig;erhalb des Microsoft Entwickler-Teams selbstredend.<\/p>\n<p>Seine englische Firma <b>Everythingaccess.com <\/b>aka iTechMasters dagegen k&ouml;nnte dem einen oder anderen bereits beim Surfen begegnet sein: Dort wird ein Service zum Dekompilieren von Access-MDE-Datenbanken angeboten. Niemand sonst kann seit zwei Jahren einen solchen Dienst anbieten. Karl Donaubauer berichtete in der Ausgabe 4\/2006 von Access im Unternehmen dar&uuml;ber. Ich hatte die Ehre, zur Runde der Beta-Tester des Global Error Handlers zu geh&ouml;ren, mit einigen Vorschl&auml;gen an der Entwicklung teilhaben zu d&uuml;rfen und dabei einige Hintergr&uuml;nde &uuml;ber die Wirkungsweise der Schnittstelle zu erfahren. Rein &auml;u&szlig;erlich handelt es sich um eine ActiveX-DLL, die, zumindest in der Freeware-Version, in die Verweise der eigenen Datenbank, also des VBA-Projekts, aufgenommen wird. Sie klinkt sich au&szlig;erdem bei Registrierung, wahlweise &uuml;ber ein Setup oder &uuml;ber <b>regsvr32<\/b>, als COM-Addin in Access ein. &Uuml;ber den Aufruf einer einzigen Methode in der Schnittstellenbibliothek ver&auml;ndert sich der VBA-Debugger komplett und leitet alle Fehlerereignisse an eine w&auml;hlbare eigene Prozedur weiter &#8211; ganz unabh&auml;ngig davon, wo sich der Fehler ereignet und ob Sie Statements zur Fehlerbehandlung in den Prozeduren Ihres Projekts implementiert haben.<\/p>\n<p>Selbst Fehler, die im VBA-Direktfenster ausgel&ouml;st werden, landen dann bei dieser Prozedur, in deren Ablauf beliebige Fehlerauswertungen vorgenommen werden k&ouml;nnen.<\/p>\n<p><b>Wie hat er das gemacht<\/b><\/p>\n<p>Bevor ich Ihnen die Verfahrensweisen im Umgang mit dem Global Error Handler beschreibe, soll erw&auml;hnt werden, was da intern vor sich geht. Wayne Phillips hat die DLL mit Borland C++ entwickelt und auch vor Assembler-Einsatz nicht Halt gemacht. Der Grund daf&uuml;r ist, dass das Ausschalten des VBA-internen Debuggers und das Weiterleiten von Fehlerereignissen an eine benutzerdefinierte Funktion sich nur mit einem Patchen der geladenen VBA-System-DLLs erreichen l&auml;sst. Das passiert, wohlgemerkt, nur im Access zugewiesenen Arbeitsspeicher und ver&auml;ndert nicht etwa Dateien von Access oder VBA. Um dies zu erreichen, also gesch&uuml;tzte Speicherbereiche zu manipulieren, m&uuml;ssen scharfe API-Gesch&uuml;tze aufgefahren werden. Man k&ouml;nnte nun misstrauisch werden, ob solche tief greifenden Manipulationen nicht die Stabilit&auml;t von VBA gef&auml;hrden. Tats&auml;chlich kann ich aber seit einigen Versionen der DLL von keinem einzigen Absturz oder irgendwelchen Unzul&auml;nglichkeiten oder Fehlfunktionen in allen Testprojekten berichten. Wayne Phillips ist, davon abgesehen, ein zug&auml;nglicher Entwickler, der Bugs au&szlig;erordentlich schnell behebt. Sollten Sie problematisches Verhalten des Error Handlers feststellen, dann z&ouml;gern Sie nicht, ihm dies in einer kurzen E-Mail mitzuteilen &#8211; dann allerdings in Englisch.<\/p>\n<p><b>Der VBA-Debugger<\/b><\/p>\n<p>Ein Ausflug in die Funktionsweise des VBA-Debuggers soll zun&auml;chst kl&auml;ren, wie VBA mit Fehlern umgeht.<\/p>\n<p>Dazu legen wir eine einfache Prozedur an, die absichtlich einen Fehler hervorruft:<\/p>\n<pre>Sub LetItCrash\r\n    Dim obj As Object\r\n    Set obj = CreateObject(&quot;Sascha.Trowitzsch&quot;)\r\nEnd Sub<\/pre>\n<p>Hier wird versucht, ein COM-Objekt zu erzeugen, das es (nach meiner Kenntnis) gar nicht gibt. Beim Ausf&uuml;hren der Prozedur werden wir folglich mit dem Fehlerdialog des VBA-Debuggers konfrontiert (siehe Bild 1). Der Benutzer Ihrer Anwendung wird erst mal ratlos sein, was das zu bedeuten hat, und anschlie&szlig;end m&ouml;glicherweise die Eingabetaste dr&uuml;cken, weil der Begriff <b>Debuggen <\/b>so chic aussieht und ohnehin den Fokus hat.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/debugmsg_opt.jpeg\" alt=\"debugmsg.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Eine konventionelle VBA-Fehlermeldung<\/span><\/b><\/p>\n<p>Das jedoch ist der denkbar ung&uuml;nstigste Fall, weil sich nun ein Fenster &ouml;ffnet, von dem er noch nicht mal wei&szlig;, ob es zu Ihrer Anwendung geh&ouml;rt und ob er hier Daten eingeben soll, weil er bei der Schulung geschlafen hat (siehe Bild 2). Aber verfolgen wir lieber nicht, wie der Benutzer in seiner Verwirrung weiter verf&auml;hrt&#8230; &#8230;<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/debugline_opt.jpeg\" alt=\"debugline.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Eine Fehlermeldung im VBA-Editor<\/span><\/b><\/p>\n<p><b>Was hat VBA gemacht<\/b><\/p>\n<p>Wenn VBA auf eine Zeile st&ouml;&szlig;t, die es nicht ausf&uuml;hren kann, weil Syntax oder Werte nicht seinen Regeln entsprechen, dann schaut es zun&auml;chst nach, in welchem Modus sich sein Debugger befindet. Dieser Modus kann durch <b>On Error<\/b>-Direktiven im Code gesteuert werden. In unserem Prozedurbeispiel gibt es keine solche Direktive und der Modus des Debuggers ist damit quasi auf &#8222;Interaktiv&#8220; geschaltet, was bedeutet, dass VBA nun Entscheidungshilfe ben&ouml;tigt, wie es mit dem Fehler weiter umgehen soll. Da es dar&uuml;ber keine Informationen aus dem VBA-Projekt selbst bekommt, fragt es eben beim Benutzer nach und pr&auml;sentiert den Fehlerdialog, nachdem es vorsorglich den Code in gelb markierter Zeile angehalten hat (siehe Bild 2).<\/p>\n<p>Wenn Sie die Debuggen-Schaltfl&auml;che bet&auml;tigen, dann gelangen Sie genau zu dieser Zeile und haben nun noch die M&ouml;glichkeit, die Zeile syntaktisch oder durch andere Variablenwerte zu korrigieren &#8211; etwa die <b>ProgID <\/b>des zu erzeugenden COM-Objekts auf <b>Forms.Form.1<\/b> zu &auml;ndern. VBA versucht dann, die korrigierte Zeile nochmals auszuf&uuml;hren. Klicken Sie hingegen die Beenden-Schaltfl&auml;che, dann bricht VBA die Ausf&uuml;hrung des Codes ab und zerst&ouml;rt nebenbei noch s&auml;mtliche lokalen und globalen Variablen, die Sie m&ouml;glicherweise in Ihrem Projekt untergebracht haben. Der Gedanke dahinter ist der, dass VBA wegen des nicht weiter ausgef&uuml;hrten Codes vorlaut davon ausgeht, dass die Werte der Variablen nun wahrscheinlich eh nicht mehr passen. <\/p>\n<p>Nicht unerw&auml;hnt sollte bleiben, dass dies nur das Verhalten unter der Vollversion von Access ist. Die Runtime-Version erlaubt ja keinen Einblick in die VBA-Entwicklungsumgebung und ein Debuggen-Knopf im Fehlerdialog ergibt somit keinen Sinn. Die Runtime stuft jeden VBA-Fehler als kritisch ein und beendet die Datenbank kurzerhand, nachdem sie den Benutzer recht wortkarg &uuml;ber die Ursache informiert (siehe Bild 3). All diese unsch&ouml;nen Auswirkungen unterlassener Anweisungen zur Fehlerbehandlung lassen sich vermeiden, wenn dem VBA-Debugger gesagt wird, was er im Fehlerfall tun soll. Im Prinzip gibt es nur zwei Modi, die Sie einstellen k&ouml;nnen. &Uuml;ber <b>On Error Resume Next <\/b>sagen Sie ihm schlicht, dass er nicht ausf&uuml;hrbare Zeilen &uuml;berspringen soll (s. Listing 1).<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Fehler &uuml;bergehen mit On Error Resume Next<\/p>\n<pre>Sub LetItCrash2()\r\n    Dim obj As Object\r\n    On Error Resume Next\r\n    Set obj = CreateObject(&quot;Sascha.Trowitzsch&quot;)\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/Bild23345_opt.jpeg\" alt=\"missing image file\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Unbehandelter Fehler unter der Access-Runtime &#8211; peng!<\/span><\/b><\/p>\n<p>Mit <b>On Error Goto Label <\/b>teilen Sie dem Debugger mit, dass er bei nicht ausf&uuml;hrbarer Zeile an eine andere Stelle im Code springen soll, die mit einer Zeichenkette, dem Label, gekennzeichnet ist. In diesem Codeabschnitt lassen sich dann weitere Entscheidungen treffen, wie die Ausf&uuml;hrung des Codes abschlie&szlig;end aussehen soll (s. Listing 2). Immerhin wird dem Anwender mit dieser Routine eine Meldung angezeigt, die keinen Debuggen-Knopf mehr aufweist, und gesetzte Variablen verlieren auch nicht mehr ihre Werte (siehe Bild 4). <\/p>\n<p class=\"kastentabelleheader\">Listing 2: Fehlerbehandlung mit Sprungmarke<\/p>\n<pre>Sub LetItCrash3()\r\n    Dim obj As Object\r\n    On Error GoTo Fehler\r\n    Set obj = CreateObject(&quot;Sascha.Trowitzsch&quot;)\r\nEnde:\r\n    Set obj = Nothing\r\n    Exit Sub\r\n \r\nFehler:\r\n    MsgBox Err.Description, vbCritical\r\n    Resume Ende\r\nEnd Sub<\/pre>\n<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Fehlerbehandlung mit Nummerierung und Sprungmarke<\/p>\n<pre>Sub LetItCrash4()\r\n    Dim obj As Object\r\n \r\n    20 On Error GoTo Fehler\r\n    40 Set obj = CreateObject(&quot;Sascha.Trowitzsch&quot;)\r\n \r\nEnde:\r\n    60 Set obj = Nothing\r\n    80 Exit Sub\r\n \r\nFehler:\r\n    100 MsgBox &quot;Fehler in Zeile &quot; &amp; Erl &amp; _\r\n    &quot; von mdlDemos.LetItCrash4:&quot; &amp; vbCrLf &amp; _\r\n    Err.Description, vbCritical, &quot;Anwendungsfehler&quot;\r\n    120 Resume Ende\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/errormsgbox_opt.jpeg\" alt=\"errormsgbox.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Fehlermeldung ohne Debugging-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Davon abgesehen bringt diese Meldung weder den Benutzer, noch den Entwickler wirklich weiter. Was fangen Sie damit an, wenn der User Ihnen am Telefon die Meldung vorliest Sie enth&auml;lt vor allem keine Informationen dar&uuml;ber, wo der Fehler auftrat. Eine aussagekr&auml;ftigere Meldung enthielte daher zus&auml;tzliche Angaben zu Modulnamen, Prozedurnamen und m&ouml;glichst auch Zeilennummer der nicht ausf&uuml;hrbaren Codezeile (siehe Bild 5). Das l&auml;sst sich durch eine Erweiterung der Prozedur wie in Listing 3 erreichen. Die Tatsache, dass der Debugger f&uuml;r die Direktive <b>On Error Goto Label <\/b>immer die Angabe einer Sprungstelle innerhalb (!) der gleichen Prozedur erwartet, f&uuml;hrt zu viel Arbeit: In Hunderten von Prozeduren Ihres Projekts m&uuml;ssen Sie die immer gleichen Anweisungen und Fehlerbehandlungsabschnitte einf&uuml;gen. Und wenn Sie nicht &uuml;berm&auml;&szlig;ig pingelig sind, werden Sie dabei immer noch eine Reihe Prozeduren &uuml;bersehen &#8230;<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Die Hauptroutine ruft eine Unterfunktion auf.<\/p>\n<pre>Private strTest As String\r\nPublic globRet As Boolean\r\n \r\nSub LetItCrash5()\r\n    Dim a As Long\r\n    a = 99\r\n    strTest = &quot;Sascha&quot;\r\n    globRet = SubLetItCrash(strTest)\r\nEnd Sub\r\n \r\nFunction SubLetItCrash(strObj As String) As Boolean\r\n    Dim obj As Object\r\n    Set obj = CurrentDb\r\n    Set obj = CreateObject(strObj &amp; &quot;.Trowitzsch&quot;)\r\n    SubLetItCrash = obj.Name\r\n    Set obj = Nothing\r\n    SubLetItCrash = True\r\nEnd Function<\/pre>\n<\/p>\n<p class=\"kastentabelleheader\">Listing 5: Variablenliste<\/p>\n<pre>*****************************************************\r\n*** demo_globalerrorhandler.mdlDemos.SubLetItCrash *****************************************************\r\n(PARAM) strObj As String = &quot;Sascha&quot;\r\n(LOCAL) obj As Object = {Object}\r\n(LOCAL) SubLetItCrash As Boolean = False\r\n(MODULE) strTest As String = &quot;Sascha&quot;\r\n(MODULE) globRet As Boolean = False\r\n*****************************************************\r\n*** demo_globalerrorhandler.mdlDemos.LetItCrash5 *****************************************************\r\n(LOCAL) a As Long = 99\r\n(MODULE) strTest As String = &quot;Sascha&quot;\r\n(MODULE) globRet As Boolean = False\r\n*****************************************************<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/errormsgbox2_opt.jpeg\" alt=\"errormsgbox2.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Fehlermeldung mit Angabe der VBA-Quellzeile<\/span><\/b><\/p>\n<p>Und hier setzt der <b>Simply VBA Global Error Handler <\/b>an. Er erm&ouml;glicht, dass bei Fehlern nicht das prozedureigene Label angesprungen wird, sondern eine beliebige &ouml;ffentliche Fehlerbehandlungsprozedur, die Sie daf&uuml;r umso reichhaltiger ausstatten und mit allen Schikanen zur Fehlerbeschreibung versehen k&ouml;nnen. Dabei l&auml;sst sich der <b>SimplyVBA Global Error Handler<\/b>, den ich ab hier abgek&uuml;rzt nur noch <b>SVGEH <\/b>nennen werde, durchaus jederzeit &uuml;ber seine Schnittstelle so steuern, dass auch zu einer prozedureigenen Fehlerroutine zur&uuml;ckgesprungen werden kann.<\/p>\n<p><b>SVGEH einsetzen<\/b><\/p>\n<p>Wenn Sie den SVGEH verwenden m&ouml;chten, dann laden Sie ihn zun&auml;chst unter [1] herunter. Es stehen drei Versionen zur Verf&uuml;gung. Die Freeware-Version kommt erfreulicherweise ohne nervende Popups oder andere Werbema&szlig;nahmen aus und enth&auml;lt alle wesentlichen Features. Erst, wenn Sie Ihre Anwendung vertreiben wollen, fallen Kosten an, die jedoch relativ bescheiden ausfallen und mit der voraussichtlichen Zeitersparnis schnell wieder hereingeholt sind. Eine &Uuml;bersicht &uuml;ber Versionsunterschiede finden Sie im Anhang. Die Freeware-Version erfordert die Installation &uuml;ber ein Setup, welches die <b>VBAGlobalErrorHandler.dll <\/b>als ActiveX-Komponente registriert. Die Installation enth&auml;lt zus&auml;tzlich eine umfangreiche Demo-Datenbank, die alle Features gut demonstriert &#8211; allerdings in Englisch. Das gilt auch f&uuml;r die Hilfe, die bislang nur online unter [3] verf&uuml;gbar ist. In der Freeware-Version ben&ouml;tigen Sie in Ihrem VBA-Projekt einen Verweis auf die <b>SimplyVBA Global Error Handler Library<\/b>.<\/p>\n<p>F&uuml;r die kommerziellen Versionen ist das nicht zwingend notwendig, weil diese zus&auml;tzlich einen Mechanismus anbieten, der das Laden der DLL &uuml;ber VBA-Anweisungen erlaubt. Die DLL muss dann lediglich etwa im Anwendungsordner liegen. Sollte diese auf einem Zielrechner nicht vorhanden sein, dann kann dies ebenfalls &uuml;ber VBA-Code ermittelt und dem Benutzer eine entsprechende Mitteilung f&uuml;r den Support pr&auml;sentiert werden.<\/p>\n<p><!--30percent--><\/p>\n<p>F&uuml;r den Anfang sollten Sie aber mit Verweis arbeiten, weil Sie so durch IntelliSense unterst&uuml;tzt werden, und k&ouml;nnen nach Abschluss des Projekts auf die verweislose Variante umsteigen.<\/p>\n<p>&Uuml;brigens: Der SVGEH l&auml;sst sich nicht nur unter Access einsetzen, sondern in allen durch VBA unterst&uuml;tzten Anwendungen wie Excel, Word et cetera. Nebenbei werden Sie nach Installation in der Liste der COM-Add-Ins von Access noch den Eintrag <b>SimplyVBA Compiler Fix for MDEs <\/b>finden, um den Sie sich nicht weiter zu k&uuml;mmern brauchen. Dieses Add-In ben&ouml;tigt der SVGEH immer dann, wenn MDEs erstellt werden. Und schlie&szlig;lich zeigt der Add-In-Manager von VBA zus&auml;tzlich ein weiteres COM-Add-In an, den <b>Simply VBA SourceCode Line Numberer<\/b>, von dem sp&auml;ter noch die Rede sein wird. Alle diese Komponenten befinden sich, wohlgemerkt, in der einen installierten DLL.<\/p>\n<p><b>SVGEH aktivieren<\/b><\/p>\n<p>Das zentrale Objekt, das der SVGEH zur Verf&uuml;gung stellt, ist das <b>ErrEx<\/b>-Objekt. &auml;hnlich, wie das immer aktive <b>Err<\/b>-Objekt von VBA, muss dieses Objekt nicht extra instanziert werden, sondern steht mit dem Laden des Verweises global bereit. Nur wenige Zeilen m&uuml;ssen geschrieben werden, damit Sie Ihre Fehlerbehandlung komplett umstellen:<\/p>\n<pre>ErrEx.EnableGlobalErrorHandler Application, &quot;Fehlerbehandlung&quot;\r\n \r\nFunction Fehlerbehandlung() As Boolean\r\n \r\nEnd Function<\/pre>\n<p>Die erste Zeile zur Aktivierung des SVGEH k&ouml;nnen Sie testweise auch im VBA-Direktfenster absetzen. Sinnvoll ist nat&uuml;rlich, dass Sie diese letztlich in einer &ouml;ffentlichen Funktion unterbringen, die sp&auml;ter vom AutoExec-Makro beim Start der Anwendung aufgerufen wird. Die Methode <b>EnableGlobalErrorHandler <\/b>deaktiviert das eingebaute Verhalten des VBA-Debuggers. Sie &uuml;bergeben der Methode einen Verweis auf das Application-Objekt sowie den Namen einer &ouml;ffentlichen Prozedur, die bei Fehlern ausgef&uuml;hrt werden soll. Statt einer Function k&ouml;nnen Sie ebenso eine Sub-Prozedur einsetzen. Fehlt diese Routine im Quellcode, dann meldet sich der SVGEH mit der Info in Bild 6.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/noerrfunction_opt.jpeg\" alt=\"noerrfunction.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Der SVGEH meldet, wenn eine Fehlerbehandlungsroutine fehlt<\/span><\/b><\/p>\n<p>Obwohl die Angabe der Fehlerbehandlungsprozedur obligatorisch ist, braucht sie keinen Inhalt zu haben. Das Standardverhalten des SVGEH in diesem Fall ist, dass ein Dialog mit umfangreichen Angaben zum ausl&ouml;senden Fehler erscheint. F&uuml;hren Sie die Prozedur <b>LetItCrash <\/b>der Beispieldatenbank (<b>demo_globalerrorhandler.mdb<\/b>) wie oben aus, dann pr&auml;sentiert sich ohne weiteres Zutun etwa ein Dialog wie in Bild 7.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/globerrmsg1_opt.jpeg\" alt=\"globerrmsg1.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Der Error Report des einbauten SVGEH-Fehlerdialogs<\/span><\/b><\/p>\n<p>Sie sehen: Neben Fehlernummer und -beschreibung, also Angaben, die auch der &uuml;bliche Fehlerdialog von VBA bereith&auml;lt, finden sich noch mehr Informationen, wie Datum und Uhrzeit des Fehlerereignisses, die Prozedur und sogar die Quellcodezeile im Volltext. <\/p>\n<p><b>Mega-Features<\/b><\/p>\n<p>Ein Klick auf den Button <b>Show call stack <\/b>enth&uuml;llt schlie&szlig;lich noch die Aufrufreihenfolge der Prozeduren, die dem Fehler vorausgegangen war, wie in Bild 8. Es ist dort etwa zu erkennen, dass die Funktion <b>LetItCrash <\/b>vom VBA-Direktfenster aus aufgerufen wurde (<b>VBE.Immediate.Window<\/b>). Ein weiteres Feature ist allerdings den kommerziellen Versionen des <b>SVGEH <\/b>vorbehalten und zeigt sich durch Vorhandensein der Schaltfl&auml;che <b>Show Variables<\/b>. Wird diese angeklickt, so &ouml;ffnet sich eine &Uuml;bersicht mit den Inhalten aller (!) Variableninhalte, die zum Zeitpunkt des Fehlers gesetzt waren. F&uuml;r Analysezwecke ist dies eine unsch&auml;tzbare Unterst&uuml;tzung.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/globerrmsgcallstack_opt.jpeg\" alt=\"globerrmsgcallstack.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Der SVGEH kann auch die Reihenfolge der Prozeduraufrufe ermitteln.<\/span><\/b><\/p>\n<p>Um die Funktion der beiden letztgenannten Features etwas besser zu verdeutlichen, ist in Listing 4 eine etwas vertracktere Version unseres <b>LetItCrash<\/b>-Moduls angegeben.<\/p>\n<p class=\"kastentabelleheader\">Listing 6: Variablenliste<\/p>\n<pre>Function Fehlerbehandlung() As Boolean\r\n    With ErrEx\r\n    Select Case .Number\r\n    Case 429\r\n    .Description = &quot;COM-Objekt konnte nicht erstellt werden&quot;\r\n    End Select\r\n \r\n    .Description = .Description &amp; vbCrLf &amp; &quot;(&quot; &amp; .SourceModule &amp; &quot;.&quot; &amp; .SourceProcedure &amp; _\r\n    &quot; Z.&quot; &amp; .SourceLineNumber &amp; &quot;)&quot;\r\n    End With\r\nEnd Function<\/pre>\n<p>Der Aufruf von <b>LetItCrash5 <\/b>aus einem Makro heraus f&uuml;hrt dann zum <b>Call Stack <\/b>(Prozeduraufrufliste) in Bild 9.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/callstack_opt.jpeg\" alt=\"callstack.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Informationen zum Call Stack im Fehlerdialog des SVGEH<\/span><\/b><\/p>\n<p>Zu lesen ist diese Liste von unten nach oben. Zuerst wurde die Funktion <b>LetItCrash5 <\/b>im VBA-Direktfenster aufgerufen, danach rief diese ihrerseits die Function <b>SubLetItCrash <\/b>auf, in der sich der eigentliche Fehler ereignete. Beteiligt waren die Zeilen #3 und #2 &#8211; davon wird gleich noch die Rede sein.<\/p>\n<p>Der Klick auf den Button <b>Show Variables <\/b>&ouml;ffnet die Variablenliste aus Listing 5.<\/p>\n<p>Hier sind nicht nur die Variablennamen, -typen und -werte verzeichnet, sondern auch ihre G&uuml;ltigkeitsbereiche, fein s&auml;uberlich sortiert nach den beteiligten Prozeduren. <\/p>\n<p>Als w&auml;re das nicht ohnehin schon obercool, der Hammer kommt erst noch: Das alles funktioniert auch in einer MDE und\/oder Runtime!<\/p>\n<p>Sollten Sie also bisher der beruhigenden Annahme erlegen sein, dass in einer MDE kein Quelltext mehr vorhanden sei &#8211; ist er eigentlich auch nicht! -, dann bekommen Sie hiermit eine Kostprobe von Wayne Phillips F&auml;higkeiten zum Reverse Engineering von P-Code geboten. Lediglich der Text der beteiligten Quellcodezeilen wird bei MDEs nicht wiedergegeben.<\/p>\n<p>Die Schaltfl&auml;chen <b>Debug Source Code <\/b>(Debuggen), <b>End <\/b>(Beenden) und <b>Help <\/b>(Hilfe) kennen sie schon aus den herk&ouml;mmlichen VBA-Fehlermeldungen, und sie verhalten sich auch beim SVGEH analog.<\/p>\n<p>Neu hingegen ist der Button <b>Ignore and continue<\/b>. Ein Klick darauf kommt einem momentanen <b>On Error Resume <\/b>gleich &#8211; die fehlerhafte Zeile wird also &uuml;bersprungen.<\/p>\n<p>Unmittelbar danach ist allerdings der gesetzte Fehlerbehandlungsstatus wieder aktiv. Um kurz zusammenzufassen, was das bisher Ausgef&uuml;hrte bedeuten kann:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie brauchen im Prinzip in keine Prozedur mehr eine Fehlerbehandlung einzubauen.<\/li>\n<li class=\"aufz-hlung\">Sie bekommen bei Einsatz des SVGEH dennoch ausf&uuml;hrlichste Informationen &uuml;ber jeden ausgel&ouml;sten Fehler.<\/li>\n<li class=\"aufz-hlung\">Unbehandelte Fehler k&ouml;nnen mit <b>Ignore and continue <\/b>&uuml;bergangen werden, ohne dass VBA alle Variablenwerte zerst&ouml;rt. Mit dem Ablauf des Codes kann einfach fortgefahren werden &#8211; allerdings mit ungewissem Ausgang &#8230;<\/li>\n<li class=\"aufz-hlung\">Das alles funktioniert in MDBs, ACCDBs, wie in MDEs und ACCDEs und au&szlig;erdem auch unter Access Runtime-Umgebung (Tests fanden unter allen erdenklichen Konfigurationen von Office 2000 bis 2007 und Windows XP sowie Vista statt).<\/li>\n<\/ul>\n<p><b>Zeilennummern<\/b><\/p>\n<p>&Uuml;ber das neue COM-Addin <b>SimplyVBA SourceCode Line Numberer <\/b>kommt eine neue Toolbar mit einer einzigen Schaltfl&auml;che in die Entwicklungsumgebung (siehe Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/linenumberbutton_opt.jpeg\" alt=\"linenumberbutton.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Der SVGEH liefert ein neues Toolbar f&uuml;r den VBA-Editor.<\/span><\/b><\/p>\n<p>Ein Klick darauf l&auml;sst, wie in Bild 11, im gerade aktiven Codefenster eine vertikale Leiste erscheinen, die Codezeilen prozedurweise durchnummeriert. Sie brauchen dieses Feature nicht unbedingt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/linenumbering_opt.jpeg\" alt=\"linenumbering.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Der neue Zeilennummernbalken des SVGEH-Add-Ins<\/span><\/b><\/p>\n<p>Es macht jedoch eine manuelle Nummerierung der Zeilen, die Sie automatisiert auch von den MZ-Tools vornehmen lassen k&ouml;nnen, &uuml;berfl&uuml;ssig und erh&ouml;ht damit die Lesbarkeit Ihres Quelltexts.<\/p>\n<p>Wie erw&auml;hnt kann der SVGEH in MDEs nicht die fehlerausl&ouml;sende Quellzeile anzeigen, wohl aber die Nummer dieser Zeile, wobei diese nichts mit den Nummern zu tun hat, die Sie m&ouml;glicherweise selbst in den Text geschrieben haben.<\/p>\n<p>Hier wird einfach in Einerschritten jede Zeile mit aktiver Anweisung durchgez&auml;hlt &#8211; Dims etwa geh&ouml;ren nicht dazu. Ereignet sich in einer MDE ein Fehler, so k&ouml;nnen Sie &uuml;ber die im Call Stack angegebene Nummer nach Abgleich mit der Quell-MDB die exakte Stelle ermitteln, die f&uuml;r den Fehler verantwortlich war.<\/p>\n<p>Ein Bug besteht zum gegenw&auml;rtigen Zeitpunkt allerdings noch: Der Balken mit den Zeilennummern hat die feste Schriftart <b>Courier New 10pt<\/b>.<\/p>\n<p>Wenn Sie in den VBE-Optionen eine abweichende Schriftart oder -gr&ouml;&szlig;e einstellen, dann stimmen Zeilennummern und zugeh&ouml;rige Quelltextzeilen vertikal leider nicht mehr &uuml;berein und sind verrutscht. An der Behebung dieses Bugs arbeitet Wayne Phillips aber bereits.<\/p>\n<p><b>Steuerung<\/b><\/p>\n<p>Auch wenn Ihnen nun als Entwickler m&ouml;glicherweise die Augen leuchten, werden Sie dem Anwender Ihrer Datenbank sicherlich nicht die irritierenden Fehlerdialoge mit ihren kryptischen Angaben zumuten wollen. W&auml;hrend der Entwicklung einer Datenbank sind sie zweifellos ein gro&szlig;er Gewinn und bringen Ihnen Arbeitsersparnis.<\/p>\n<p>Der Anwender sollte aber, wenn &uuml;berhaupt, nur wirklich verst&auml;ndliche Meldungen pr&auml;sentiert bekommen, die ihn im Grunde nur darauf hinweisen sollen, dass ein Fehler bestimmter Provenienz auftrat und nun m&ouml;glicherweise beabsichtigte Aktionen nicht ausgef&uuml;hrt wurden, oder auch, dass im Folgenden Daten inkonsistent sein k&ouml;nnten.<\/p>\n<p>Da trifft es sich gut, dass der SVGEH &uuml;ber seine Eigenschaften und Methoden per VBA vollst&auml;ndig konfigurierbar ist. Eine komplette Darstellung aller M&ouml;glichkeiten kann im Rahmen dieses Beitrags nicht gegeben werden; in der Online-Hilfe ist das Objektmodell anschaulich erl&auml;utert [3].<\/p>\n<p>Der Zugriff auf das Objektmodell l&auml;sst sich in drei Kategorien unterteilen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Steuern des Erscheinungsbilds des SVGEH-eigenen Fehlerdialogfensters<\/li>\n<li class=\"aufz-hlung\">Steuern der weiteren Codeausf&uuml;hrung nach Fehlern<\/li>\n<li class=\"aufz-hlung\">Auslesen der Fehlerinformationen<\/li>\n<\/ul>\n<p><b>Fehlerdialog konfigurieren<\/b><\/p>\n<p>Beginnen wir mit dem Fehlerdialog, der sich wie oben ohne weitere Konfiguration in Vollausstattung pr&auml;sentiert. Tats&auml;chlich l&auml;sst sich jedoch jedes Element dieses Dialogs &uuml;ber drei&szlig;ig Properties haarklein ansteuern.<\/p>\n<p>Das betrifft sowohl die Sichtbarkeit der Elemente, wie auch die angezeigten Texte. Es ist sinnvoll, diese Konfiguration vorzunehmen, weil der SVGEH ab Werk eine englischsprachige Oberfl&auml;che zeigt. Phillips wird in Zukunft zwar auch lokalisierte Versionen ver&ouml;ffentlichen oder anderssprachige Unterst&uuml;tzung einbauen.<\/p>\n<p>Solange dies jedoch noch nicht geschehen ist, kann der Fehlerdialog per VBA eingedeutscht werden. Verantwortlich f&uuml;r das Aussehen des Fehlerdialogs ist die Klasse <b>ErrExDialogOptions<\/b>, die Sie &uuml;ber eine Funktion des st&auml;ndigen Zentralobjekts <b>ErrEx <\/b>erhalten:<\/p>\n<pre>Dim COptions As ErrExDialogOptions\r\nSet COptions = ErrEx.ErrExDialogOptions\r\nCOptions.WindowTitleText = &quot;Anwendungsfehler&quot;\r\nCoptions. ...<\/pre>\n<p>&Uuml;ber die Eigenschaften dieser Klasse k&ouml;nnen jederzeit Elemente des Fehlerdialogs angepasst werden. <\/p>\n<p>Ob Sie das erledigen, bevor die SVGEH-Fehlerbehandlung aktiviert ist, oder erst danach, das spielt keine Rolle. Sicherlich ist aber der Startcode einer Datenbank f&uuml;r Voreinstellungen der geeignete Ort.<\/p>\n<p>In der Demodatenbank finden Sie mit der Prozedur <b>ConfigureErrDialog<\/b>, die von der &uuml;ber das <b>AutoExec<\/b>-Makro ausgel&ouml;sten Funktion <b>StartDB <\/b>aufgerufen wird, ein Beispiel f&uuml;r eine Konfiguration, die endkundentauglich ist. Mit diesen Einstellungen zeigt sich der Fehlerdialog wie in Bild 12.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/customerrmsg_opt.jpeg\" alt=\"customerrmsg.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: &Uuml;ber VBA angepasster SVGEH-Fehlerdialog<\/span><\/b><\/p>\n<p>Einige Punkte sind dabei bemerkenswert. So lassen sich per VBA alle Standardschaltfl&auml;chen wahlweise ein- oder ausblenden und mit alternativen Beschriftungen versehen. Sie k&ouml;nnen aber auch ganz neue Schaltfl&auml;chen &uuml;ber die Methode <b>AddCustomButton <\/b>in den Dialog bringen und f&uuml;r diese Buttons Prozedurnamen des VBA-Projekts angeben, die bei Klick ausgef&uuml;hrt werden sollen.<\/p>\n<p>Im Beispiel ist das die Schaltfl&auml;che <b>Neu starten<\/b>, welche die Routine <b>RestartApp <\/b>ausl&ouml;st und die Anwendung beendet und neu startet. Ein Element l&auml;sst sich indessen nicht ausblenden, n&auml;mlich jenes mit der Fehlerbeschreibung. Daf&uuml;r kann dieser Text jedoch in der eigentlichen Fehlerbehandlungsroutine angepasst werden, die wir oben noch ohne Inhalt angaben. Die Meldung aus Bild 12 kommt etwa durch die Routine aus Listing 6 zustande.<\/p>\n<p>Tritt irgendwo bei Ausf&uuml;hrung des VBA-Projekts der Fehler 429 auf (&quot;Objekterstellung durch ActiveX-Komponente nicht m&ouml;glich&quot;), so wird im entsprechenden <b>Select Case<\/b>-Zweig einfach die <b>Description<\/b>-Eigenschaft des <b>ErrEx<\/b>-Objekts neu gesetzt und abschlie&szlig;end die Fehlerquelle angeh&auml;ngt. Erst nach Beendigung der Routine poppt der Fehlerdialog auf und zeigt die gew&uuml;nschten Informationen.<\/p>\n<p>M&ouml;chten Sie, dass gar keine Fehlerbeschreibung angezeigt wird, so setzen Sie <b>Description <\/b>einfach auf einen Leerstring:<\/p>\n<pre>ErrEx.Description = &quot;&quot;<\/pre>\n<p>Erw&auml;hnenswert ist noch die Eigenschaft <b>ButtonsAsCommandLinks <\/b>der <b>ErrExDialogOptions<\/b>. Steht sie auf <b>True<\/b>, dann werden alle Buttons des Fehlerdialogs grafisch dargestellt, was wie in Bild 13 aussieht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_06\/ErrorHandling-web-images\/globerrmsglinks_opt.jpeg\" alt=\"globerrmsglinks.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: SVGEH-Fehlerdialog mit aktivierter ButtonsAsCommandLinks-Eigenschaft<\/span><\/b><\/p>\n<p><b>Fehlerinformationen auslesen<\/b><\/p>\n<p>Alle Informationen, die sich im Fehlerdialog des SVGEH zeigen, k&ouml;nnen nat&uuml;rlich &uuml;ber sein Zentralobjekt <b>ErrEx <\/b>genau so abgefragt werden, wie das beim <b>Err<\/b>-Objekt von VBA ebenfalls m&ouml;glich ist, nur dass hier eine weitaus gr&ouml;&szlig;ere Zahl von Eigenschaften verf&uuml;gbar ist.<\/p>\n<p>Im Folgenden eine Liste der Eigenschaften, die sich von denen des VBA-Err-Objekts abheben:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>SourceProject<\/b>: Name des aktiven VBA-Projekts; es k&ouml;nnte ja mehrere geben, wenn etwa eine Bibliotheksdatenbank in die Verweise eingeklinkt ist.<\/li>\n<li class=\"aufz-hlung\"><b>SourceModule<\/b>: Name des Moduls, in dem der Fehler auftrat.<\/li>\n<li class=\"aufz-hlung\"><b>SourceProcedure<\/b>: Name der Prozedur, in der der Fehler auftrat.<\/li>\n<li class=\"aufz-hlung\"><b>SourceLineNumber<\/b>: Nummer der Zeile innerhalb der Prozedur, in der der Fehler auftrat.<\/li>\n<li class=\"aufz-hlung\"><b>SourceLineCode<\/b>: String mit dem Quelltext der Codezeile, die den Fehler ausl&ouml;ste.<\/li>\n<li class=\"aufz-hlung\"><b>VBEVersion<\/b>: DLL-Version der f&uuml;r VBA zust&auml;ndigen <b>vbe6.dll<\/b>. Diese Information kann wertvoll sein, weil auch VBA selbst nicht immer bugfrei ist. So kam etwa mit dem SP3 f&uuml;r Office 2003 eine <b>vbe6.dll <\/b>ins System, die zeitweise zu Abst&uuml;rzen f&uuml;hrte. Erst ein Hotfix bereinigte dies.<\/li>\n<li class=\"aufz-hlung\"><b>UserData<\/b>: Kann beliebige Informationen enthalten. Sie k&ouml;nnen diese Variable beispielsweise in Prozeduren setzen und im Fehlerfall darauf zur&uuml;ckgreifen. Beispiel in Prozedur <b>LetItCrash5<\/b>:<\/li>\n<\/ul>\n<pre>ErrEx.UserData = \"Experimentell!\"<\/pre>\n<p>In der Fehlerbehandlung dann:<\/p>\n<pre>If Len(.UserData) &gt; 0 Then _\r\n.Description = .UserData &amp; vbCrLf &amp; .Description<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>CallStack<\/b>: Diese Funktion gibt ein <b>ErrExCallStack<\/b>-Objekt zur&uuml;ck, das die Prozeduraufrufliste enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\"><b>VariablesInspector<\/b>: Gibt als Funktion ein <b>ErrExVariables<\/b>-Objekt zur&uuml;ck, das alle zum Zeitpunkt des Fehlers g&uuml;ltigen Variablen und deren Werte auflistet. Diese Funktion ist nur in den kommerziellen Versionen des SVGEH aktiv.<\/li>\n<\/ul>\n<p>F&uuml;r die beiden letztgenannten Punkte m&ouml;chte ich Sie auf den Objektkatalog sowie die <b>sample.mdb <\/b>von Phillips verweisen, die eine Installation des SVGEH mitbringt.<\/p>\n<p>Es handelt sich bei den zur&uuml;ckgegebenen Objekten nicht um klassische Auflistungen, die mit <b>For Each<\/b>-Schleifen abgearbeitet werden k&ouml;nnen und die Eigenschaft <b>Count <\/b>aufweisen. Stattdessen stehen die Eigenschaften dieser Objekte beim ersten Aufruf auf dem ersten Element der Auflistung. Mit der Methode <b>NextLevel <\/b>beziehungsweise <b>NextVar <\/b>kann zum n&auml;chsten Element geschaltet werden und dessen Eigenschaften k&ouml;nnen nun ausgelesen werden. Das geht so lange, bis die Funktion <b>IsEnd <\/b>den Wert <b>True <\/b>zur&uuml;ckgibt. Sie m&uuml;ssen also in einer Schleife jeweils diese Funktion <b>IsEnd <\/b>abfragen und sie verlassen, sobald sie <b>True <\/b>zur&uuml;ckgibt. Die eigentlichen Eigenschaften der beiden Objekte sind weitgehend selbsterkl&auml;rend.<\/p>\n<p>Was Sie mit den Informationen des <b>ErrEx<\/b>-Objekts dann anfangen, das bleibt Ihnen &uuml;berlassen. Sie k&ouml;nnen etwa einen eigenen Fehlerdialog mithilfe eines Access-Formulars gestalten und diesem die gew&uuml;nschten Werte &uuml;bergeben, falls Ihnen der eingebaute SVGEH-Dialog nicht gef&auml;llt oder Sie zus&auml;tzliche Features vorsehen m&ouml;chten.<\/p>\n<p>Oder Sie speichern s&auml;mtliche Informationen in den Datensatz einer Log-Tabelle, wobei konsequenterweise f&uuml;r die Callstacks und Variablenwerte zus&auml;tzliche Detailtabellen ben&ouml;tigt w&uuml;rden. Damit haben Sie ein ausf&uuml;hrliches Fehler-Log, das sp&auml;ter inspiziert und etwa gefiltert abgefragt werden kann. Schlie&szlig;lich k&ouml;nnen Sie die Fehlerinformationen auch per E-Mail versenden, nachdem Sie sie in einem String zusammengefasst haben, der in den E-Mail-Body eingesetzt wird. <\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Weitere Codeausf&uuml;hrung nach Fehlern<\/p>\n<p>Bisher wurde nur erl&auml;utert, wie Sie an Fehlerinformationen gelangen oder wie diese Ihnen oder dem Anwender pr&auml;sentiert werden. Die Voreinstellungen des SVGEH sehen vor, dass jeder Fehler an die benutzerdefinierte Fehlerbehandlungsroutine geleitet und nach deren Ablauf der Fehlerdialog angezeigt wird.<\/p>\n<p>Eingangs wurde dargestellt, wie Sie den Modus des VBA-Debuggers &uuml;ber die Direktiven <b>On Error Resume Next<\/b>, <b>On Error Goto Label <\/b>und <b>On Error Goto 0 <\/b>steuern k&ouml;nnen. Bei aktiviertem SVGEH ist selbstverst&auml;ndlich etwa &auml;hnliches m&ouml;glich. Dazu besitzt das <b>ErrEx<\/b>-Objekt die wichtige Eigenschaft <b>State<\/b>, die sowohl gelesen wie geschrieben werden kann. Abh&auml;ngig vom Wert dieser Eigenschaft &auml;ndert der SVGEH sein Verhalten. Sie k&ouml;nnen sie &uuml;berall in Ihren Prozeduren &auml;ndern und auch im Verlauf der Fehlerbehandlungsroutine selbst. Die m&ouml;glichen Werte kommen aus der Enumerationskonstanten <b>OnErrorStatus <\/b>und haben folgende Bedeutung:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>OnErrorGoto0<\/b>: Das ist der Ausgangszustand des SVGEH. Er entspricht dem normalen Verhalten des VBA-Debuggers, wenn keine Direktiven zur Fehlerbehandlung gesetzt wurden. Es erscheint also der Fehlerdialog, aber nat&uuml;rlich nicht der VBA-eigene, sondern der des SVGEH.<\/li>\n<li class=\"aufz-hlung\"><b>OnErrorGotoEnd<\/b>: In diesem Zustand wird bei Fehlern die Ausf&uuml;hrung der aktuellen Prozedur, also jener, die den Fehler ausl&ouml;ste, abgebrochen. Das entspricht einem Klick auf den Beenden-Button des VBA-Fehlerdialogs. Das Besondere hier: Variablenwerte werden dabei nicht zerst&ouml;rt! <\/p>\n<p>Ein Fehlerdialog erscheint hier nicht.<\/li>\n<li class=\"aufz-hlung\"><b>OnErrorGotoLabel<\/b>: Der Status hat nur einen Sinn, wenn in der Prozedur, die einen Fehler ausl&ouml;ste, auch die Angabe eines Labels in der Form <b>On Error Goto LabelXYZ <\/b>steht. In diesem Fall springt nach Abarbeitung der zentralen Fehlerroutine die Codeausf&uuml;hrung genau zum angegebenen <b>LabelXYZ<\/b>. Dieser Status ist vielleicht bei Projekten, die auf den SVGEH umgestellt werden sollen, der g&uuml;nstigste, weil das bisherige Verhalten des Projekts so beibehalten werden kann. Nach und nach k&ouml;nnen dann Prozeduren auf die alternative Fehlerbehandlungsmethode ge&auml;ndert werden.<\/li>\n<li class=\"aufz-hlung\"><b>OnErrorResumeNext<\/b>: Erledigt das Gleiche wie die analoge VBA <b>On Error Resume Next<\/b>-Direktive. Es wird also die n&auml;chste Zeile ausgef&uuml;hrt und der Fehler ignoriert.<\/li>\n<li class=\"aufz-hlung\"><b>OnErrorDebug<\/b>: Entspricht dem Klick auf die Debuggen-Schaltfl&auml;che des VBA-Fehlerdialogs. Man findet sich also nach Ausf&uuml;hrung der zentralen Fehlerbehandlungsroutine im VBA-Editor mit gelb markierter Zeile wieder. Das geht nat&uuml;rlich weder in einer MDE noch unter Runtime-Umgebung. Um der in diesem Fall erscheinenden Alarmmeldung des SVGEH zu entgehen, k&ouml;nnen Sie im Code auch die <b>ErrEx<\/b>-Eigenschaft <b>IsDebuggable <\/b>abfragen und bei R&uuml;ckgabe von <b>False <\/b>den <b>State <\/b>auf einen anderen und sinnvolleren Wert setzen.<\/li>\n<li class=\"aufz-hlung\"><b>CalledByLocalHandler<\/b>: Dieser Status ist nur zum Auslesen innerhalb der Fehlerbehandlungsroutine gedacht. Er ist gesetzt, wenn bei lokal aktivierter Prozedurfehlerbehandlung die <b>ErrEx<\/b>-Methode <b>CallGlobalErrorHandler <\/b>aufgerufen wird. Das macht man normal nur im Fehlerzweig der Prozedur, um zu entscheiden, ob ein Fehler &uuml;ber den SVGEH behandelt werden soll oder &uuml;ber die lokale Fehlerbehandlung. Das ist ein etwas komplizierter Anwendungsfall, den Phillips ausf&uuml;hrlicher unter [4] beschreibt.<\/li>\n<\/ul>\n<p>Damit keine Verwirrung aufkommt: Die Ausf&uuml;hrungen oben gelten weitgehend f&uuml;r den Fall, dass Sie die Eigenschaft <b>State <\/b>innerhalb der zentralen Fehlerbehandlungsroutine setzen. Denn wenn Sie <b>State <\/b>etwa innerhalb einer Ihrer Prozeduren auf <b>OnErrorResumeNext <\/b>setzen, dann wird die Fehlerbehandlungsroutine gar nicht erst ausgef&uuml;hrt.<\/p>\n<p>Das ist ein wichtiger Punkt. Denn w&auml;hrend ohne Einsatz des SVGEH die <b>On Error<\/b>-Direktiven den Modus des VBA-Debuggers immer nur f&uuml;r den G&uuml;ltigkeitsbereich einer Prozedur setzen, bleibt der Status des <b>ErrEx<\/b>-Objekts prozedur- und projekt&uuml;bergreifend erhalten. Sie k&ouml;nnten also den <b>OnErrorResumeNext<\/b>-Status gleich zum Start der Anwendung setzen; der Erfolg w&auml;re, dass niemals ein Fehler angezeigt und auch die Fehlerbehandlungsroutine nie ausgef&uuml;hrt wird. Was f&uuml;r den Anwender zun&auml;chst nach traumhaft stabiler Anwendung aussieht, wird auf Dauer sicher ernste Folgen haben und unter Umst&auml;nden Datenm&uuml;ll nach sich ziehen. <\/p>\n<p>Ebenso unsinnig w&auml;re es, den Status dauernd auf <b>OnErrorGoto0 <\/b>zu belassen. Wer will schon dauernd ungefiltert mit dem Fehlerdialog konfrontiert werden und fortw&auml;hrend auf das <b>Fortfahren<\/b>-Kn&ouml;pfchen klicken F&uuml;r einen Prototypen ist das erlaubt, f&uuml;r die Final Release eher nicht.<\/p>\n<p>Das hei&szlig;t zusammengefasst, dass Sie mit der Steuerung des <b>ErrEx<\/b>-State aus Ihren Prozeduren heraus sehr vorsichtig umgehen sollten. F&uuml;r den Anfang ist es einfacher und &uuml;bersichtlicher, diese Steuerung in die zentrale Fehlerbehandlungsroutine zu legen.<\/p>\n<p><b>Verweisloser SVGEH<\/b><\/p>\n<p>Wenn Sie sich den Vollausbau des SVGEH zulegen, die Unlimited Edition, dann brauchen Sie in Ihrem Projekt keinen Verweis auf seine Bibliothek zu setzen. Es reicht, die DLL mit der Datenbank in das Anwendungsverzeichnis zu speichern, ohne sie zu registrieren.<\/p>\n<p>Zus&auml;tzlich ist bei dieser Edition ein Eintrag im Add-Ins-Men&uuml; vorhanden, &uuml;ber den automatisch Schnittstellenmodule im Projekt erzeugt werden, die das Laden der DLL &uuml;bernehmen und die SVGEH-Objekte &uuml;ber Klassen global verf&uuml;gbar machen. Mit einem Klick auf einen weiteren Men&uuml;eintrag l&auml;sst sich das Ganze wieder r&uuml;ckg&auml;ngig machen &#8211; die Module werden r&uuml;ckstandsfrei gel&ouml;scht und stattdessen wird ein Verweis auf die SVGEH-Bibliothek gesetzt. Praktisch!<\/p>\n<p>Wer also Angst vor Verweisen oder Schwierigkeiten mit dem Registrieren von ActiveX-Komponenten hat &#8211; sei es, weil Administratoren die Berechtigungen streng geregelt haben oder Vista mit eingeschalteter UAC die Zielplattform ist -, dem d&uuml;rfte diese Version sehr entgegenkommen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Ausblick<\/p>\n<p>Neue Konzepte erfordern Umdenken und hier konnten nur Grundlagen vermittelt werden. Eine ausf&uuml;hrliche Besch&auml;ftigung mit dem SVGEH ist n&ouml;tig, wenn Sie Ihr Errorhandling so radikal umstellen wollen. Besonders schwierig wird es wohl, wenn Sie bestehende Datenbanken mit dem SVGEH ausr&uuml;sten m&ouml;chten. Der SVGEH erm&ouml;glicht eine Flexibilit&auml;t, die zun&auml;chst &uuml;berfordert, wenn man jahrelang die Implementation von Fehlerbehandlungen auf konventionellem Weg gewohnt ist.<\/p>\n<p>So steht man mit dem SVGEH vor der Frage, ob man die Fehlerbehandlung v&ouml;llig zentralisiert oder es bei prozedurlokalen Fehlerbehandlungen bel&auml;sst und die zentrale Routine nur etwa zum Loggen der Fehler missbraucht. Dazwischen sind alle m&ouml;glichen Mischformen denkbar. <\/p>\n<p>Eine andere L&ouml;sung w&auml;ren mehrere separate Fehlerbehandlungsroutinen, die unterschiedliche Aufgaben &uuml;bernehmen und die &Uuml;bersichtlichkeit erh&ouml;hen.<\/p>\n<p>Als Beispiel k&ouml;nnten Sie eine Routine zum Anzeigen von Fehlern einsetzen, eine andere zum Versenden von Fehlern per E-Mail. Eine weitere k&ouml;nnte mit umfangreichen Select-Case-Statements ausger&uuml;stet sein, in der Fehler, je nach Nummer oder Quelle, gezielter behandelt werden. Welche dieser Routinen zum Einsatz kommen soll, entscheiden Sie in jeder Prozedur einzeln, indem Sie zu Anfang oder auch mittendrin jeweils die <b>EnableGlobalErrorHandler<\/b>-Methode ausf&uuml;hren und dabei die gew&uuml;nschte Fehlerbehandlungsroutine &uuml;ber den Parameter <b>OnErrorProcedureName <\/b>setzen. Es h&auml;ngt von Ihrer Anwendung und Ihrem Programmierstil ab, welches Verfahren das geeignetste ist.<\/p>\n<p>An sich liegt es nahe, nur eine einzige Fehlerbehandlungsroutine zu verwenden und in Abh&auml;ngigkeit vom Fehlerereignis zu entscheiden, wie weiter verfahren werden soll. Das f&uuml;hrt bei umfangreichen Projekten aber zu einem <b>Select Case<\/b>&#8211; und\/oder <b>If&#8230;Then&#8230;ElseIf<\/b>-Unget&uuml;m. Die Bedingungen leiten sich aus der Fehlernummer, dem Quellobjekt, der genauen Prozedur und der in dieser eventuell implementierten lokalen Fehlerbehandlung ab. Erst nach Analyse dieser Werte f&auml;llt dann die Entscheidung, ob ein Fehlerdialog angezeigt werden soll, die Codeausf&uuml;hrung abgebrochen oder die Fehlerzeile ignoriert werden soll und ob Aktionen eingeschoben werden m&uuml;ssen, die die Fehlerursache bereinigen. Es d&uuml;rfte kaum m&ouml;glich sein, das alles unter einen Hut zu bringen. Zumindest w&uuml;rde ich dann empfehlen, alle aktiven Vorg&auml;nge, die in der Fehlerbehandlungsroutine ausgel&ouml;st werden sollen, in Subroutinen auszulagern.<\/p>\n<p><b>Versionsunterschiede<\/b><\/p>\n<p>Tab. 1 zeigt die Unterschiede der Versionen des SimplyVBA Global Error Handlers auf (siehe auch [2]). Wer professionell Datenbankanwendungen erstellt, der sollte nach erfolgreichem Test der Freeware zumindest die preiswerte Distributable Version erwerben.<\/p>\n<table class=\"table-style-2\">\n<thead>\n<tr>\n<td class=\"aiu-zeile1\">\n<p class=\"kastenheader\">Version<\/p>\n<\/td>\n<td>\n<p class=\"kastenheader\">Freeware<\/p>\n<\/td>\n<td>\n<p class=\"kastenheader\">Distributable<\/p>\n<\/td>\n<td>\n<p class=\"kastenheader\">Unlimited<\/p>\n<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"aiu-zeile1\">\n<p class=\"kastenheader\">Kommerzieller Einsatz<\/p>\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<p class=\"kastenheader\">Einsatz ohne Verweis in VBA<\/p>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<p class=\"kastenheader\">Maximale Anz. Installationen<\/p>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<p class=\"kastenheader\">Preis in EUR<\/p>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"tabellenunterschrift\">Tab. 1: Versionsunterschiede und Preise<\/p>\n<p>Literatur<\/p>\n<p class=\"quellen\">[1] Startseite SVGEH<\/p>\n<p><a href=\"http:\/\/www.everythingaccess.com\/simplyvba-global-error-handler.htm\">http:\/\/www.everythingaccess.com\/simplyvba-global-error-handler.htm<\/a><\/p>\n<p class=\"quellen\">[2] Lizenzinformationen<\/p>\n<p><a href=\"http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/licensing.htm\">http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/licensing.htm<\/a><\/p>\n<p class=\"quellen\">[3] Online-Hilfe zum SVGEH<\/p>\n<p><a href=\"http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/introduction.htm\">http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/introduction.htm<\/a><\/p>\n<p class=\"quellen\">[4] Infos zum Status CalledByLocalHandler<\/p>\n<p><a href=\"http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/errex.htm#S4\">http:\/\/www.everythingaccess.com\/simplyvba\/globalerrorhandler\/errex.htm#S4<\/a><\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>demo_globalerrorhandler.mdb<\/p>\n<p>demo_globalerrorhandler.mde<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/1B6EE635-93C5-4141-91AC-2CCF41F545C8\/aiu_641.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es kracht hin und wieder beim Ausf&uuml;hren Ihres VBA-Codes und Sie klicken auf die Debuggen-Schaltfl&auml;che der Fehlermeldung Macht nichts &#8211; das kommt vor. Sie verteilen Ihr Werk und der Benutzer berichtet von seltsamen Fenstern und sich &ouml;ffnendem VBA-Editor Weniger sch&ouml;n. Sie liefern Ihre Datenbank mit der Access-Runtime aus und der Kunde meldet ungehalten, dass sich die Anwendung allenthalben einfach schlie&szlig;e Sp&auml;testens dann ist Schluss. Es geht aber auch anders &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662008,66062008,44000026,44000025],"tags":[],"class_list":["post-55000641","post","type-post","status-publish","format-standard","hentry","category-662008","category-66062008","category-Interaktiv","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>VBA-Fehlerbehandlung revolutioniert - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Fehlerbehandlung revolutioniert\" \/>\n<meta property=\"og:description\" content=\"Es kracht hin und wieder beim Ausf&uuml;hren Ihres VBA-Codes und Sie klicken auf die Debuggen-Schaltfl&auml;che der Fehlermeldung Macht nichts - das kommt vor. Sie verteilen Ihr Werk und der Benutzer berichtet von seltsamen Fenstern und sich &ouml;ffnendem VBA-Editor Weniger sch&ouml;n. Sie liefern Ihre Datenbank mit der Access-Runtime aus und der Kunde meldet ungehalten, dass sich die Anwendung allenthalben einfach schlie&szlig;e Sp&auml;testens dann ist Schluss. Es geht aber auch anders ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T16:20:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"30\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Fehlerbehandlung revolutioniert\",\"datePublished\":\"2021-03-22T16:20:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/\"},\"wordCount\":5784,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7ba062d602cd47d6ab2d3859ae9d8ae7\",\"articleSection\":[\"2008\",\"6\\\/2008\",\"Interaktiv\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/\",\"name\":\"VBA-Fehlerbehandlung revolutioniert - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7ba062d602cd47d6ab2d3859ae9d8ae7\",\"datePublished\":\"2021-03-22T16:20:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7ba062d602cd47d6ab2d3859ae9d8ae7\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7ba062d602cd47d6ab2d3859ae9d8ae7\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFehlerbehandlung_revolutioniert\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Fehlerbehandlung revolutioniert\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"VBA-Fehlerbehandlung revolutioniert - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Fehlerbehandlung revolutioniert","og_description":"Es kracht hin und wieder beim Ausf&uuml;hren Ihres VBA-Codes und Sie klicken auf die Debuggen-Schaltfl&auml;che der Fehlermeldung Macht nichts - das kommt vor. Sie verteilen Ihr Werk und der Benutzer berichtet von seltsamen Fenstern und sich &ouml;ffnendem VBA-Editor Weniger sch&ouml;n. Sie liefern Ihre Datenbank mit der Access-Runtime aus und der Kunde meldet ungehalten, dass sich die Anwendung allenthalben einfach schlie&szlig;e Sp&auml;testens dann ist Schluss. Es geht aber auch anders ...","og_url":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-03-22T16:20:26+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"30\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Fehlerbehandlung revolutioniert","datePublished":"2021-03-22T16:20:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/"},"wordCount":5784,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7","articleSection":["2008","6\/2008","Interaktiv","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/","url":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/","name":"VBA-Fehlerbehandlung revolutioniert - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7","datePublished":"2021-03-22T16:20:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/7ba062d602cd47d6ab2d3859ae9d8ae7"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/VBAFehlerbehandlung_revolutioniert\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Fehlerbehandlung revolutioniert"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000641"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000641\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}