VBA bei Fehler - Best Practices zur Fehlerbehandlung

Spickzettel zu VBA-Fehlern

Fehler

BeschreibungVBA-CodeBei Fehler - Stoppcode und AnzeigefehlerBei Fehler Gehe zu 0Bei Fehler - Fehler überspringen und weiterlaufenBei Fehler Fortsetzen als nächstesBei Fehler – Gehe zu einer Codezeile [Label]Bei Fehler Gehe zu [Label]Löscht (zurückgesetzt) ​​FehlerBei Fehler GoTo -1Fehlernummer anzeigenMsgBox Err.NumberFehlerbeschreibung anzeigenMsgBox Err.BeschreibungFunktion zum Generieren eigener FehlerErr.Erhöhen

Weitere VBA-Spickzettel und kostenlose PDF-Downloads anzeigen

VBA-Fehlerbehandlung

VBA-Fehlerbehandlung bezieht sich auf den Prozess des Antizipierens, Erkennens und Behebens von VBA-Laufzeitfehlern. Der VBA-Fehlerbehandlungsprozess findet beim Schreiben von Code statt, bevor Fehler tatsächlich auftreten.

VBA-Laufzeitfehler sind Fehler, die während der Codeausführung auftreten. Beispiele für Laufzeitfehler sind:

  • Verweisen auf eine nicht vorhandene Arbeitsmappe, ein Arbeitsblatt oder ein anderes Objekt
  • Ungültige Daten, z. Verweisen auf eine Excel-Zelle, die einen Fehler enthält
  • Versuch durch Null zu dividieren

VBA-On-Error-Anweisung

Die meisten VBA-Fehlerbehandlungen werden mit dem Bei Fehler-Anweisung. Die On Error-Anweisung teilt VBA mit, was zu tun ist, wenn ein Fehler auftritt. Dort sind drei Bei Fehleraussagen:

  • Bei Fehler GoTo 0
  • Bei Fehler Fortsetzen als nächstes
  • Bei Fehler GoTo Leitung

Bei Fehler GoTo 0

Bei Fehler GoTo 0 ist die Standardeinstellung von VBA. Sie können diese Standardeinstellung wiederherstellen, indem Sie die folgende Codezeile hinzufügen:

1 Bei Fehler GoTo 0

Wenn ein Fehler auftritt mit Bei Fehler GoTo 0, VBA beendet die Ausführung von Code und zeigt das Standardfehlermeldungsfeld an.

Oft werden Sie ein . hinzufügen Bei Fehler GoTo 0 nach dem Hinzufügen Bei Fehler Fortsetzen als nächstes Fehlerbehandlung (nächster Abschnitt):

123456789 UnterfehlerGoTo0()Bei Fehler Fortsetzen als nächstesActiveSheet.Shapes("Start_Button").LöschenBei Fehler GoTo 0'Mehr Code ausführenEnd Sub

Bei Fehler Fortsetzen als nächstes

Bei Fehler Fortsetzen als nächstes weist VBA an, alle Codezeilen mit Fehlern zu überspringen und mit der nächsten Zeile fortzufahren.

1 Bei Fehler Fortsetzen als nächstes

Notiz: Bei Fehler Fortsetzen als nächstes behebt keinen Fehler oder behebt ihn auf andere Weise. Es weist VBA einfach an, so fortzufahren, als ob die Codezeile, die den Fehler enthält, nicht vorhanden wäre. Unsachgemäße Verwendung von Bei Fehler Fortsetzen als nächstes kann zu unbeabsichtigten Folgen führen.

Eine tolle Zeit zu nutzen Bei Fehler Fortsetzen als nächstes ist, wenn Sie mit Objekten arbeiten, die möglicherweise existieren oder nicht. Sie möchten beispielsweise Code schreiben, der eine Form löscht, aber wenn Sie den Code ausführen, während die Form bereits gelöscht ist, gibt VBA einen Fehler aus. Stattdessen können Sie verwenden Bei Fehler Fortsetzen als nächstes um VBA anzuweisen, die Form zu löschen, wenn sie vorhanden ist.

123 Bei Fehler Fortsetzen als nächstesActiveSheet.Shapes("Start_Button").LöschenBei Fehler GoTo 0

Beachten Sie, dass wir hinzugefügt haben Bei Fehler GoTo 0 nach der Codezeile, die den potenziellen Fehler enthält. Dadurch wird die Fehlerbehandlung zurückgesetzt.

Im nächsten Abschnitt zeigen wir Ihnen, wie Sie mit . testen können, ob ein Fehler aufgetreten ist Fehlernummer, was Ihnen erweiterte Optionen zur Fehlerbehandlung bietet…

Err.Number, Err.Clear und Fehler abfangen

Anstatt einfach eine Zeile mit einem Fehler zu überspringen, können wir den Fehler mit abfangen Bei Fehler Fortsetzen als nächstes und Fehlernummer.

Fehlernummer gibt eine Fehlernummer zurück, die dem erkannten Fehlertyp entspricht. Wenn kein Fehler vorliegt, Fehlernummer = 0.

Dieses Verfahren gibt beispielsweise „11“ zurück, da der auftretende Fehler Laufzeitfehler ’11’.

1234567 Sub ErrorNumber_ex()Bei Fehler Fortsetzen als nächstesActiveCell.Value = 2 / 0MsgBox Err.NumberEnd Sub

Fehlerbehandlung mit Err.Number

Die wahre Kraft von Fehlernummer liegt in der Fähigkeit zu erkennen, ob ein Fehler aufgetreten ist (Fehlernummer 0). Im folgenden Beispiel haben wir eine Funktion erstellt, die mithilfe von Err.Number testet, ob ein Blatt vorhanden ist.

12345678910111213141516171819 UntertestWS()MsgBox DoesWSExist("test")End SubFunktion DoesWSExist(wsName As String) As BooleanDim ws als ArbeitsblattBei Fehler Fortsetzen als nächstesSet ws = Sheets(wsName)'Wenn Fehler WS nicht existiertWenn Fehlernummer 0 DannDoesWSExist = FalseAndersTutWSExist = TrueEnde WennBei Fehler GoTo -1Endfunktion

Hinweis: Wir haben a . hinzugefügt Bei Fehler GoTo -1 bis zum Ende, das Err.Number auf 0 zurücksetzt (siehe zwei Abschnitte unten).

Mit Bei Fehler Fortsetzen als nächstes und Fehlernummer, können Sie das replizieren „Ausprobieren“ & „Fangen“ Funktionalität anderer Programmiersprachen.

Bei Fehler GoTo Leitung

Bei Fehler GoTo Leitung weist VBA an, zu einer beschrifteten Codezeile zu „gehen“, wenn ein Fehler auftritt. Sie deklarieren die Go To-Anweisung wie folgt (wobei errHandler die Zeilenbezeichnung ist, zu der Sie wechseln möchten):

1 Bei Fehler GoTo errHandler

und erstellen Sie eine Zeilenbeschriftung wie folgt:

1 errHandler:

Hinweis: Dies ist das gleiche Label, das Sie mit einem regulären VBA-GoTo-Statement verwenden würden.

Im Folgenden werden wir die Verwendung demonstrieren Bei Fehler GoTo Leitung um eine Prozedur zu beenden.

Bei Fehler Exit Sub

Sie können On Error GoTo Line verwenden, um ein Sub zu beenden, wenn ein Fehler auftritt.

Sie können dies tun, indem Sie die Beschriftung der Fehlerbehandlungszeile am Ende Ihres Verfahrens platzieren:

12345678 Sub ErrGoToEnd()Bei Fehler GoTo endProc'Irgendein CodeendProc:End Sub

oder mit dem Befehl Exit Sub:

123456789101112131415 Sub ErrGoToEnd()Bei Fehler GoTo endProc'Irgendein CodeGoTo skipExitendProc:Abo beendenüberspringenExit:'Noch mehr CodeEnd Sub

Err.Clear, On Error GoTo -1 und Zurücksetzen von Err.Number

Nachdem ein Fehler behandelt wurde, sollten Sie den Fehler im Allgemeinen löschen, um zukünftige Probleme mit der Fehlerbehandlung zu vermeiden.

Nachdem ein Fehler aufgetreten ist, beide Err.Clear und Bei Fehler GoTo -1 kann zum Zurücksetzen verwendet werden Fehlernummer auf 0. Aber es gibt einen sehr wichtigen Unterschied: Err.Clear setzt nicht den eigentlichen Fehler selbst zurück, er setzt nur den Fehlernummer.

Was bedeutet das? Verwenden vonErr.Clear, können Sie die Einstellung für die Fehlerbehandlung nicht ändern. Um den Unterschied zu sehen, testen Sie diesen Code und ersetzen Sie ihn Bei Fehler GoTo -1 mit Err.Clear:

123456789101112131415161718192021 Sub ErrExamples()Bei Fehler GoTo errHandler:'"Anwendungsdefinierter" FehlerFehler (13)Abo beendenerrHandler:'Fehler löschenBei Fehler GoTo -1Bei Fehler GoTo errHandler2:'Fehler "Typenkonflikt"Fehler (1034)Abo beendenerrHandler2:Debug.Print Err.BeschreibungEnd Sub

Normalerweise empfehle ich immer die Verwendung von Bei Fehler GoTo -1, es sei denn, Sie haben einen guten Grund für die Verwendung Err.Clear stattdessen.

VBA bei Fehler MsgBox

Möglicherweise möchten Sie auch bei einem Fehler ein Meldungsfeld anzeigen. In diesem Beispiel werden unterschiedliche Meldungsfelder angezeigt, je nachdem, wo der Fehler auftritt:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx()Dim errMsg As StringBei Fehler GoTo errHandler'Stufe 1errMsg = "Beim Kopieren und Einfügen ist ein Fehler aufgetreten."'Err.Erhöhen (11)'Stufe 2errMsg = "Während der Datenvalidierung ist ein Fehler aufgetreten."'Err.Erhöhen (11)'Stufe 3errMsg = "Während der GuV-Erstellung und der Übernahmephase ist ein Fehler aufgetreten."Err.Erhöhen (11)'Stufe 4errMsg = "Beim Versuch, den Import auf der Setup-Seite zu protokollieren, ist ein Fehler aufgetreten"'Err.Erhöhen (11)GoTo endProcerrHandler:MsgBox errMsgendProc:End Sub

Hier würden Sie Err.Raise(11) durch Ihren tatsächlichen Code ersetzen.

VBA IsError

Eine andere Möglichkeit, Fehler zu behandeln, besteht darin, sie mit der VBA-IsError-Funktion zu testen. Die Funktion IsError testet einen Ausdruck auf Fehler und gibt TRUE oder FALSE zurück, wenn ein Fehler auftritt.

123 Sub IsErrorEx()MsgBox IsError(Range("a7").Value)End Sub

Wenn Fehler VBA

Sie können Fehler in VBA auch mit der Excel-IfError-Funktion behandeln. Auf die IfError-Funktion muss über die ArbeitsblattFunktionsklasse:

1234567 Sub IfErrorEx()Dim n As Longn = WorksheetFunction.IfError(Range("a10").Value, 0)MsgBox-NrEnd Sub

Dies gibt den Wert von Range A10 aus, wenn der Wert ein Fehler ist, wird stattdessen 0 ausgegeben.

VBA-Fehlertypen

Laufzeitfehler

Wie oben erwähnt:

VBA-Laufzeitfehler sind Fehler, die während der Codeausführung auftreten. Beispiele für Laufzeitfehler sind:

  • Verweisen auf eine nicht vorhandene Arbeitsmappe, ein Arbeitsblatt oder ein anderes Objekt
  • Ungültige Daten, z. Verweisen auf eine Excel-Zelle, die einen Fehler enthält
  • Versuch durch Null zu dividieren

Sie können Laufzeitfehler mit den oben beschriebenen Methoden „fehlerbehandeln“.

Syntaxfehler

VBA-Syntaxfehler sind Fehler beim Schreiben von Code. Beispiele für Syntaxfehler sind:

  • Rechtschreibfehler
  • Fehlende oder falsche Interpunktion

Der VBA-Editor identifiziert viele Syntaxfehler mit roter Hervorhebung:

Der VBA-Editor hat auch eine Option zur „Auto Syntax Check“:

Wenn dies aktiviert ist, generiert der VBA-Editor ein Meldungsfeld, das Sie auf Syntaxfehler aufmerksam macht, nachdem Sie eine Codezeile eingegeben haben:

Ich persönlich finde das extrem nervig und deaktiviere die Funktion.

Kompilierungsfehler

Vor dem Versuch, eine Prozedur auszuführen, "kompiliert" VBA die Prozedur. Beim Kompilieren wird das Programm vom Quellcode (den Sie sehen können) in eine ausführbare Form (die Sie nicht sehen können) umgewandelt.

VBA-Kompilierungsfehler sind Fehler, die das Kompilieren des Codes verhindern.

Ein gutes Beispiel für einen Kompilierungsfehler ist eine fehlende Variablendeklaration:

Andere Beispiele sind:

  • Zum ohne Nächste
  • Auswählen ohne Auswahl beenden
  • Wenn ohne Ende Wenn
  • Anrufen Verfahren das gibt es nicht

Syntaxfehler (vorheriger Abschnitt) sind eine Untermenge von Kompilierungsfehlern.

Debug > Kompilieren

Wenn Sie versuchen, eine Prozedur auszuführen, werden Kompilierungsfehler angezeigt. Aber im Idealfall würden Sie Kompilierungsfehler erkennen, bevor Sie versuchen, die Prozedur auszuführen.

Sie können dies tun, indem Sie das Projekt im Voraus kompilieren. Gehen Sie dazu zu Debug > VBA-Projekt kompilieren.

Der Compiler wird zum ersten Fehler "gehen". Nachdem Sie diesen Fehler behoben haben, kompilieren Sie das Projekt erneut. Wiederholen, bis alle Fehler behoben sind.

Sie können sehen, dass alle Fehler behoben sind, weil VBA-Projekt kompilieren wird ausgegraut:

Überlauffehler

Die VBA-Überlauffehler tritt auf, wenn Sie versuchen, einen Wert in eine zu große Variable einzugeben. Zum Beispiel, Ganzzahlige Variablen kann nur Werte zwischen -32.768 bis 32.768 enthalten. Wenn Sie einen größeren Wert eingeben, erhalten Sie einen Overflow-Fehler:

Verwenden Sie stattdessen die Lange Variable um die größere Zahl zu speichern.

Andere VBA-Fehlerbegriffe

VBA-Catch-Fehler

Im Gegensatz zu anderen Programmiersprachen gibt es in VBA keine Fang-Anweisung. Sie können jedoch eine Catch-Anweisung replizieren, indem Sie verwenden Bei Fehler Fortsetzen als nächstes und Wenn Fehlernummer 0 Dann. Dies wird oben unter Fehlerbehandlung mit Err.Number behandelt.

VBA-Fehler beim Ignorieren

Um Fehler in VBA zu ignorieren, verwenden Sie einfach die Bei Fehler Fortsetzen als nächstes Stellungnahme:

1 Bei Fehler Fortsetzen als nächstes

Wie oben erwähnt, sollten Sie jedoch mit dieser Anweisung vorsichtig sein, da sie keinen Fehler behebt, sondern einfach die Codezeile ignoriert, die den Fehler enthält.

VBA-Wurffehler / Err.Raise

Um einen Fehler in VBA zu beheben, verwenden Sie die Err.Erhöhen Methode.

Diese Codezeile löst den Laufzeitfehler ’13’ aus: Typkonflikt:

1 Err.Erhöhen (13)

VBA-Fehlerabfangen

VBA-Fehlerabfangen ist nur ein anderer Begriff für VBA-Fehlerbehandlung.

VBA-Fehlermeldung

EIN VBA-Fehlermeldung sieht aus wie das:

Wenn Sie auf "Debug" klicken, sehen Sie die Codezeile, die den Fehler auslöst:

VBA-Fehlerbehandlung in einer Schleife

Die beste Methode zur Fehlerbehandlung innerhalb einer Schleife ist die Verwendung von Bei Fehler Fortsetzen als nächstes zusammen mit Fehlernummer um zu erkennen, ob ein Fehler aufgetreten ist (Denken Sie daran, Err.Clear um den Fehler nach jedem Auftreten zu löschen).

Das folgende Beispiel teilt zwei Zahlen (Spalte A durch Spalte B) und gibt das Ergebnis in Spalte C aus. Wenn ein Fehler auftritt, ist das Ergebnis 0.

12345678910111213141516 Teiltest()Zelle als Bereich dimmenBei Fehler Fortsetzen als nächstesFür jede Zelle im Bereich("a1:a10")'Zellenwert festlegencell.Offset(0, 2).Value = cell.Value / cell.Offset(0, 1).Value'Wenn Cell.Value Fehler ist, dann Standard auf 0Wenn Fehlernummer 0 DannZelle.Offset(0, 2).Wert = 0Err.ClearEnde WennNächsteEnd Sub

VBA-Fehlerbehandlung in Access

Alle oben genannten Beispiele funktionieren in Access VBA genauso wie in Excel VBA.

123456789101112131415161718 Funktion DelRecord (frm als Formular)'Diese Funktion wird verwendet, um einen Datensatz in einer Tabelle aus einem Formular zu löschenBei Fehler GoTo-EndeMit frmWenn .NewRecord Dann.Rückgängig machenExit-FunktionEnde WennEnde mitMit frm.RecordsetClone.Lesezeichen = frm.Lesezeichen.Löschenfrm.AnfrageEnde mitExit-FunktionEnde:EndeEndfunktion

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave