Arten von vba-fehlern: debugging und lösung
Wie jede andere Programmiersprache hat auch VBA Pech, wenn es zu Fehlern kommt und man sich auf jeden Fall mit ihnen auseinandersetzen muss. Sie können unterschiedliche Ursachen haben, etwa fehlerhafte Codierung, unmögliche Operationen (z. B. Division durch Null) oder unerwartete Fehler.
Der beste Weg, damit umzugehen, besteht darin, ein gutes Verständnis aller möglichen Ergebnisse zu haben, die Sie mit dem Code erzielen können. Schauen Sie sich das Beispiel unten an, in dem wir einen VBA-Code haben, der die Quadratwurzel der Zahl anhand des Werts berechnet, den Sie in der ausgewählten Zelle haben.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
Wenn die aktive Zelle jedoch einen anderen Wert als eine Zahl hat, erhalten Sie einen Laufzeitfehler wie unten.
Fehlerparameter in VBA (Error Catching)
In der VBA-Option können Sie die Einstellung so konfigurieren, dass Fehler behandelt werden, bevor Sie mit dem Schreiben von Codes beginnen. Um die VBA-Einstellungen zu öffnen, gehen Sie zu Extras ➤ Optionen ➤ Allgemein ➤ Fehlererkennung. Hier haben Sie drei Möglichkeiten, die Sie nutzen können.
- Bei allen Fehlern stoppen : Wenn Sie diese Option aktiviert haben, stoppt VBA den Code für alle Arten von Fehlern, selbst wenn Sie alle Arten von Fehlerbehandlungstechniken verwendet haben.
- Manipulationsklassenmodul : Mit dieser Option stoppt VBA alle Ihre Codes, die von keiner Technik verarbeitet werden. Und wenn Sie Objekte wie Userforms verwenden, werden auch diese Objekte durchbrochen und die genaue Zeile hervorgehoben, in der sich der Fehler befindet.
- Bei nicht behandelten Fehlern unterbrechen : Dies ist die Standardeinstellung, die Sie über alle Fehler informiert, für die Sie keine Fehlerbehandlungstechniken verwenden, und die den Code für alle nicht behandelten Fehler stoppt. (Wenn Sie jedoch 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.)
Arten von VBA-Fehlern
Um VBA-Fehler zu verstehen, können Sie sie in vier Kategorien einteilen. Im Folgenden finden Sie eine Erklärung dieser Fehlertypen.
1. Syntaxfehler
Beim Schreiben von VBA-Code müssen Sie eine bestimmte Syntax befolgen. Wenn Sie diese ignorieren oder nicht richtig schreiben, kann es zu einem SYNTAX-Fehler (auch Sprachfehler genannt) kommen. Es ist wie bei Tippfehlern, die Sie beim Schreiben Ihrer Codes machen.
Nun, VBA hilft Ihnen, indem es diese Fehler meldet, indem es eine Fehlermeldung anzeigt. Sie müssen lediglich sicherstellen, dass „Automatische Syntaxprüfung“ in Ihrem VB-Editor aktiviert ist.
Gehen Sie zu Tool ➤ Optionen und stellen Sie sicher, dass das Kontrollkästchen „Automatische Syntaxprüfung“ aktiviert ist. Wenn Sie dabei einen SYNTAX-Fehler machen, zeigt VBA eine Fehlermeldung an.
Wenn jedoch die „Automatische Syntaxprüfung“ deaktiviert ist, hebt VBA die Codezeile mit dem Fehler zwar hervor, zeigt die Fehlermeldung jedoch nicht an.
2. Kompilierungsfehler
Dies geschieht, wenn Sie Code schreiben, um eine Aktivität auszuführen, diese Aktivität jedoch ungültig ist oder nicht von VBA ausgeführt werden kann. Das beste Beispiel ist, dass Sie Code haben, der eine IF-Anweisung verwendet, Sie aber das Hinzufügen von END IF am Ende der Anweisung verpasst haben und jetzt, wenn Sie dieses VBA ausführen, eine Kompilierungsfehlermeldung angezeigt wird.
Abgesehen davon gibt es noch weitere Beispiele für Kompilierungsfehler:
- Verwenden von For ohne Next ( For Next ).
- Wählen Sie aus, ohne das Ende auszuwählen ( Fall auswählen ).
- Deklarieren Sie keine Variable, wenn Sie „ Explicit Option “ aktiviert haben.
- Aufrufen einer Unterfunktion/Funktion, die nicht existiert.
3. Laufzeitfehler
Bei der Ausführung des Codes tritt ein Laufzeitfehler auf. Erinnern Sie sich an das Beispiel, das ich Ihnen oben mitgeteilt habe, als der Code die Quadratwurzel einer Zahl berechnete.
Wenn beim Ausführen des Codes ein Laufzeitfehler auftritt, stoppt es den Code und zeigt Ihnen das Fehlerdialogfeld an. Dieses Fehlerfeld informiert über die Art des Fehlers, den Sie haben. Angenommen, Sie haben Code geschrieben, der eine Arbeitsmappe an dem von Ihnen angegebenen Speicherort öffnet , aber diese Arbeitsmappe wird jetzt von jemandem verschoben oder gelöscht.
Wenn Sie den Code ausführen, zeigt Ihnen VBA einen Laufzeitfehler an, da diese Datei an diesem Speicherort nicht gefunden werden kann. Die Meldung, die Sie bei einem Laufzeitfehler erhalten, beschreibt die Ursache, die Ihnen hilft, die Ursache des Fehlers zu verstehen.
Und wenn ein Laufzeitfehler auftritt, wird die Codeausführung gestoppt. Wenn Sie auf die Schaltfläche „Debuggen“ klicken, wird Ihnen die Codezeile angezeigt, die diesen Fehler enthält, indem sie gelb hervorgehoben wird. Oder Sie können auf die Schaltfläche „Ende“ klicken, um die Codeausführung zu stoppen und die Fehlermeldung zu schließen.
4. Logischer Fehler
Dies ist kein Fehler, sondern ein Fehler beim Schreiben des Codes. Diese Art von Fehlern kann Ihnen manchmal Schwierigkeiten bereiten, sie zu finden und zu beheben.
Angenommen, Sie schreiben Code und verwenden beim Deklarieren einer Variablen den falschen Datentyp oder die falschen Berechnungsschritte. In diesem Fall funktioniert Ihr Code einwandfrei und Sie werden diesen Fehler nicht so leicht finden. Der beste Weg, diese Art von Problem zu lösen, besteht darin, jede Codezeile einzeln auszuführen.
Verwenden von Debugging-Tools in VBA
VBA stellt Ihnen eine Reihe von Tools zur Verfügung, mit denen Sie Ihren Code debuggen und Fehler aus Ihren Codes entfernen können.
1. Kompilieren Sie das VBA-Projekt
Im Visual Basic-Editor gibt es eine Option, die Sie sofort nach Fertigstellung Ihres Codes verwenden können. Diese Kompilierungsoptionen analysieren jede Zeile Ihres Codes und zeigen ein Meldungsfeld an, wenn ein Fehler in Ihrem Code vorliegt.
Hinweis: Die Option „VBA kompilieren“ verfolgt nur Syntax- und Kompilierungsfehler, keine Laufzeitfehler, da diese Fehler nur auftreten, wenn ein Code ausgeführt wird. Um „VBA-Projekt kompilieren“ zu verwenden, gehen Sie zu ➤ Debuggen ➤ VBA-Projekt kompilieren.
Sobald Sie „VBA-Projekt kompilieren“ ausgeführt haben und Ihr Code keine Fehler enthält, werden die Optionen ausgegraut.
2. Führen Sie jede Codezeile einzeln aus
So mache ich es. Wenn ich einen Code fertigstelle, führe ich ihn einfach Zeile für Zeile aus, um zu prüfen, ob ein Fehler vorliegt. Dies kann einige Zeit dauern, hilft Ihnen jedoch bei der Behebung aller Fehler (Syntax, Kompilierung und Ausführung).
Auf der „Debug-Symbolleiste“ gibt es eine Schaltfläche „Einsteigen“, mit der Sie Code Zeile für Zeile ausführen können. Sie können aber auch einfach F8 drücken, um eine einzelne Zeile auszuführen, und dann erneut drücken, um die nächste Zeile im Code auszuführen.
Verwenden der „On ERROR“-Anweisung zur Behandlung von VBA-Fehlern
Es ist wichtig, dass Sie Ihre Codes überprüfen und mögliche Fehler in allen verfügbaren Debugging-Methoden finden. Der beste und effizienteste Weg besteht jedoch darin, Anweisungen zur Fehlerbehandlung zu erstellen, die einen Fehler behandeln und Ihren Code bei der Ausführung fehlerfrei machen können. Lassen Sie uns diese Aussagen untersuchen. Wenn in einem VBA-Code ein Fehler auftritt, kann dieser Fehler am besten wie folgt behandelt werden:
- Lassen Sie den VBA den Fehler ignorieren und den Code ausführen
- Lassen Sie einen speziellen Befehlssatz ausführen, wenn ein Fehler auftritt.
In beiden Lösungen können Sie „On Error“-Anweisungen verwenden. Nachfolgend finden Sie vier „On Error“-Anweisungen, die Sie verwenden können. Schauen wir uns nun jede Aussage einzeln an.
1. Wenn Sie einen Fehler machen, beginnen Sie erneut
Diese einfache Codezeile ermöglicht es VBA, den Code auch dann weiter auszuführen, wenn ein Fehler auftritt. Die IDEE ist einfach: Fahren Sie mit der nächsten Codezeile fort, wenn während der Ausführung irgendwo ein Fehler festgestellt wird.
Im folgenden Code haben Sie zwei Codezeilen:
- Die erste Zeile gibt an, dass der Wert in Zelle A1 25 geteilt durch 0 ist
- Und die zweite Zeile besagt, dass der Zellenwert A2 10 geteilt durch 5 ist
Jetzt gibt es ein Problem mit dem Code, den Sie online haben. Wie Sie wissen, ist das Ergebnis ein Fehler, wenn Sie etwas durch 0 dividieren. Wenn Sie diesen Code ausführen, zeigt VBA die Fehlermeldung „Laufzeitfehler ‚11‘ Division durch Null“ an und stoppt die Ausführung.
Wenn Sie jedoch „On Error Resume Next“ ganz am Anfang des Codes hinzufügen und den Code ausführen, ignoriert VBA einfach die Codezeile, in der der Fehler auftritt, fährt mit der zweiten Zeile fort und fügt diesen Wert in Zelle A2 hinzu.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
Wenn Sie also möchten, dass Ihr Code ausgeführt wird, obwohl irgendwo ein Fehler auftritt, verwenden Sie einfach die Anweisung „On Error Resume Next“ in Ihrem Code.
Aber noch etwas sollten Sie beachten: Es werden nur Fehler ignoriert, die danach auftreten.
Angenommen, in Zeile 5 tritt ein Fehler auf und Sie haben in Zeile 8 „On Error Resume Next“ hinzugefügt. Dieser Fehler wird nicht übersprungen. Daher ist es am besten, es als erste Codezeile in die Prozedur einzufügen.
2. Im Falle eines GoTo 0-Fehlers
Dies ist das Standardverhalten von VBA: Wenn ein Fehler auftritt, stoppt es die Codeausführung.
Nun, die Verwendung von „On Error GoTo 0“ macht in Ihrem Code keinen Unterschied. VBA stoppt einfach den Code und zeigt eine Meldung mit einer Beschreibung des Fehlers an. Warum sollte ich mir also die Mühe machen, es zu benutzen? Kluge Frage. Verwenden wir das Beispiel, das Sie oben in „ On Error Resume Next “ verwendet haben.
Wenn in diesem Code ein Fehler auftritt, übernimmt VBA die nächste Codezeile und führt sie aus, ohne dass eine Fehlermeldung angezeigt wird. Angenommen, Sie haben mehr Zeilen in Ihrem Code und möchten diese Zeilen nicht überschreiten, wenn im Code ein Fehler auftritt.
Wenn Sie also nach der zweiten Codezeile „On Error GoTo 0“ eingeben, wird der Standard-Fehlerbehandler von VBA wiederhergestellt, der bei jedem Auftreten eines Fehlers Fehlermeldungen anzeigt.
3. Im Falle eines GoTo-Fehlers [Label]
Denken Sie an einen Ort in einem Gebäude, zu dem Sie im Notfall gehen können. Ebenso können Sie mit „On Error GoTo [Label]“ einfach einen separaten Codeblock in Ihrem Hauptcode erstellen, um einen Fehler zu behandeln.
Tatsächlich ist „On Error GoTo [Label]“ eine viel bessere und bequemere Möglichkeit, mit Fehlern umzugehen. Im Code unten haben Sie „On Error GoTo Oh!“ Fehler“ jetzt in dieser Zeilendeklaration das Wort „Oh!“ „Fehler“ ist die Bezeichnung.
Wenn Sie sich das Ende des Codes ansehen, haben Sie einen bestimmten Anfang mit dem Labelnamen und dann einen Code für ein Meldungsfeld mit einer Nachricht zum Code.
Was passiert nun, wenn ein Fehler auftritt? Das VBA springt zum Label „Oh! Fehler“ und führt den Codeblock aus, den Sie nach dieser Bezeichnung haben.
Aber es gibt eine Sache, auf die Sie achten müssen: Wenn kein Fehler auftritt, wird die Bezeichnung, die Sie in Ihrem Code haben, ausgeführt. Es gibt zwei Dinge, die Sie tun müssen:
- Stellen Sie zunächst sicher, dass Sie Ihr Fehler-Tag am Ende des Codes hinzufügen.
- Zweitens fügen Sie vor der Fehlerbezeichnung ein „Exit Sub“ hinzu.
Damit profitieren Sie in beiden Situationen. Nehmen wir an, wenn ein Fehler auftritt und VBA zu der von Ihnen angegebenen Bezeichnung wechselt, gibt es nur Code von der Bezeichnung selbst bis zum Code. Und wenn kein Fehler auftritt, beendet die Anweisung „Exit Sub“, die Sie vor dem Label haben, die Prozedur, ohne das Fehlerlabel auszuführen.
4. Im Falle eines GoTo-Fehlers -1
Bevor wir darauf eingehen, möchte ich Ihnen etwas mitteilen. Wenn in einem Code ein Fehler auftritt, speichert VBA dieses Fehlerprotokoll in seinem Speicher und löscht es erst, wenn die Routine abgeschlossen ist.
O VBA! Lebe in der Gegenwart
Um den zweiten Fehler im VBA-Code zu behandeln, müssen Sie den ersten Fehler aus dem VBA-Speicher löschen. Im folgenden Code haben Sie zwei „On Error GoTo [Label]“-Anweisungen, die Fehler aus zwei verschiedenen Codeblöcken behandeln.
Wenn Sie diesen Code jedoch ausführen, springt VBA beim zweiten Fehler nicht zu der von Ihnen festgelegten Bezeichnung und zeigt stattdessen die Fehlermeldung „Typkonflikt“ an.
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Um dieses Problem zu beheben, können Sie „On Error GoTo -1“ verwenden, wodurch VBA den aktuellen Fehler aus seinem Speicher entfernen kann.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Wenn Sie nun diesen Code ausführen, entfernt „On Error GoTo -1“ den Fehler aus dem Speicher und VBA behandelt den Fehler in der zweiten Anweisung wie gewünscht.
Was muss ich sonst noch wissen, um Fehler in VBA zu behandeln?
Neben der Verwendung von Fehlerbehandlungstechniken gibt es noch einige andere Dinge, mit denen Sie Fehler besser behandeln können.
Objektfehler
Wenn beim Ausführen des Codes ein Fehler aufgetreten ist, können Sie das Err-Objekt verwenden, um Details zum Fehler abzurufen. Es gibt einige Eigenschaften und Methoden, die Sie mit dem Err-Objekt verwenden können. Lassen Sie uns sie einzeln lernen.
Eigenschaften
Hier sind die Eigenschaften, die Sie mit dem Err-Objekt verwenden können:
- Err.Number : Wenn ein Fehler aufgetreten ist, wird eine Nummer im Err-Objekt gespeichert. Wenn im folgenden Code ein Fehler auftritt, wird im Meldungsfeld die Fehlernummer angezeigt.
- Err.Description : Diese Eigenschaft zeigt die Fehlerbeschreibung an, die Ihnen helfen kann, die Ursache des Fehlers zu verstehen.
- Err.Source: Diese Eigenschaft sagt Ihnen, in welchem Projekt der Fehler aufgetreten ist.
- Err.HelpContext: Diese Eigenschaft gibt die Hilfekontext-ID für den Fehler in der Hilfedatei zurück.
- Err.HelpContext: Dies ist ein Zeichenfolgewert für den Speicherort der Hilfedatei.
Wenn Sie Fehler mithilfe von Fehlerbehandlungstechniken behandeln, verwenden Sie das Err-Objekt normalerweise nicht häufig in Ihren Codes. Aber unten ist ein einfaches Beispiel für die Verwendung.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
Wenn Sie den obigen Code ausführen und ein Fehler aufgetreten ist, wird ein Meldungsfeld mit der Fehlernummer und der Fehlerbeschreibung angezeigt.
Methoden
Mit Err Object können Sie auch zwei Methoden verwenden.
- Err.Clear: Diese Methode löscht die Fehlernummer und Fehlerbeschreibung aus dem VBA-Speicher (dies unterscheidet sich von „On Error GoTo -1“, da der Fehler dadurch nicht vollständig zurückgesetzt wird).
- Err.Raise: Mit dieser Methode können Sie absichtlich einen Laufzeitfehler in Ihrem Code generieren . Hier ist die zu befolgende Syntax:
Err .Raise [Nummer], [Quelle], [Beschreibung], [Hilfedatei], [Hilfekontext]
Schnelle Tipps zur Fehlerbehandlung
Hier sind einige schnelle Tipps, mit denen Sie VBA-Fehler besser behandeln können.
- Verwenden Sie „On Error Resume Next“ nur, wenn Sie sicher wissen, dass ein Fehler auftritt und es akzeptabel ist, die Codezeile mit einem Fehler zu überspringen und sicher mit der nächsten Zeile fortzufahren.
- Der beste Weg, mit Laufzeitfehlern umzugehen, ist die Verwendung von „Error Handler“ mit „On Error GoTo [Label]“. Dadurch wird sichergestellt, dass Sie zwar benachrichtigt werden, wenn der Fehler auftritt, die unangenehme Fehlermeldung jedoch nicht angezeigt wird.
- Stellen Sie bei jeder Verwendung des Fehlerhandlers sicher, dass Sie zuerst „Exit Sub“ verwenden.