Excel VBA-Fehlerbehandlung - Alles, was Sie wissen müssen!

Egal wie erfahren Sie mit VBA-Codierung sind, Fehler werden immer ein Teil davon sein.

Der Unterschied zwischen einem Anfänger und einem erfahrenen VBA-Programmierer besteht darin, dass die erfahrenen Programmierer wissen, wie man Fehler effektiv behandelt und verwendet.

In diesem Tutorial zeige ich Ihnen verschiedene Möglichkeiten, wie Sie Fehler in Excel VBA effektiv behandeln können.

Bevor wir uns mit der VBA-Fehlerbehandlung befassen, lassen Sie uns zunächst die verschiedenen Arten von Fehlern verstehen, die beim Programmieren in Excel VBA wahrscheinlich auftreten.

Arten von VBA-Fehlern in Excel

Es gibt vier Arten von Fehlern in Excel VBA:

  1. Syntaxfehler
  2. Kompilierungsfehler
  3. Laufzeitfehler
  4. Logische Fehler

Lassen Sie uns schnell verstehen, was diese Fehler sind und wann Sie wahrscheinlich darauf stoßen.

Syntax-Fehler

Ein Syntaxfehler tritt, wie der Name schon sagt, auf, wenn VBA einen Fehler in der Syntax im Code feststellt.

Wenn Sie beispielsweise einen Teil der benötigten Anweisung/Syntax vergessen, wird der Kompilierungsfehler angezeigt.

Im folgenden Code sehe ich, sobald ich nach der zweiten Zeile die Eingabetaste drücke, einen Kompilierungsfehler. Dies liegt daran, dass IF-Anweisung muss die ‘Dann‘-Befehl, der im folgenden Code fehlt.

Notiz: Wenn Sie einen Code in Excel VBA eingeben, wird nach jedem Satz gesucht, sobald Sie die Eingabetaste drücken. Wenn VBA etwas in der Syntax fehlt, zeigt es sofort eine Nachricht mit etwas Text an, der Ihnen helfen kann, den fehlenden Teil zu verstehen.

Um sicherzustellen, dass der Syntaxfehler immer dann angezeigt wird, wenn etwas fehlt, müssen Sie sicherstellen, dass die Autosyntaxprüfung aktiviert ist. Klicken Sie dazu auf „Extras“ und dann auf „Optionen“. Stellen Sie im Optionsdialogfeld sicher, dass die Option „Auto Syntax Check“ aktiviert ist.

Wenn die Option "Auto Syntax Check" deaktiviert ist, wird VBA die Zeile mit dem Syntaxfehler immer noch rot markieren, aber das Fehlerdialogfeld wird nicht angezeigt.

Kompilierungsfehler

Kompilierungsfehler treten auf, wenn etwas fehlt, das für die Ausführung des Codes erforderlich ist.

Im folgenden Code wird beispielsweise, sobald ich versuche, den Code auszuführen, der folgende Fehler angezeigt. Dies geschieht, weil ich die IF Then-Anweisung verwendet habe, ohne sie mit dem obligatorischen 'End If' zu schließen.

Ein Syntaxfehler ist auch eine Art von Kompilierungsfehler. Ein Syntaxfehler tritt auf, sobald Sie die Eingabetaste drücken und VBA erkennt, dass etwas fehlt. Ein Kompilierungsfehler kann auch auftreten, wenn VBA beim Eingeben des Codes keine fehlenden Elemente findet, aber wenn der Code kompiliert oder ausgeführt wird.

VBA überprüft jede Zeile, während Sie den Code eingeben, und hebt den Syntaxfehler hervor, sobald die Zeile falsch ist und Sie die Eingabetaste drücken. Kompilierungsfehler werden dagegen erst erkannt, wenn der gesamte Code von VBA analysiert wird.

Im Folgenden sind einige Szenarien aufgeführt, in denen der Kompilierungsfehler auftritt:

  1. Verwenden einer IF-Anweisung ohne das End IF
  2. For-Anweisung mit Next . verwenden
  3. Verwenden der Select-Anweisung ohne die Verwendung der End Select
  4. Die Variable wird nicht deklariert (dies funktioniert nur, wenn Option Explicit aktiviert ist)
  5. Aufruf einer Unter-/Funktion, die nicht existiert (oder mit falschen Parametern)
Hinweis zu „Option Explizit“: Wenn Sie „Option Explicit“ hinzufügen, müssen Sie alle Variablen deklarieren, bevor Sie den Code ausführen. Wenn eine Variable nicht deklariert wurde, zeigt VBA einen Fehler an. Dies ist eine bewährte Vorgehensweise, da ein Fehler angezeigt wird, falls Sie eine falsch geschriebene Variable haben. Weitere Informationen zu Option Explicit finden Sie hier.

Laufzeitfehler

Laufzeitfehler sind solche, die auftreten, wenn der Code ausgeführt wird.

Laufzeitfehler treten nur auf, wenn alle Syntax- und Kompilierungsfehler behoben sind.

Wenn Sie beispielsweise Code ausführen, der eine Excel-Arbeitsmappe öffnen soll, diese Arbeitsmappe jedoch nicht verfügbar ist (entweder gelöscht oder der Name geändert wurde), gibt Ihr Code einen Laufzeitfehler aus.

Wenn ein Laufzeitfehler auftritt, wird der Code angehalten und das Fehlerdialogfeld angezeigt.

Die Meldung im Dialogfeld Laufzeitfehler ist etwas hilfreicher. Es versucht, das Problem zu erklären, das Ihnen helfen kann, es zu beheben.

Wenn Sie auf die Schaltfläche Debug klicken, wird der Teil des Codes hervorgehoben, der zum Fehler führt.

Wenn Sie den Fehler behoben haben, können Sie auf die Schaltfläche Ausführen in der Symbolleiste klicken (oder F5) drücken, um den Code dort weiter auszuführen, wo er ihn verlassen hat.

Oder Sie können auch auf die Schaltfläche Ende klicken, um den Code zu verlassen.

Wichtig: Falls Sie im Dialogfeld auf die Schaltfläche Ende klicken, wird der Code an der Zeile gestoppt, an der er angetroffen wird. Allerdings wären alle Codezeilen davor ausgeführt worden.

Logische Fehler

Logische Fehler würden Ihren Code nicht stoppen, können aber zu falschen Ergebnissen führen. Dies können auch die am schwierigsten zu behebenden Arten von Fehlern sein.

Diese Fehler werden vom Compiler nicht hervorgehoben und müssen manuell behoben werden.

Ein Beispiel für logische Fehler (an denen ich oft feststecke) ist das Ablaufen in eine Endlosschleife.

Ein anderes Beispiel könnte sein, wenn es ein falsches Ergebnis liefert. Beispielsweise können Sie im Code eine falsche Variable verwenden oder zwei Variablen hinzufügen, von denen eine falsch ist.

Es gibt einige Möglichkeiten, wie ich logische Fehler angehe:

  1. Fügen Sie an einer beliebigen Stelle im Code ein Meldungsfeld ein und markieren Sie Werte/Daten, die Ihnen helfen zu verstehen, ob alles wie erwartet läuft.
  2. Anstatt den Code auf einmal auszuführen, gehen Sie jede Zeile einzeln durch. Klicken Sie dazu auf eine beliebige Stelle im Code und drücken Sie F8. Sie würden feststellen, dass jedes Mal, wenn Sie F8 drücken, eine Zeile ausgeführt wird. Auf diese Weise können Sie den Code Zeile für Zeile durchgehen und die logischen Fehler identifizieren.

Verwenden von Debug zum Auffinden von Kompilierungs-/Syntaxfehlern

Sobald Sie mit dem Code fertig sind, empfiehlt es sich, ihn zuerst zu kompilieren, bevor Sie ihn ausführen.

Um einen Code zu kompilieren, klicken Sie auf die Debug-Option in der Symbolleiste und klicken Sie auf Compile VBAProject.

Wenn Sie ein VBA-Projekt kompilieren, durchläuft es den Code und identifiziert Fehler (sofern vorhanden).

Falls es einen Fehler findet, zeigt es Ihnen ein Dialogfeld mit dem Fehler an. Es findet Fehler nacheinander. Wenn es also einen Fehler findet und Sie ihn korrigiert haben, müssen Sie die Kompilierung erneut ausführen, um andere Fehler zu finden (sofern vorhanden).

Wenn Ihr Code fehlerfrei ist, wird die Option VBAProject kompilieren ausgegraut.

Beachten Sie, dass beim Kompilieren nur „Syntax“-Fehler und „Compile“-Fehler gefunden werden. Es findet die Laufzeitfehler NICHT.

Wenn Sie VBA-Code schreiben, möchten Sie nicht, dass die Fehler auftauchen. Um dies zu vermeiden, können Sie viele Methoden zur Fehlerbehandlung verwenden.

In den nächsten Abschnitten dieses Artikels werde ich die Methoden behandeln, die Sie für die VBA-Fehlerbehandlung in Excel verwenden können.

Fehlereinstellungen konfigurieren (behandelte vs. nicht behandelte Fehler)

Bevor Sie mit der Arbeit mit Ihrem Code beginnen, müssen Sie in Excel VBA nach einer Einstellung suchen.

Gehen Sie zur VBA-Symbolleiste und klicken Sie auf Tools und dann auf Optionen.

Klicken Sie im Dialogfeld „Optionen“ auf die Registerkarte „Allgemein“ und stellen Sie sicher, dass in der Gruppe „Error Trapping“ die Option „Break on unhandled Errors“ aktiviert ist.

Lassen Sie mich die drei Optionen erklären:

  1. Bei allen Fehlern brechen: Dadurch wird Ihr Code bei allen Arten von Fehlern gestoppt, selbst wenn Sie die Techniken zur Behandlung dieser Fehler verwendet haben.
  2. Pause im Klassenmodul: Dadurch wird Ihr Code bei allen nicht behandelten Fehlern gestoppt und gleichzeitig, wenn Sie Objekte wie Userforms verwenden, auch innerhalb dieser Objekte unterbrochen und die genaue Zeile hervorgehoben, die den Fehler verursacht.
  3. Pause bei nicht behandelten Fehlern: Dadurch wird Ihr Code nur für die Fehler gestoppt, die nicht behandelt werden. Dies ist die Standardeinstellung, um sicherzustellen, dass Sie auf nicht behandelte Fehler aufmerksam gemacht werden. Wenn Sie Objekte wie Userforms verwenden, wird dadurch nicht die Zeile hervorgehoben, die den Fehler im Objekt verursacht, sondern nur die Zeile, die auf dieses Objekt verweist.
Notiz: Wenn Sie mit Objekten wie Userforms arbeiten, können Sie diese Einstellung in „Break on Class Modules“ ändern. Der Unterschied zwischen #2 und #3 besteht darin, dass Sie bei der Verwendung von Break im Klassenmodul zu der spezifischen Zeile im Objekt gelangen, die den Fehler verursacht. Sie können dies auch anstelle von "Break on Unhandled Errors" wählen.

Kurz gesagt: Wenn Sie gerade erst mit Excel VBA beginnen, stellen Sie sicher, dass "Break on Unhandled Errors" aktiviert ist.

VBA-Fehlerbehandlung mit 'On Error'-Anweisungen

Wenn in Ihrem Code ein Fehler auftritt, können Sie Folgendes tun:

  1. Ignoriere den Fehler und lass den Code fortfahren
  2. Setzen Sie einen Fehlerbehandlungscode ein und führen Sie ihn aus, wenn ein Fehler auftritt

Beide Fehlerbehandlungsmethoden stellen sicher, dass der Endbenutzer keinen Fehler sieht.

Es gibt einige „On Error“-Anweisungen, die Sie verwenden können, um diese zu erledigen.

Bei Fehler Fortsetzen als nächstes

Wenn Sie in Ihrem Code „On Error Resume Next“ verwenden, werden alle aufgetretenen Fehler ignoriert und der Code wird weiter ausgeführt.

Diese Fehlerbehandlungsmethode wird ziemlich oft verwendet, aber Sie müssen bei der Verwendung vorsichtig sein. Da möglicherweise auftretende Fehler vollständig ignoriert werden, können Sie möglicherweise nicht die Fehler identifizieren, die korrigiert werden müssen.

Wenn beispielsweise der folgende Code ausgeführt wird, wird ein Fehler zurückgegeben.

Sub AssignValues() x = 20 / 4 y = 30 / 0 End Sub

Dies geschieht, weil Sie eine Zahl nicht durch Null teilen können.

Aber wenn ich die Anweisung „On Error Resume Next“ in diesem Code verwende (wie unten gezeigt), wird der Fehler ignoriert und ich weiß nicht, dass ein Problem behoben werden muss.

Sub AssignValues() On Error Resume Next x = 20 / 4 y = 30 / 0 End Sub

On Error Resume Next sollte nur verwendet werden, wenn Sie genau wissen, welche Art von Fehlern Ihr VBA-Code voraussichtlich auslösen wird, und es in Ordnung ist, sie zu ignorieren.

Unten ist beispielsweise der VBA-Ereigniscode, der sofort den Datums- und Uhrzeitwert in Zelle A1 eines neu eingefügten Blatts hinzufügen würde (dieser Code wird im Arbeitsblatt und nicht in einem Modul hinzugefügt).

Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Jetzt "dd-mmm-yyyy hh:mm:ss") End Sub

Obwohl dies in den meisten Fällen gut funktioniert, würde es einen Fehler anzeigen, wenn ich ein Diagrammblatt anstelle eines Arbeitsblatts hinzufüge. Da ein Diagrammblatt keine Zellen enthält, würde der Code einen Fehler auslösen.

Wenn ich also die Anweisung „On Error Resume Next“ in diesem Code verwende, funktioniert sie wie erwartet mit Arbeitsblättern und tut nichts mit Diagrammblättern.

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub

Hinweis: Die Anweisung On Error Resume Next wird am besten verwendet, wenn Sie wissen, auf welche Art von Fehlern Sie wahrscheinlich stoßen werden. Und wenn Sie denken, dass es sicher ist, diese Fehler zu ignorieren, können Sie es verwenden.

Sie können diesen Code auf die nächste Stufe bringen, indem Sie analysieren, ob ein Fehler aufgetreten ist, und eine entsprechende Meldung dafür anzeigen.

Der folgende Code würde ein Meldungsfeld anzeigen, das den Benutzer darüber informiert, dass kein Arbeitsblatt eingefügt wurde.

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Jetzt "dd-mmm-yyyy hh:mm:ss") If Err.Number 0 Then MsgBox "Sieht aus wie du Diagrammblatt eingefügt" & vbCrLf & "Error - " & Err.Description End If End Sub

„Err.Number“ wird verwendet, um die Fehlernummer zu erhalten und „Err.Description“ wird verwendet, um die Fehlerbeschreibung zu erhalten. Diese werden später in diesem Tutorial behandelt.

Bei Fehler GoTo 0

„On Error GoTo 0“ stoppt den Code in der Zeile, die den Fehler verursacht, und zeigt ein Meldungsfeld an, das den Fehler beschreibt.

Einfach ausgedrückt, aktiviert es das Standardverhalten der Fehlerprüfung und zeigt die Standardfehlermeldung an.

Warum dann überhaupt verwenden?

Normalerweise müssen Sie „On Error Goto 0“ nicht verwenden, aber es kann nützlich sein, wenn Sie es in Verbindung mit „On Error Resume Next“ verwenden.

Lassen Sie mich erklären!

Der folgende Code würde alle leeren Zellen in der Auswahl auswählen.

Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Select End Sub

Es würde jedoch einen Fehler anzeigen, wenn in den ausgewählten Zellen keine leeren Zellen vorhanden sind.

Um zu vermeiden, dass der Fehler angezeigt wird, können Sie als nächstes On Error Resume verwenden.

Jetzt werden auch alle Fehler angezeigt, wenn Sie den folgenden Code ausführen:

Sub SelectFormulaCells() Bei Fehler Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select End Sub

So weit, ist es gut!

Das Problem tritt auf, wenn es einen Teil des Codes gibt, in dem Fehler auftreten können, und da Sie "On Error Resume Next" verwenden, wird der Code ihn einfach ignorieren und zur nächsten Zeile wechseln.

Im folgenden Code würde es beispielsweise keine Fehlermeldung geben:

Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select '… mehr Code, der Fehler enthalten kann End Sub

Im obigen Code gibt es zwei Stellen, an denen ein Fehler auftreten kann. Der erste Ort ist, wo wir alle leeren Zellen auswählen (mit Selection.SpecialCells) und der zweite befindet sich im verbleibenden Code.

Während der erste Fehler erwartet wird, wird jeder Fehler danach nicht erwartet.

Hier kommt On Error Goto 0 zur Rettung.

Wenn Sie es verwenden, setzen Sie die Fehlereinstellung auf die Standardeinstellungen zurück, sodass Fehler angezeigt werden, wenn sie auftreten.

Im folgenden Code würde es beispielsweise keinen Fehler geben, falls keine leeren Zellen vorhanden sind, aber es würde eine Fehlermeldung wegen '10/0′ auftreten.

Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 '… weiterer Code, der Fehler enthalten kann End Sub

Bei Fehler Gehe zu [Label]

Die beiden oben genannten Methoden - "On Error Resume Next" und "On Error Goto 0" - ermöglichen es uns nicht, den Fehler wirklich zu behandeln. Einer lässt den Code den Fehler ignorieren und der zweite setzt die Fehlerprüfung fort.

On Error Go [Label] ist ein Weg, mit dem Sie angeben können, was Sie tun möchten, falls Ihr Code einen Fehler aufweist.

Unten ist die Codestruktur, die diesen Fehlerhandler verwendet:

Sub Test() On Error GoTo Label: X = 10 / 0 'diese Zeile verursacht einen Fehler '… .Ihr verbleibender Code geht hierher Exit Sub Label: ' Code zur Behandlung des Fehlers End Sub

Beachten Sie, dass vor der Fehlerbehandlung ‚Label‘ ein Exit Sub steht. Dadurch wird sichergestellt, dass im fehlerfreien Fall das Sub verlassen wird und der Code ‚Label‘ nicht ausgeführt wird. Falls Sie Exit Sub nicht verwenden, wird immer der Code „Label“ ausgeführt.

Im folgenden Beispielcode springt der Code, wenn ein Fehler auftritt, und führt den Code im Handlerabschnitt aus (und zeigt ein Meldungsfeld an).

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Es scheint ein Fehler vorzuliegen" & vbCrLf & Err.Description End Sub

Beachten Sie, dass beim Auftreten eines Fehlers der Code bereits ausgeführt wurde und die Zeilen vor der den Fehler verursachenden Zeile ausgeführt hat. Im obigen Beispiel legt der Code den Wert von X auf 12 fest, aber da der Fehler in der nächsten Zeile auftritt, werden die Werte für Y und Z nicht festgelegt.

Sobald der Code zum Fehlerbehandlungscode springt (ErrMsg in diesem Beispiel), führt er alle Zeilen in und unterhalb des Fehlerbehandlungscodes aus und beendet das Sub.

Bei Fehler Gehe zu -1

Dieser ist ein bisschen kompliziert, und in den meisten Fällen ist es unwahrscheinlich, dass Sie ihn verwenden.

Aber ich werde dies trotzdem behandeln, da ich mit einer Situation konfrontiert war, in der dies erforderlich war (können Sie es ignorieren und zum nächsten Abschnitt springen, wenn Sie nur nach Grundlagen suchen).

Bevor ich auf die Mechanik eingehe, möchte ich versuchen zu erklären, wo es nützlich sein kann.

Angenommen, Sie haben einen Code, bei dem ein Fehler aufgetreten ist. Aber alles ist gut, da Sie einen Fehlerhandler haben. Aber was passiert, wenn ein anderer Fehler im Fehlerbehandlungscode auftritt (ja… so ähnlich wie im Einführungsfilm).

In einem solchen Fall können Sie den zweiten Handler nicht verwenden, da der erste Fehler nicht behoben wurde. Während Sie also den ersten Fehler behandelt haben, ist er im Speicher von VBA immer noch vorhanden. Und der VBA-Speicher hat nur einen Platz für einen Fehler - nicht zwei oder mehr.

In diesem Szenario können Sie On Error Goto -1 verwenden.

Es löscht den Fehler und gibt VBA-Speicher frei, um den nächsten Fehler zu behandeln.

Genug Gerede!

Lassen Sie mich das jetzt anhand von Beispielen erklären.

Angenommen, ich habe den folgenden Code. Dies führt zu einem Fehler, da eine Division durch Null erfolgt.

Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 End Sub

Um damit umzugehen, verwende ich einen Fehlerbehandlungscode (mit dem Namen ErrMsg), wie unten gezeigt:

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Es scheint ein Fehler vorzuliegen" & vbCrLf & Err.Description End Sub

Jetzt ist alles wieder gut. Sobald der Fehler auftritt, wird der Fehlerhandler verwendet und zeigt eine Meldungsbox wie unten gezeigt an.

Jetzt erweitere ich den Code, sodass ich mehr Code in oder nach dem Fehlerhandler habe.

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Es scheint ein Fehler vorzuliegen" & vbCrLf & Err.Description A = 10 / 2 B = 35 / 0 End Sub

Da der erste Fehler behandelt wurde, der zweite jedoch nicht, sehe ich erneut einen Fehler wie unten gezeigt.

Trotzdem alles gut. Der Code verhält sich so, wie wir es erwartet haben.

Um den zweiten Fehler zu behandeln, verwende ich einen anderen Fehlerhandler (ErrMsg2).

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Es scheint ein Fehler vorzuliegen" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Es scheint wieder ein Fehler zu sein" & vbCrLf & Err.Description End Sub

Und hier ist es funktioniert nicht wie erwartet.

Wenn Sie den obigen Code ausführen, erhalten Sie immer noch einen Laufzeitfehler, auch wenn der zweite Fehlerhandler vorhanden ist.

Dies geschieht, da wir den ersten Fehler nicht aus dem VBA-Speicher gelöscht haben.

Ja, wir haben es gemeistert! Aber im Gedächtnis bleibt es trotzdem.

Und wenn VBA auf einen anderen Fehler stößt, bleibt es immer noch beim ersten Fehler, und daher wird der zweite Fehlerhandler nicht verwendet. Der Code stoppt an der Zeile, die den Fehler verursacht hat, und zeigt die Fehlermeldung an.

Um den Speicher von VBA zu löschen und den vorherigen Fehler zu löschen, müssen Sie „On Error Goto -1“ verwenden.

Wenn Sie also diese Zeile im folgenden Code hinzufügen und ausführen, funktioniert sie wie erwartet.

Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Es scheint ein Fehler vorzuliegen" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Es scheint wieder ein Fehler vorzuliegen" & vbCrLf & Err.Description End Sub
Notiz: Der Fehler wird automatisch gelöscht, wenn ein Unterprogramm endet.„On Error Goto -1“ kann also nützlich sein, wenn Sie zwei oder mehr als zwei Fehler in derselben Subroutine erhalten.

Das Err-Objekt

Wenn bei einem Code ein Fehler auftritt, wird das Err-Objekt verwendet, um die Details zum Fehler abzurufen (z. B. die Fehlernummer oder die Beschreibung).

Err-Objekteigenschaften

Das Err-Objekt hat die folgenden Eigenschaften:

Eigentum Beschreibung
Nummer Eine Zahl, die den Fehlertyp darstellt. Wenn kein Fehler vorliegt, ist dieser Wert 0
Beschreibung Eine kurze Fehlerbeschreibung
Quelle Projektname, in dem der Fehler aufgetreten ist
HilfeKontext Die Hilfekontext-ID für den Fehler in der Hilfedatei
Hilfedatei Eine Zeichenfolge, die den Speicherort des Ordners und den Dateinamen der Hilfedatei darstellt

Während Sie in den meisten Fällen das Err-Objekt nicht verwenden müssen, kann es manchmal bei der Behandlung von Fehlern in Excel nützlich sein.

Angenommen, Sie haben ein Dataset wie unten gezeigt und möchten für jede Zahl in der Auswahl die Quadratwurzel in der angrenzenden Zelle berechnen.

Der folgende Code kann dies tun, aber da in Zelle A5 eine Textzeichenfolge vorhanden ist, wird ein Fehler angezeigt, sobald dies auftritt.

Sub FindSqrRoot() Dim rng As Range Set rng = Auswahl für jede Zelle In rng cell.Offset(0, 1).Value = Sqr(cell.Value) Nächste Zelle End Sub

Das Problem bei dieser Art von Fehlermeldung ist, dass Sie nichts darüber erfahren, was schief gelaufen ist und wo das Problem aufgetreten ist.

Sie können das Err-Objekt verwenden, um diese Fehlermeldungen aussagekräftiger zu gestalten.

Wenn ich jetzt beispielsweise den folgenden VBA-Code verwende, wird der Code gestoppt, sobald der Fehler auftritt, und ein Meldungsfeld mit der Zellenadresse der Zelle angezeigt, in der ein Problem auftritt.

Sub FindSqrRoot() Dim rng As Range Set rng = Auswahl für jede Zelle In rng Bei Fehler GoTo ErrHandler cell.Offset(0, 1).Value = Sqr(cell.Value) Nächste Zelle ErrHandler: MsgBox "Fehlernummer:" & Err .Nummer & vbCrLf & _ "Fehlerbeschreibung: " & Err.Beschreibung & vbCrLf & _ "Fehler bei: " & Zelle.Adresse End Sub

Der obige Code würde Ihnen viel mehr Informationen geben als der einfache "Typkonflikt", insbesondere die Zellenadresse, damit Sie wissen, wo der Fehler aufgetreten ist.

Sie können diesen Code weiter verfeinern, um sicherzustellen, dass Ihr Code bis zum Ende ausgeführt wird (anstatt bei jedem Fehler zu unterbrechen) und Ihnen dann eine Liste der Zellenadressen anzeigt, an denen der Fehler auftritt.

Der folgende Code würde dies tun:

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Auswahl für jede Zelle In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Fehler in den folgenden Zellen" & ErrorCells Exit Sub End Sub

Der obige Code läuft bis zum Ende und ergibt die Quadratwurzel aller Zellen, die Zahlen enthalten (in der angrenzenden Spalte). Es zeigt dann eine Meldung an, die alle Zellen auflistet, in denen ein Fehler aufgetreten ist (wie unten gezeigt):

Fehlerobjektmethoden

Während die Err-Eigenschaften nützlich sind, um nützliche Informationen zu den Fehlern anzuzeigen, gibt es auch zwei Err-Methoden, die Ihnen bei der Fehlerbehandlung helfen können.

Methode Beschreibung
Klar Löscht alle Eigenschaftseinstellungen des Err-Objekts
Erziehen Erzeugt einen Laufzeitfehler

Lassen Sie uns schnell lernen, was diese sind und wie / warum diese mit VBA in Excel verwendet werden.

Fehler löschen Methode

Angenommen, Sie haben einen Datensatz wie unten gezeigt und möchten die Quadratwurzel all dieser Zahlen in der angrenzenden Spalte erhalten.

Der folgende Code ruft die Quadratwurzeln aller Zahlen in der angrenzenden Spalte ab und zeigt eine Meldung an, dass für die Zellen A5 und A9 ein Fehler aufgetreten ist (da diese Text enthalten).

Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Auswahl für jede Zelle In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Fehler in den folgenden Zellen" & ErrorCells End Sub

Beachten Sie, dass ich die Err.Clear-Methode innerhalb der If Then-Anweisung verwendet habe.

Sobald ein Fehler aufgetreten ist und durch die If-Bedingung abgefangen wurde, setzt die Err.Clear-Methode die Fehlernummer auf 0 zurück. Dadurch wird sichergestellt, dass die IF-Bedingung nur die Fehler für Zellen abfängt, in denen sie ausgelöst wird.

Hätte ich die Err.Clear-Methode nicht verwendet, wäre der Fehler, sobald er auftritt, in der IF-Bedingung immer wahr und die Fehlernummer wurde nicht zurückgesetzt.

Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung von On Error Goto -1, die den Fehler vollständig zurücksetzt.

Notiz: Err.Clear unterscheidet sich von On Error Goto -1. Err.Clear löscht nur die Fehlerbeschreibung und die Fehlernummer. es wird nicht vollständig zurückgesetzt. Dies bedeutet, dass Sie bei einem weiteren Fehler im selben Code nicht in der Lage sind, diesen vor dem Zurücksetzen zu behandeln (was mit "On Error Goto -1" und nicht mit "Err.Clear" möglich ist).

Err Raise-Methode

Mit der Methode Err.Raise können Sie einen Laufzeitfehler auslösen.

Unten ist die Syntax für die Verwendung der Err.Raise-Methode:

Err.Raise [Nummer], [Quelle], [Beschreibung], [Hilfedatei], [HilfeKontext]

Alle diese Argumente sind optional und Sie können diese verwenden, um Ihre Fehlermeldung aussagekräftiger zu gestalten.

Aber warum wollen Sie jemals selbst einen Fehler melden?

Gute Frage!

Sie können diese Methode verwenden, wenn ein Fehler auftritt (was bedeutet, dass es trotzdem zu einem Fehler kommt) und dann verwenden Sie diese Methode, um dem Benutzer mehr über den Fehler zu informieren (anstelle der weniger hilfreichen Fehlermeldung, die VBA anzeigt) standardmäßig).

Angenommen, Sie haben ein Dataset wie unten gezeigt und möchten, dass alle Zellen nur numerische Werte haben.

Sub RaiseError() Dim rng As Range Set rng = Selection on Error GoTo ErrHandler For Each Cell In rng If Not (IsNumeric(Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Keine Zahl", " Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Der obige Code würde eine Fehlermeldung mit der angegebenen Beschreibung und der Kontextdatei anzeigen.

Persönlich habe ich Err.Raise noch nie verwendet, da ich meistens nur mit Excel arbeite. Aber für jemanden, der VBA verwendet, um mit Excel zusammen mit anderen Anwendungen wie Outlook, Word oder PowerPoint zu arbeiten, kann dies nützlich sein.

Hier ist ein ausführlicher Artikel zur Err.Raise-Methode, falls Sie mehr erfahren möchten.

Best Practices für die VBA-Fehlerbehandlung

Egal wie geschickt Sie beim Schreiben von VBA-Code sind, Fehler werden immer ein Teil davon sein. Die besten Programmierer sind diejenigen, die die Fähigkeiten haben, mit diesen Fehlern richtig umzugehen.

Hier sind einige bewährte Methoden, die Sie bei der Fehlerbehandlung in Excel VBA verwenden können.

  1. Verwenden Sie „On Error Go [Label]“ am Anfang des Codes. Dadurch wird sichergestellt, dass alle Fehler, die von dort aus auftreten können, behandelt werden.
  2. Verwenden Sie „On Error Resume Next“ NUR, wenn Sie sich der Fehler, die auftreten können, sicher sind. Verwenden Sie es nur mit erwartetem Fehler. Falls Sie es mit unerwarteten Fehlern verwenden, wird es einfach ignoriert und fortgesetzt. Sie können „On Error Resume Next“ mit „Err.Raise“ verwenden, wenn Sie einen bestimmten Fehlertyp ignorieren und den Rest abfangen möchten.
  3. Stellen Sie bei der Verwendung von Fehlerhandlern sicher, dass Sie Exit Sub vor den Handlern verwenden. Dadurch wird sichergestellt, dass der Fehlerbehandlungscode nur ausgeführt wird, wenn ein Fehler auftritt (sonst wird er immer ausgeführt).
  4. Verwenden Sie mehrere Fehlerhandler, um verschiedene Arten von Fehlern abzufangen. Mit mehreren Fehlerhandlern wird sichergestellt, dass ein Fehler richtig behandelt wird. Sie möchten beispielsweise einen „Typ-Mismatch“-Fehler anders behandeln als einen „Division by 0“-Laufzeitfehler.

Ich hoffe, Sie fanden diesen Excel-Artikel nützlich!

Hier sind einige weitere Excel VBA-Tutorials, die Ihnen gefallen könnten:

  • Excel VBA-Datentypen - Eine vollständige Anleitung
  • Excel VBA-Schleifen - für das nächste, für das nächste, für das nächste, für jedes
  • Excel VBA-Ereignisse - Eine einfache (und vollständige) Anleitung
  • Excel Visual Basic Editor - So öffnen und verwenden Sie ihn in Excel

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

wave wave wave wave wave