Lektionen/Grundlagen

Debuggen im VBA-Editor

Einsteiger8 Min. Lesezeit

Code, der nicht das tut, was du willst, ist normal. Die Frage ist nur, wie schnell du herausfindest, warum. Der VBA-Editor bringt dafür alles mit, was du brauchst: Du kannst den Ablauf anhalten, Zeile für Zeile mitlaufen und in jede Variable hineinschauen. Diese Lektion zeigt dir die Werkzeuge und eine Strategie, mit der du gezielt vorgehst.

Haltepunkte setzen (F9)

Ein Haltepunkt (Breakpoint) sagt VBA: „Halte hier an, bevor du diese Zeile ausführst." Klick in den grauen Randstreifen links neben eine Zeile oder setz den Cursor hinein und drück F9. Die Zeile wird dunkelrot markiert. Startest du die Prozedur, stoppt sie genau dort und geht in den Unterbrechungsmodus.

Mit F9 schaltest du einen Haltepunkt wieder aus. Strg + Umschalt + F9 löscht alle Haltepunkte auf einmal.

Zeile für Zeile: F8 und Shift+F8

Bist du im Unterbrechungsmodus, steuerst du den Ablauf schrittweise:

TasteAktionBedeutung
F8EinzelschrittFührt die nächste Zeile aus, springt in Aufrufe hinein.
Umschalt+F8ProzedurschrittFührt einen Prozeduraufruf komplett aus, ohne hineinzuspringen.
Strg+Umschalt+F8Prozedurschritt zurückLäuft bis zum Ende der aktuellen Prozedur und hält beim Aufrufer.

Der gelbe Pfeil im Randstreifen zeigt dir, welche Zeile als Nächstes dran ist — sie ist noch nicht ausgeführt. Mit Umschalt+F8 überspringst du fremde Prozeduren, deren Inneres dich gerade nicht interessiert.

Das Direktfenster (Strg+G)

Das Direktfenster (Immediate Window) öffnest du mit Strg + G. Es ist dein Fragefenster im Unterbrechungsmodus: Ein ? gibt einen Wert aus, und du kannst sogar Anweisungen ausführen, während der Code pausiert.

? rs!Nachname
? UCase(strName)
? Forms!frmKunde!txtOrt.Value

' Du kannst auch zuweisen und dann weiterlaufen lassen:
strName = "Testkunde"

Aus dem laufenden Code schreibst du mit Debug.Print Werte dorthin — ideal, um einen Ablauf mitzuprotokollieren, ohne ihn mit MsgBox zu unterbrechen:

Public Sub PreiseRechnen()
    Dim i As Long, summe As Currency
    For i = 1 To 5
        summe = summe + i * 10
        Debug.Print "i=" & i, "Summe=" & summe
    Next i
End Sub

Lokal-Fenster: alle Variablen auf einen Blick

Das Lokal-Fenster (Menü Ansicht → Lokal-Fenster) zeigt automatisch alle Variablen der aktuellen Prozedur mit ihrem momentanen Wert und Typ. Objekte wie ein DAO.Recordset lassen sich aufklappen, sodass du auch deren Eigenschaften und Felder siehst. Du musst nichts eintippen — das Fenster aktualisiert sich bei jedem Schritt.

Überwachungsausdrücke (Watch)

Willst du einen bestimmten Ausdruck über mehrere Prozeduren hinweg im Auge behalten, legst du eine Überwachung an: markiere den Ausdruck, Rechtsklick → Überwachung hinzufügen. Das Überwachungsfenster zeigt seinen Wert laufend an.

Besonders nützlich ist die Option „Unterbrechen, wenn Wert wahr" oder „Unterbrechen, wenn Wert sich ändert": VBA hält dann von selbst an, sobald z. B. summe > 1000 wird — auch ohne festen Haltepunkt.

Debug.Assert: Annahmen absichern

Debug.Assert hält den Code an, wenn eine Bedingung nicht erfüllt ist. So prüfst du Annahmen, die immer stimmen sollten:

Public Function Rabatt(ByVal betrag As Currency) As Currency
    Debug.Assert betrag >= 0      ' hält an, falls betrag negativ ist
    Rabatt = betrag * 0.1
End Function

Läuft betrag doch einmal negativ hinein, stoppt VBA genau hier — beim Testen. In der kompilierten Anwendung wird Debug.Assert ignoriert, es kostet also keine Leistung im Produktivbetrieb.

Stop und die Aufrufliste

Die Anweisung Stop ist ein Haltepunkt, den du direkt in den Code schreibst. Er bleibt auch erhalten, wenn du die Datei schließt und wieder öffnest — anders als ein per F9 gesetzter Haltepunkt.

If kundenNr = 0 Then Stop   ' hier anhalten und nachschauen

Im Unterbrechungsmodus zeigt dir die Aufrufliste (Menü Ansicht → Aufrufliste oder Strg + L), welche Prozedur welche aufgerufen hat. So findest du heraus, wie der Code überhaupt an die aktuelle Stelle gekommen ist.

Hinweis: Vergiss nicht, Stop-Anweisungen und Debug.Print-Zeilen vor der Auslieferung zu entfernen. Stop in einer fertigen Datenbank friert die Anwendung für den Anwender ein.

Eine typische Debugging-Strategie

Wenn etwas nicht funktioniert, geh systematisch vor statt wild zu ändern:

  1. Eingrenzen: Setz einen Haltepunkt kurz vor die verdächtige Stelle.
  2. Beobachten: Öffne das Lokal-Fenster und schau, welche Werte die Variablen tatsächlich haben — oft ist ein Feld Null oder ein String leer.
  3. Schritte gehen: Mit F8 durchlaufen und bei jeder Zeile prüfen, ob der Wert noch stimmt. Sobald er kippt, hast du die Ursache gefunden.
  4. Fragen stellen: Im Direktfenster mit ? Ausdrücke testen, ohne Code zu ändern.
  5. Fixen und wiederholen: Korrigieren, Haltepunkte entfernen, erneut laufen lassen.

Zusammengefasst

  • F9 setzt Haltepunkte, F8 geht in Einzelschritten, Umschalt+F8 überspringt Prozeduraufrufe.
  • Das Direktfenster (Strg+G) beantwortet Fragen mit ?; Debug.Print protokolliert ohne zu unterbrechen.
  • Lokal-Fenster und Überwachungen zeigen Variablenwerte laufend an.
  • Debug.Assert und Stop sichern Annahmen ab und halten gezielt an.
  • Debugge systematisch: eingrenzen, beobachten, Schritte gehen — nicht raten.
Nächste Lektion
Strings verarbeiten