🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Breakpoint in Excel — ein Makro einfrieren und Zeile für Zeile durchsteppen

|

VBA Breakpoint in Excel — ein Makro einfrieren und Zeile für Zeile durchsteppen

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 Stop niemals ausgeliefert werden darf
  • Wie Debug.Assert Ihnen einen Breakpoint gibt, der in Produktion sicher ist
  • Wann Sie steppen und wann Sie stattdessen Debug.Print streuen 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