TL;DR — Ein Breakpoint hält Ihr Makro auf einer Zeile an, bevor sie läuft, und versetzt Sie in den break mode. Dort können Sie jeden lebendigen Wert lesen — fahren Sie mit der Maus über eine Variable für einen data tip oder fragen Sie das Immediate Window — und dann gehen Sie den Code Zeile für Zeile durch. F9 setzt oder löscht einen Breakpoint, F5 läuft bis dorthin, F8 steppt zur nächsten Zeile, Shift+F8 überspringt eine aufgerufene Prozedur. So finden Sie, welche Zeile schiefgeht, nicht nur, welche Werte es waren. Zwei Dinge, die Sie wissen müssen: Breakpoints werden nicht mit der Datei gespeichert, und eine
Stop-Anweisung in ausgeliefertem Code friert das Excel eines Nutzers ein.
Sub Investigate()
Dim total As Double, r As Long
For r = 2 To 100
total = total + Cells(r, 3).Value ' F9 hier setzt einen breakpoint (roter Punkt)
Next r ' F8 steppt; auf total zeigen, um ihn wachsen zu sehen
Debug.Assert total > 0 ' bricht NUR im Editor ab, wenn dies False ist
End Sub
Was Sie lernen
- Das mentale Modell — ein Breakpoint friert die Zeit ein, damit Sie den Code durchgehen können
- Die drei Beobachter steigender Stärke, und warum dies der schwere ist
- Breakpoints mit F9 setzen und mit F8 gegenüber Shift+F8 steppen
- Warum Breakpoints verschwinden und warum
Stopniemals ausgeliefert werden darf - Wie
Debug.AssertIhnen einen Breakpoint gibt, der in Produktion sicher ist - Wann Sie steppen und wann Sie stattdessen
Debug.Printstreuen sollten
Das mentale Modell: die Zeit einfrieren, dann den Code durchgehen
Ein Breakpoint stoppt die Ausführung auf einer gewählten Zeile, bevor diese Zeile läuft, und übergibt Ihnen das Makro mitten im Flug eingefroren. Jede Variable hält ihren lebendigen Wert, der Aufrufstapel ist intakt, und Excel ist genau dort angehalten, wo Ihre Logik steht. Von hier aus steppen Sie: F8 führt die aktuelle Zeile aus und stoppt auf der nächsten, also gehen Sie das Programm mit menschlichem Tempo vorwärts und sehen jede Anweisung wirken.
Das ist der Unterschied, auf den es ankommt. Debug.Print sagt Ihnen, welche
Werte es nach dem Lauf gab; ein Breakpoint lässt Sie finden, ab welcher Zeile das Verhalten zuerst von dem
abweicht, was Sie erwartet haben. Wenn die Werte falsch sind, Sie aber nicht sagen können, wo sie schiefgingen,
brauchen Sie nicht mehr Protokoll — Sie müssen das Makro einfrieren und zusehen, wie es geschieht.
Die drei Beobachter, in steigender Stärke
Ein Breakpoint ist die oberste Sprosse einer Leiter. Wenn ein Makro sich danebenbenimmt, beantwortet jedes Werkzeug eine andere Frage, und dies ist das eine, das die Zeit anhält:
| Beobachter | Die Frage, die er beantwortet | Seine charakteristische Lüge |
|---|---|---|
Debug.Print |
Welche Werte gab es während des Laufs? | Druckt in ein standardmäßig geschlossenes Fenster |
| Immediate Window | Was ist gerade jetzt wahr, in dieser Pause? | Eine ?-Abfrage führt den Code tatsächlich aus |
| Breakpoint + F8 | Auf welcher Zeile geht es schief? | Sie verschwinden, wenn Sie die Arbeitsmappe schließen |
Debug.Print zeigt die Vergangenheit; das Immediate Window befragt die
Gegenwart; ein Breakpoint erschafft die Gegenwart, indem er das Makro einfriert, damit Sie inspizieren und
steppen können. Es ist das mächtigste der drei und das langsamste im Gebrauch — 10.000 Schleifeniterationen von
Hand zu steppen ist niemandes Vorstellung von einem schönen Nachmittag —, also greifen Sie genau dann danach,
wenn die billigeren Beobachter „welche Zeile?" nicht beantworten können.
Breakpoints setzen, und F8 gegenüber Shift+F8
Klicken Sie in den grauen Rand links neben einer Zeile, oder setzen Sie den Cursor auf die Zeile und drücken Sie F9 — ein roter Punkt markiert sie, und der nächste Lauf hält dort an. Einmal angehalten, erledigen vier Tasten das Gehen:
- F8 (Step Into) — führe diese Zeile aus; ruft sie einen Sub oder eine Function auf, steige hinein und fahre Zeile für Zeile darin fort.
- Shift+F8 (Step Over) — führe eine aufgerufene Prozedur vollständig aus und stoppe auf der nächsten Zeile hier.
- Ctrl+Shift+F8 (Step Out) — beende die aktuelle Prozedur und stoppe dort, von wo sie aufgerufen wurde.
- F5 (Run) — höre auf zu steppen und laufe bis zum nächsten Breakpoint oder zum Ende.
Der größte Zeitfresser ist, mit F8 geradewegs in eine 500-Zeilen-Hilfsroutine zu steigen, der Sie längst vertrauen — eine Formatierungsroutine, ein Bibliotheksaufruf — und sie ganz durchzusteppen. Haben Sie den Bug nicht geschrieben, steppen Sie mit Shift+F8 darüber hinweg. F8 ist für den Code, den Sie verdächtigen; Shift+F8 für den, den Sie nicht verdächtigen.
Falle 1: Breakpoints werden nicht gespeichert — und Stop ist die Falle, die es doch tut
Schließen Sie die Arbeitsmappe, und jeder Breakpoint ist fort. Sie leben in der Editor-Sitzung, nicht in der Datei, also reisen sie nie mit Ihrem Makro und lösen nie für jemand anderen aus. Das ist meist genau das, was Sie wollen.
Der verlockende Ausweg ist die Stop-Anweisung — ein dauerhafter Breakpoint, in den Code geschrieben:
Sub Risky()
Stop ' haelt bei JEDEM Lauf hier an - auch auf dem Rechner eines Nutzers
' ... Ihre eigentliche Arbeit ...
End Sub
Stop ist beim Entwickeln wirklich nützlich, weil es einen Neustart übersteht. Aber erreicht es die Produktion,
führt ein Nutzer das Makro aus, trifft auf Stop, und Excel wirkt eingefroren an einer Unterbrechung, die
er nicht verstehen und ohne den VBA-Editor nicht aufheben kann. Behandeln Sie Stop als reine
Entwicklungsmarkierung, die Sie vor der Auslieferung löschen müssen — nie als Fehlerbehandlung und nie in Code,
der Ihren Rechner verlässt.
Falle 2: Debug.Assert ist der Breakpoint, der sicher auszuliefern ist
Wenn Sie einen Breakpoint wollen, der eine Bedingung prüft und in Produktion harmlos ist, nutzen Sie
Debug.Assert:
Debug.Assert cnt = expected ' bricht im Editor ab, wenn die Zahlen nicht uebereinstimmen
Debug.Assert Not rng Is Nothing ' ein bedingter breakpoint, der zur Laufzeit ignoriert wird
Debug.Assert condition unterbricht die Ausführung nur, wenn die Bedingung False ist, und nur
innerhalb des VBA-Editors — zur Laufzeit, außerhalb der IDE, wird die Zeile vollständig ignoriert. Das macht es
zum richtigen Weg, eine Invariante zu kodieren, von der Sie glauben, dass sie immer gelten sollte („die Anzahl
danach gleicht der Anzahl davor", „dieses Objekt ist nicht Nothing"): während der Entwicklung stoppt es Sie in
dem Augenblick, in dem die Annahme bricht, und in der Kopie eines Nutzers kostet es nichts und friert niemanden
ein. Es ist ein bedingter Breakpoint, der sich selbst dokumentiert.
Falle 3: Bearbeiten im angehaltenen Zustand wirft Ihren Zustand weg
Im break mode können Sie Code bearbeiten — und VBA wird den Lauf oft zurücksetzen, um die Änderung anzuwenden, wischt jede lebendige Variable auf leer zurück und beginnt von vorn. Das ist der übliche Grund, warum jemand meldet, seine Variablen seien mitten im Steppen „verschwunden": eine kleine Änderung hat das Makro still neu gestartet. Stecken Sie tief in einem angehaltenen Lauf, widerstehen Sie dem Drang, den gerade entdeckten Tippfehler zu beheben, bis Sie den Zustand gelesen haben, für den Sie angehalten haben. Verwandtes Kraftwerkzeug: Set Next Statement (Ctrl+F9) lässt Sie den gelben Pfeil ziehen, um eine Zeile erneut auszuführen oder zu überspringen — unbezahlbar zum Wiederholen eines Schritts, aber überspringen Sie eine Initialisierung, und der Zustand, den Sie dann inspizieren, ist eine Lüge.
Breakpoint vs Debug.Print
Sie sind keine Rivalen; sie sind verschiedene Phasen derselben Jagd:
| Breakpoint + F8 | Debug.Print |
|
|---|---|---|
| Beantwortet | Welche Zeile schiefgeht | Welche Werte es waren |
| Große Schleifen | Mühsam — Sie steppen jeden Durchgang | Ideal — Tausende Zeilen strömen vorbei |
| Interaktiv | Ja — lebendigen Zustand inspizieren und ändern | Nein — es gibt nur aus |
| Kosten | Stoppt das Makro | Läuft mit voller Geschwindigkeit |
Nutzen Sie Debug.Print, um eine Schleife über 10.000 Zeilen auf die Region einzugrenzen, in der die Zahlen
brechen; setzen Sie dann dort einen Breakpoint — oder ein
Add Watch mit einer Abbruchbedingung, das nur anhält, wenn ein Wert zum ersten
Mal negativ wird —, damit Sie an der einen Iteration einfrieren, auf die es ankommt, statt durch alle
hindurchzusteppen. Protokollieren findet die Nachbarschaft; ein Breakpoint findet die Zeile.
Die Meinung: das schwere Werkzeug, bewusst eingesetzt
Ein Breakpoint ist der stärkste Debugger, den VBA Ihnen gibt, und der langsamste zu führen, also setzen Sie ihn
dort ein, wo die billigeren Werkzeuge versagen: wenn die Werte falsch sind und Sie wirklich nicht sagen können,
welche Anweisung dafür verantwortlich ist. Für alles, was Sie aus Werten beantworten können — ist diese
Variable, was ich erwarte, läuft diese Schleife die richtige Anzahl von Malen —, ist ein Debug.Print oder eine
Abfrage im Immediate Window schneller und hält die Welt nicht an.
Zwei Disziplinen trennen Menschen, die schnell debuggen, von denen, die mit dem Editor kämpfen. Liefern Sie nie
ein Stop aus; kodieren Sie Ihre stets wahren Annahmen stattdessen als Debug.Assert, damit sie Sie in der
Entwicklung schützen und in der Produktion verschwinden. Und steppen Sie nie mit F8 durch Code, den Sie nicht
geschrieben haben — steppen Sie darüber hinweg. Das Ziel ist nicht, jede Zeile zu sehen; es ist, die eine Zeile
zu erreichen, die Sie belügt.
Wenn die ganze Aufgabe darin besteht, die kaputte Zeile zu finden — beschreiben Sie sie stattdessen
Steppen ist hervorragend für einen kaputten Lauf und elend für „welche von 8.000 Zeilen bricht die Summe". Bis Sie einen Breakpoint gesetzt, eine Überwachung hinzugefügt und gesteppt haben, bis ein Wert schiefgeht, haben Sie von Hand nachgespielt, was eine Abfrage in einem Durchgang beantwortet. ExcelMaster lässt Sie die Frage in normaler Sprache stellen — „finde die erste Zeile, in der die laufende Summe nicht mehr zu Spalte E passt, und zeig mir die Zeilen darum herum" — und schreibt Python, das das Blatt liest, zuerst Ihre Datei sichert, jede Zeile prüft und den genauen Übeltäter zurückgibt. Nutzen Sie einen Breakpoint, um einen Fehlschlag zu verstehen; beschreiben Sie die Regel, wenn die Aufgabe ist, zu finden, welcher Fall fehlschlägt.
Häufig gestellte Fragen
Wie setze ich in VBA einen Breakpoint?
Klicken Sie in den grauen Rand links neben einer Zeile, oder setzen Sie den Cursor auf die Zeile und drücken Sie F9. Ein roter Punkt markiert die Zeile, und beim nächsten Makrolauf hält es genau vor dieser Zeile an und versetzt Sie in den break mode. Drücken Sie F9 erneut auf der Zeile, um den Breakpoint zu entfernen.
Warum verschwinden meine Breakpoints ständig?
Weil Breakpoints nicht mit der Arbeitsmappe gespeichert werden — das Schließen der Datei löscht sie alle.
Brauchen Sie eine Pause, die im Code lebt, nutzen Sie die Stop-Anweisung, aber entfernen Sie sie, bevor Sie
das Makro teilen, denn ein Stop friert Excel für jeden ein, der es ausführt.
Was ist der Unterschied zwischen F8 und Shift+F8?
F8 (Step Into) führt eine Zeile aus und steigt in jeden Sub oder jede Function, die sie aufruft, sodass Sie auch durch den aufgerufenen Code gehen. Shift+F8 (Step Over) führt eine aufgerufene Prozedur vollständig aus und stoppt auf der nächsten Zeile der aktuellen. Nutzen Sie Step Over für Hilfsroutinen, denen Sie bereits vertrauen.
Wie sehe ich den Wert einer Variablen, während ein Makro angehalten ist?
Fahren Sie mit dem Mauszeiger über den Variablennamen für einen data tip, tippen Sie ? varName im
Immediate Window oder fügen Sie die Variable dem Watch Window hinzu. Das
funktioniert nur, während das Makro im break mode angehalten ist, denn lokale Variablen existieren nur während
des Laufs.
Was macht Debug.Assert in VBA?
Debug.Assert condition unterbricht die Ausführung im VBA-Editor nur dann, wenn die Bedingung False ist, und
wird vollständig ignoriert, wenn der Code außerhalb des Editors läuft. Es ist ein sicherer Weg, eine Invariante
während der Entwicklung zu prüfen — die Anzahlen stimmen überein, ein Objekt ist nicht Nothing —, ohne ein
Stop zu hinterlassen, das das Excel eines Nutzers einfrieren könnte.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 05.09.2026.
Verwandte Anleitungen: VBA Debug.Print · VBA Immediate Window · VBA Fehlerbehandlung · VBA On Error · VBA For-Schleife
