Inhaltsverzeichnis
ToggleEinführung
Fehler können sich auf unterschiedliche Weise bemerkbar machen:
- Kompilerfehler
Bei manchen Fehlern gibt der Visual Basic Editor eine Fehlermeldung beim Kompilieren aus. Beispielsweise gibt es eine Fehlermeldung, wenn einer Funktion eine falsche Anzahl an Argumenten übergeben wird. Falls in einem Modul die Anweisung „Option Explicit“ enthalten ist gibt es eine Fehlermeldung, wenn eine Variable nicht deklariert wurde oder wenn man sich vertippt. - Laufzeitfehler
Laufzeitfehler werden erst während der Laufzeit ausgegeben. Beispiele hierfür sind
Laufzeitfehler 6 – Überlauf. Er tritt auf, wenn einer Variablen ein Wert zugewiesen wurde, der außerhalb des Gültigkeitsbereichs für den Datentyps liegt.
Laufzeitfehler 9 – Index außerhalb des gültigen Bereichs. Er tritt beispielsweise auf, wenn ein Element innerhalb einer Collection nicht gefunden wurde.
Laufzeitfehler 13 – Typen unverträglich. Er tritt auf, wenn einer Variablen ein Wert zugewiesen wird, der für den entsprechenden Datentyp nicht zulässig ist. - Logische Fehler
Logische Fehler können von VBA nicht erkannt werden. Sie werden durch Fehler bei der Programmierung verursacht. Logische Fehler sind oft schwer zu finden. Diese Fehler machen sich dadurch bemerkbar, dass der Code nicht die erwarteten Ergebnisse liefert.
Der VBA Debugger
Der Begriff »Debuggen« stammt aus dem Englischen. Mit Debuggen bezeichnet man das Entfernen von Fehlern (engl. Bugs) aus dem Code. Dies kann auf unterschiedliche Weise erreicht werden. Beispielsweise kann man den Code auf Tippfehler untersuchen.
Im Visual Basic Editor steht für das Debuggen die Symbolleiste „Debuggen“ zur Verfügung,

Falls die Symbolleiste „Debuggen“ nicht angezeigt werden sollte, kann man sie wie folgt anzeigen:
- In der Menüleiste des Visual Basic Editors auf „Ansicht“ klicken.
- In dem sich öffnenden Fenster mit der Maus auf „Symbolleiste“ zeigen.
- In dem sich öffnenden Fenster auf „Debuggen“ klicken, so dass das Häckchen vor Debuggen gesetzt wird.

Beispiel für einen Laufzeitfehler
Mit folgendem Code erhält man den Laufzeitfehler 9, falls das Tabellenblatt „xyz“ in der Arbeitsmappe nicht existieren sollte
Sub Laufzeitfehler_9()
Dim strWorksheetName As String
' Laufzeitfehler 9 - Index außerhalb des gültigen Bereichs
strWorksheetName = ThisWorkbook.Worksheets("xyz").Name
' Im Direktfenster ausgeben
Debug.Print strWorksheetName
End Sub
Fehlermeldung:

Klickt man nun auf den Butto „Debuggen“, wird die Code Zeile, die den Fehler verursacht hat gelb markiert. Bewegt man den Mauszeige auf den Variablennamen in der gelb markierten Zeile wird der aktuelle Wert der Variablen angezeigt

Debuggen im Einzelschritt
Hierzu setzt man der Cursor in die Prozedur.
- In der Menüzeile klickt man auf „Debuggen“.
- In dem sich öffnenden Pop-Up Menü klickt man auf „Einzelschritt“ oder man drückt die Funktionstaste F8. Man kann aber auch in der Symbolleiste „Debuggen“ auf „Einzelschritt klicken.
Damit wird die Prozedur gestartet, allerdings wird nur die erste Zeile abgearbeitet. Die abgearbeitete Zeile wird hervorgehoben. Ein wiederholtes Klicken auf Einzelschritt (oder drücken der [F8]-Taste), arbeitet jeweils die nächste Zeile ab. Fährt man mit der Maus über eine beliebige Variable, wird deren aktueller Wert angezeigt.
Möchte man den Einzelschrittmodus beenden, kann man den Code entweder mit Ausführen / Zurücksetzen abbrechen oder mit Ausführen / Sub-/Userform ausführen normal weiterlaufen lassen.

Einzelschrittmodus beenden
Möchte man den Einzelschrittmodus beenden, geht man wie folgt folgt
- In der Menüzeile auf „Ausführen“ klicken
- In dem sich öffnenden Pop-Up Fenster entweder auf „Sub/Userform ausführen“ klicken bzw. die Funktionstaste F5 drücken, um den Code normal weiterlaufen zu lassen (2a) oder auf „Zurücksetzen“ klicken um den Code abzubrechen (2b).

Haltepunkt setzen
Um die Ausführung des Codes nur an bestimmten Stellen anzuhalten, bietet der Visual Basic Editor die Möglichkeit, Haltepunkte
zu setzen. Es gibt verschiedene Möglichkeiten, Haltepunkt zu setzen oder zu entfernen:
- Einfügemarke in die gewünschte Codezeile setzen und die Funktionstaste (F9) drücken.
- Auf den Menübefehl „Haltepunkt Ein/Aus“ im Menü Debuggen klicken.
- Die linke Leiste des Codefensters auf Höhe der gewünschten Codezeile anklicken
Wie im Beispiel gezeigt werden Haltepunkte im Code rotbraun eingefärbt sowie durch einen Punkt im linken Bereich des Codefensters hervorgehoben. Es können mehrere Haltepunkte im Code gesetzt werden

Haltepunkt entfernen
Um einen Haltepunkt zu entfernen, führen man den zuvor ausgeführten Befehl erneut aus.
Debuggen im Prozedurschritt
Manchmal wird in einer Prozedur eine weitere Prozedur aufgerufen. Wenn in einer solchen Prozedur im Einzelschrittmodus nach einem Fehler gesucht wird, springt der Debugger in jede aufgerufene Prozedur hinein und führt deren Anweisungen im Einzelschrittmodus aus.
Mit dem „Debuggen im Prozedurschritt“ kann das Hineinspringen in eine aufgerufene Prozedur vermieden werden.
Beispiel:
Zunächst klickt man in die Prozedur „Sub test_Debuggen_im_Prozedurschritt“. Dann startet man den Debugger wie oben beschrieben im Einzelschrittmodus. Kommt man in die Zeile
„Call Debuggen_mit_Haltepunkten“
führt man stattdessen den Befehl „Prozedurschritt“ aus bzw. man drückt die Tastenkombination (Umschalt)+(F8).
Sub test_Debuggen_im_Prozedurschritt()
Debug.Print "Test"
Call Debuggen_mit_Haltepunkten
End Sub
'
Sub Debuggen_mit_Haltepunkten()
Dim intZeile As Integer, intSpalte As Integer
Dim arrMatrix(1 To 3, 1 To 3) As String
' Datenfeld befüllen
For intZeile = 1 To 3
For intSpalte = 1 To 3
arrMatrix(intZeile, intSpalte) = "(" & intZeile & ", " & intSpalte & ")"
Next intSpalte
Next intZeile
'
' Datenfeld im Direktfenster ausgeben
For intZeile = 1 To 3
Debug.Print arrMatrix(intZeile, 1), arrMatrix(intZeile, 2), arrMatrix(intZeile, 3)
Next intZeile
End Sub
Debuggen bis zur Cursor-Position
Mit dem Menübefehl Debuggen/“Ausführen bis Cursor-Position“ kann der Code bis zur aktuellen Cursor-Position ausgeführt werden. Das funktioniert jedoch nur, wenn vor der gewählten Cursor-Position keine Haltepunkte gesetzt sind.
Das Direktfenster nutzen
Das Direktfenster kann auf unterschiedliche Weise genutzt werden
- Man kann Anweisungen eingeben und ausführen.
- Der Inhalt von Variablen kann mit der Anweisung „?Variablenname“ abgefragt werden.
- Im Code kann mit der Anweisung „Debug.Print“ Information im Direktfenster ausgegeben werden.
Das Lokal-Fenster nutzen
Im Lokal-Fenster werden die in einer Prozedur verwendeten Variablen angezeigt, sobald die Prozedur ausgeführt wird. Das Lokal-Fenster kann mit dem Menübefehl Ansicht -> Lokal-Fenster angezeigt werden. Damit man sich den Inhalt des Lokal-Fensters ansehen kann, empfiehlt es sich, im Code mindestens einen Haltepunkt zu setzen.
Ein Beispiel ist in der folgenden Abbildung gezeigt. Im Beispiel wurde der Haltepunkt in der vorletzten Zeile mit der Anweisung
„Debug.Print „Ende des Codes“
gesetzt. Dann kann man sich im Lokalfenster unten rechts den Inhalt der Variablen ansehen.

Fehlerbehandlung mit der On Error-Anweisung
Die On Error-Anweisung dient zur Fehlerbehandlung in einem VBA Code. Unter Fehlerbehandlung versteht man das Vorhersehen, Erkennen und Beheben von VBA-Laufzeitfehlern. Der VBA-Fehlerbehandlungsprozess findet beim Schreiben von Code statt, bevor Fehler tatsächlich auftreten.
Fehlermeldungen unterdrücken
Die Anweisung
On Error Resume Next
unterdrückt die Anzeige von Fehlern. VBA wird angewiesen, so fortzufahren, als ob die Codezeile, die den Fehler enthält, nicht vorhanden wäre. On Error Resume Next behebt daher keinen Fehler.
Beispiel
Im Beispiel wird angenommen, dass die Excel Arbeitsmappe nur ein Tabellenblatt enthält. Das Auslesen des Tabellenblatts 4 hätte eine Fehlermeldung zur Folge. Diese Fehlermeldung wird mit der Anweisung „On Error Resume Next“ unterdrückt.
Sub Fehler_uebergehen()
Dim strWert As String
' Fehler übergehen
On Error Resume Next
' In der vierten Tabelle "Das ist ein Test" in die Zelle A1 schreiben
Worksheets(4).Cells(1, 1).Value = "Das ist ein Test"
' In der ersten Tabelle "Hallo" in die Zelle B1 schreiben
Worksheets(1).Cells(1, 2).Value = "Hallo"
End Sub
Fehlerunterdrückung zurücksetzen
Mit der Anweisung „On Error GoTo 0“ kann die VBA-Fehlerbehandlung wieder eingezuschaltet werden.
Beispiel:
Sub Fehler_uebergehen_und_Fehlerbehandlung_wieder_einschalten()
Dim strWert As String
' Fehler übergehen
On Error Resume Next
' In der vierten Tabelle "Das ist ein Test" in die Zelle A1 schreiben
Worksheets(4).Cells(1, 1).Value = "Das ist ein Test"
' Fehlerbehandlung wieder einschalten
On Error GoTo 0
' In der ersten Tabelle "Hallo" in die Zelle B1 schreiben
Worksheets(1).Cells(1, 2).Value = "Hallo"
End Sub
Fehler über Sprungmarken abfangen
Fehler können auch mit der Anweisung
On Error GoTo Sprungmarke
abgefangen werden. Im Fehlerfall springt der Code zu den Anweisungen nach der Sprungmarke.
Beispiel:
Im Beispiel wird angenommen, dass die Arbeitsmappe nur ein Tabellenblatt enthält. Versucht man nun Daten in das nicht vorhandene Tabellenblatt 4 zu schreiben verursacht das den Laufzeitfehler 9 – „Index außerhalb des gültigen Bereichs“. Der Code springt nun zur Sprungmarke „Fehler“ und gibt eine Meldung im Direktfenster aus
Sub FehlerSprungmarke()
' Im Fall eines Fehlers zur Sprungmarke springen
On Error GoTo Fehler
' Wert schreiben
Worksheets(4).Cells(1, 1).Value = "Das ist ein Test"
' Sprungmarke
Fehler:
' Fehlermeldung im Direktfenster ausgeben
Debug.Print "Ein Fehler ist aufgetreten"
End Sub
Informationen zum Fehler mit dem Err-Objekt ausgeben
Informationen zu dem zuletzt aufgetretenen Laufzeitfehler z. B. Fehlernummer und eine Fehlerbeschreibung werden in dem VBA Err-Objekt gespeichert und können vom Code ausgegeben werden.
Beispiel:
Im Beispiel wird angenommen, dass die Arbeitsmappe nur ein Tabellenblatt enthält. Versucht man nun Daten in das nicht vorhandene Tabellenblatt 4 zu schreiben verursacht das den Laufzeitfehler 9 – „Index außerhalb des gültigen Bereichs“. Der Code springt nun zur Sprungmarke „Fehler“ und gibt Informationen (Fehlernummer und Fehlerbeschreibung) zu diesem Fehlder im Direktfenster aus.
Sub FehlerSprungmarke2()
' Im Fall eines Fehlers zur Sprungmarke springen
On Error GoTo Fehler
' Wert schreiben
Worksheets(4).Cells(1, 1).Value = "Das ist ein Test"
' Sprungmarke
Fehler:
' Informationen zum Fehler im Direktfenster ausgeben
Debug.Print Err.Number & " - " & Err.Description
End Sub