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:
| Taste | Aktion | Bedeutung |
|---|---|---|
F8 | Einzelschritt | Führt die nächste Zeile aus, springt in Aufrufe hinein. |
Umschalt+F8 | Prozedurschritt | Führt einen Prozeduraufruf komplett aus, ohne hineinzuspringen. |
Strg+Umschalt+F8 | Prozedurschritt zurück | Lä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 undDebug.Print-Zeilen vor der Auslieferung zu entfernen.Stopin 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:
- Eingrenzen: Setz einen Haltepunkt kurz vor die verdächtige Stelle.
- Beobachten: Öffne das Lokal-Fenster und schau, welche Werte die Variablen
tatsächlich haben — oft ist ein Feld
Nulloder ein String leer. - Schritte gehen: Mit
F8durchlaufen und bei jeder Zeile prüfen, ob der Wert noch stimmt. Sobald er kippt, hast du die Ursache gefunden. - Fragen stellen: Im Direktfenster mit
?Ausdrücke testen, ohne Code zu ändern. - Fixen und wiederholen: Korrigieren, Haltepunkte entfernen, erneut laufen lassen.
Zusammengefasst
F9setzt Haltepunkte,F8geht in Einzelschritten,Umschalt+F8überspringt Prozeduraufrufe.- Das Direktfenster (
Strg+G) beantwortet Fragen mit?;Debug.Printprotokolliert ohne zu unterbrechen. - Lokal-Fenster und Überwachungen zeigen Variablenwerte laufend an.
Debug.AssertundStopsichern Annahmen ab und halten gezielt an.- Debugge systematisch: eingrenzen, beobachten, Schritte gehen — nicht raten.