Fehlersuche in VBA

Zeilenweise

Wenn eine VBA-Routine nicht so läuft wie gewünscht oder unerwünschte bzw. fehlerhafte Ergebnisse herauskommen, dann hilft es so gut wie immer, den Inhalt, den Wert einer Variablen zu kontrollieren.

Die eine Möglichkeit ist, den Code im Einzelschritt-Modus durchlaufen zu lassen. Dazu rufen Sie die Routine entweder über AltF8 und der Schaltfläche Schritt auf:

Einzelschritt-Aufruf über Alt-F8

Einzelschritt-Aufruf über Alt-F8

In diesem Fall wird der VBA-Editor geöffnet und die erste Zeile der Prozedur wird gelb hinterlegt dargestellt:

Die erste Zeile im Code ist automatisch markiert

Die erste Zeile im Code ist automatisch markiert

Oder aber Sie befinden sich im VBA-Editor und der Schreibcursor steht irgendwo in dem zu prüfenden Modul. Dann haben Sie eine ähnliche Ausgangssituation. In beiden Fällen geht es nun darum, den Code zeilenweise abzuarbeiten. Drei Möglichkeiten stelle ich Ihnen hier nun vor, nehmen Sie jene, die Ihnen am meisten zusagt:

Entweder Sie klicken auf die entsprechende Schaltfläche, um beim ersten Schritt zur ersten Zeile des Moduls zu gelangen oder danach in die jeweils nächste Zeile.

Die Schaltfläche für den Einzelschritt-Modus

Die Schaltfläche für den Einzelschritt-Modus

Für diese und auch alle anderen Möglichkeiten gilt, dass Dim-Anweisungen und reine Kommentarzeilen immer übersprungen werden. Die zweite Möglichkeit:

Einzelschritt-Modus über das Menü

Einzelschritt-Modus über das Menü

Und die dritte (von mir fast immer eingesetzte) ist schon direkt hierüber in der Abbildung zu sehen: Die Taste F8 bringt den gewünschten Erfolg. Im folgenden Text werde ich darum auch immer F8 verwenden, Sie können selbstverständlich die von Ihnen favorisierte Methode einsetzen.

Wenn Sie direkt im Editor starten, dann werden Sie als erstes F8 drücken, um zur ersten Zeile des Codes zu gelangen. Danach natürlich immer wieder F8, um Zeile für Zeile durchzuarbeiten. Wenn Sie nun den Wert einer bestimmten Variablen überprüfen wollen, dann beachten Sie bitte, dass die entsprechende Zeile erst abgearbeitet worden sein muss, damit die Variable den (neuen) Wert erhalten hat. Also, so lange eine Zeile gelb hervorgehoben ist, ist sie noch nicht ausgeführt worden.

In der folgenden Abbildung sehen Sie, wie Sie rasch den Wert einer Variablen kontrollieren können und dass der Variablen Wert1 zu diesem Zeitpunkt noch kein Wert zugewiesen worden ist. Um das zu erreichen, zeigen Sie einfach nur auf die zu prüfende Variable. Sie sehen vielleicht, dass der Schreibcursor in der markierten Zeile ganz links in der ersten Spalte steht, der Mauszeiger aber knapp rechts des Variablennamens. Für eine kurze Zeit ist dann ein kleines Hinweisfenster mit dem Variablennamen und dem entsprechenden Wert zu sehen:

Variablen-Werte direkt durch zeigen erkennen

Variablen-Werte direkt durch zeigen erkennen

Das geht übrigens nicht nur in markierten Zeilen, das funktioniert im gesamten Modul. Wenn Sie jetzt nämlich per F8 in die nächste Zeile gelangen und noch einmal auf die gleiche Stelle wie hierüber zeigen, werden Sie sofort erkennen, dass der Wert nun 5 ist.

Nun liegt es ja in der Natur der Sache, dass einer Variablen im Laufe des Programms verschiedene Werte zugewiesen werden. Wenn Sie über längere Zeit den Wert kontrollieren möchten, dann bietet sich das Überwachungsfenster an. Über das Menü Ansicht können Sie es ein- und beispielsweise per Rechtsklick im Fenster auch wieder ausblenden:

Das Pulldown-Menü des Überwachungsfensters

Das Pulldown-Menü des Überwachungsfensters

Markieren Sie einfach den Variablennamen oder auch eine komplette Funktion und ziehen Sie die Markierung in das Überwachungsfenster. Ab jetzt können Sie jederzeit den Wert dieser Variablen oder des Ausdrucks in dem Fenster erkennen:

Anzeige der Variablenwerte im Überwachungsfenster

Anzeige der Variablenwerte im Überwachungsfenster

Beim Menüpunkt Debuggen finden Sie weitere hilfreiche Möglichkeiten zu diesem Punkt.

▲ nach oben …

Bei dieser ausgesprochen kurzen Routine ist es ja kein Thema, die wenigen Zeilen einzeln zu checken oder die Übersicht im Überwachungsfenster zu behalten und Zeile für Zeile durchzusteppen. Bei 50 oder mehr Zeilen wird das einfach nur nervig. Da bietet sich die Möglichkeit, an (fast) beliebiger Stelle einen Haltepunkt einzubauen.

Die dauerhafteste Lösung: Schreiben Sie an gewünschter Position einfach eine neue Zeile Code mit der Anweisung Stop. Dann können Sie das Programm normal ablaufen lassen und der Ablauf wird in der Zeile angehalten. Ab hier kann es dann per F8 weiter gehen.

Wenn alles zu Ihrer Zufriedenheit läuft, werden Sie die Zeile entfernen. Und natürlich kann diese Anweisung auch mehrfach im Code vorkommen. Wollen Sie jedoch nur für kurze Zeiträume und auch einen einfach wieder zu entfernenden Haltepunkt schaffen, dann bietet sich noch folgende Methode an: Klicken Sie in jener Zeile, die dann nicht mehr abgearbeitet werden soll, in gleicher Höhe auf den linken, grauen Rand des Code-Fensters. Danach wird sich dort ein brauner Punkt zeigen und die Code-Zeile wird ebenfalls braun markiert:

Per Klick gesetzter Haltepunkt, Zeile ist braun markiert

Per Klick gesetzter Haltepunkt, Zeile ist braun markiert

Ein erneuter Klick auf den Punkt wird die Funktionalität wieder aufheben. Gleiches (und noch mehr) erreichen Sie übrigens auch über das Menü Debuggen, allerdings muss der Schreibcursor dann in der betroffenen Zeile stehen.

▲ nach oben …

Direktfenster

Eine weitere auch von mir lange unterschätzte Möglichkeit der Fehlerkontrolle bietet die Ausgabe von Werten im Direktfenster. Dort können Sie beispielsweise die Chronologie einer Variablen sehr gut nachverfolgen:

Ausgabe-Chronologie der  Variablenwerte im Direktfenster

Ausgabe-Chronologie der Variablenwerte im Direktfenster

Sie öffnen das Fenster am einfachsten mit StrgG. Sie fügen in den Code die entsprechende Befehlszeile ein (siehe Abbildung oben) und exakt der aktuelle Wert wird dann ausgegeben. Manchmal kann das auch der Rettungsfallschirm sein, wenn Sie beispielsweise mit der Anweisung Application.DisplayAlerts = False die Anzeige von Hinweisen und Fehlermeldungen ausgeschaltet haben und wegen eines Fehlers im Code diese nicht wieder eingeschaltet werden konnte. Das kann dann fatale Folgen haben. In einem solchen Fall geben Sie direkt im Fenster des Direktbereichs die Code-Zeile Application.DisplayAlerts = True ein und alles ist in Bezug auf die Hinweise und Meldungsfenster wieder gut.

▲ nach oben …

Dieser Beitrag wurde unter Coding / Programmieren, Mit VBA/Makro, Tipps und Tricks abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.