Wann immer ein Fehler auftritt, dessen Ursache nicht bekannt ist, oder eine Anwendung unerwartete Ergebnisse liefert, ist es Zeit fürs Debugging (zu deutsch: austesten, entwanzen, Fehler suchen und beseitigen). Unter Access spielt sich dies zum größten Teil in der VBA-Entwicklungsumgebung ab. Wir erläutern, wie Debugging funktioniert, welche Werkzeuge die gute alte VBA-IDE liefert und welche Tricks Sie einsetzen können.
Den VBA-Editor kann man in seiner jetzigen Form fast schon als altehrwürdig einstufen. An ihm perlt mühelos ab, was die Benutzer anderer, modernerer Entwicklungsumgebungen auf Trab hält: nämlich ständige Innovationen.
Mit dem Wechsel zu Access 2007 gab es genau eine änderung, die den meisten Entwicklern noch nicht einmal aufgefallen sein dürfte: Für den Einsatz des Mausrades zum Scrollen durch die Zeilen eines Moduls braucht man nun kein separates Tool mehr. Falls Sie Access 2007 verwenden und dieses Tool trotzdem installiert haben: Sie können es von der Festplatte werfen.
Davon abgesehen ist auf den VBA-Editor schon Verlass: Er bildet zusammen mit Access ein eingespieltes Team und fällt eher durch Beständigkeit denn durch stetige Weiterentwicklung auf.
Das ist aber kein Grund, ihn nicht einmal genauer unter die Lupe zu nehmen und zu zeigen, wie Sie Fehlern und Fehlverhalten mit seiner Hilfe auf die Schliche kommen. Immerhin bietet der VBA-Editor einige Möglichkeiten zum Debuggen des enthaltenen Codes.
Gründe für das Debugging
Eigentlich ist es ja so: Sie programmieren etwas, probieren es aus und entweder es funktioniert oder nicht. Falls nicht, möchten Sie natürlich gern herausfinden, woran dies liegt. Im besten Fall tritt einfach irgendwo ein Fehler auf und der VBA-Editor stößt Sie mit der Nase darauf, indem er eine entsprechende Meldung ausgibt und die fehlerhafte Zeile gelb hervorhebt.
Mit etwas Glück lässt sich die Herkunft des Fehlers in unmittelbarer Umgebung entdecken; falls nicht, ist eine umfangreichere Analyse angezeigt. Wir sprechen hier nicht von Kompilier- oder Syntaxfehlern, sondern von Laufzeitfehlern, die oft bei der Verarbeitung falscher oder inkompatibler Daten auftreten. Noch unangenehmer sind Fehler, die nicht in einer Fehlermeldung resultieren, sondern schlicht falsche oder unerwartete Antworten der Anwendung erzeugen.
Arten von Debugging
Dieser Beitrag unterscheidet zwei Arten von Debugging: Die erste enthält alle Aktivitäten, die mit der änderung von Code zum Zwecke des Debuggings einhergehen, die zweite beschäftigt sich mit dem „berührungslosen" Debugging: Hier wird der eigentliche Code nicht angefasst, sondern durch das Setzen von Haltepunkten und externes Abfragen von Informationen etwa über das Direktfenster oder das Überwachungsfenster analysiert.
Bevor wir diese beiden Arten vorstellen, schauen wir uns kurz die Grundzüge an, das manuelle Debuggen von Code ohne weitere Hilfsmittel.
Code manuell durchlaufen
Um Code manuell zu durchlaufen, positioniert man einfach die Einfügemarke auf der Prozedur, die man durchlaufen möchte, und wählt entweder den Menüpunkt Debuggen|Einzelschritt aus oder drückt gleich auf die Taste F8.
Es erscheinen dann wie in Bild 1 ein gelber Pfeil und eine gelbe Markierung der aktuellen Zeile. Das Debuggen kann beginnen – weiteres Drücken der Schaltfläche F8 arbeitet den Code schrittweise ab, wobei die Deklarationszeilen übergangen werden. F8 springt auch zu Prozeduren, welche die aktuelle Prozedur aufruft.
Unter Umständen ist das nicht gewünscht, weil die von dort aufgerufene Prozedur eine Menge Code enthält, den Sie in Ihrer Untersuchung nicht berücksichtigen möchten. In diesem Fall verwenden Sie die Tastenkombination Umschalt + F8. Damit durchlaufen Sie nur die in der aktuellen Prozedur enthaltenen Zeilen. Unterroutinen werden nicht berücksichtigt.
Wenn Sie sich einmal in einer Unterroutine befinden und feststellen, dass es hier keine relevanten Informationen zu holen gibt, können Sie mit Strg + Umschalt + F8 zum Ende der Routine springen. Sie landen dann in der aufrufenden Routine, und zwar in der ersten Zeile hinter dem Aufruf.
Fehlt nur noch eine Taste, die den Ablauf ohne weitere Zwischenschritte fortsetzt. Mit dieser können Sie auch komplette Routinen vom Start weg einfach aufrufen. Es handelt sich um die Taste F5.
Haltepunkte
Manchmal möchte man sich nicht mühsam per Einzelschritt bis zur interessanten Stelle im Code vorarbeiten, sondern direkt dorthin springen. Dafür gibt es Haltepunkte. Sie setzen einen Haltepunkt in eine Zeile, indem Sie die Einfügemarke in der Zeile positionieren und die Taste F9 beziehungsweise den Menübefehl Debuggen|Haltepunkte ein/aus verwenden.
Zum Entfernen aller Haltepunkte dienen der Menübefehl Debuggen|Alle Haltepunkte löschen oder die Tastenkombination Strg + Umschalt + F9.
Haltepunkte können Sie auch mit der Maus setzen. Dazu klicken Sie einfach auf der Höhe der betroffenen Zeile auf den links davon befindlichen grauen Balken.
Zurück nach oben
Manchmal möchte man sich im Code nicht vor-, sondern zurückbewegen – beispielsweise um einer Variablen testweise einen neuen Wert per Direktfenster zuzuweisen und eine Anweisung erneut zu testen, ohne direkt die ganze Prozedur neu zu starten.
Dazu ziehen Sie einfach den gelben Pfeil mit der Maus an die gewünschte Stelle (siehe Bild 2).
Bild 2: Per Drag and Drop des gelben Pfeils können Sie Zeilen wiederholt ausführen oder auch überspringen.
Alternativ positionieren Sie die Einfügemarke dort, wo VBA den Code fortsetzen soll, und betätigen die Tastenkombination Strg + F9.
Mit beiden Varianten können Sie übrigens nicht nur zurück, sondern auch vorwärts springen und so die Ausführung der dazwischen liegenden Zeilen unterbinden.
Debugging per Code
Wenn Sie sicherstellen möchten, dass ein bestimmter Codeteil durchlaufen wird, oder feststellen möchten, welchen Wert eine Variable zu einem bestimmten Zeitpunkt hat, können Sie einfach eine Zeile zum Code hinzufügen, welche die benötigte Information liefert.
Dies geschieht entweder durch den Einsatz der MsgBox– oder der Debug.Print-Anweisung. Eine weitere Alternative ist die Debug.Assert-Methode, die das Anhalten des Codes unter bestimmten Bedingungen erlaubt.
Ausgabe per MsgBox
Die Entscheidung, ob man zu Debugging-Zwecken die MsgBox– oder die Debug.Print-Anweisung einsetzt, hängt von den persönlichen Vorlieben, vom Umfang der benötigten Ausgaben und weiteren Faktoren ab.
Wenn Sie nur an ein oder zwei Stellen Informationen ausgeben möchten, ist ein Meldungsfenster sicher in Ordnung. Wenn Sie dieses jedoch in eine Schleife mit vielen Durchläufen einbauen, werden Sie schnell vom ständigen Wegklicken der Meldungen genervt sein. Hier ist die Arbeit mit der Debug.Print-Anweisung doch wesentlich entspannter: Sie brauchen die Routine einfach nur durchlaufen zu lassen und können sich die gesuchten Informationen dann bequem im Direktfenster ansehen (das man übrigens am schnellsten mit Strg + G einblendet, falls es nicht ohnehin schon sichtbar ist).
Debug.Print
Die Debug.Print-Anweisung zeigt den angegebenen Ausdruck im Direktfenster des VBA-Editors an. Die einfachste Variante ist, einen einzelnen Ausdruck auszugeben.
Die folgenden Zeilen bewirken die Ausgabe der Zeichenfolge Hallo:
Dim str As String str = "Hallo" Debug.Print str
Mehrere Werte lassen sich mit dem Kaufmanns-Und verknüpfen:
Debug.Print rst!Vorname & " " & rst!Nachname André Minhorst
Da es im Direktfenster keine Schönheitspreise zu gewinnen gibt, tun es auch Tabulatoren, die man durch Trennen der gewünschten Ausdrücke durch Kommata erreicht:
Debug.Print rst!Vorname, rst!Nachname André Minhorst
Sie können auch die Ausgabe mehrerer aufeinanderfolgender Debug.Print-Anweisungen in einer Zeile ausgeben. Dazu fügen Sie der Debug.Print-Anweisung, die mit der folgenden fortgesetzt werden soll, einfach ein Semikolon an:
Debug.Print "André"; Debug.Print "Minhorst"
Dies ergibt:
AndréMinhorst
Wenn sich zwischen den Ausdrücken beispielsweise ein Tabulator befinden soll, ergänzen Sie vor dem Semikolon ein Komma. Das kann wie folgt aussehen:
Debug.Print "André", ; Debug.Print "Minhorst"
Wenn Sie mehrere Ausdrücke ohne Leerzeichen oder Tabulator zusammenführen möchten, können Sie diese einfach hintereinander angeben:
Debug.Print rst!Vorname rst!Nachname
Debug.Assert
Weitgehend unbeachtet, aber wertvoll ist die Debug.Assert-Anweisung. Stellen Sie sich vor, Sie möchten den Programmablauf an einer Stelle unter bestimmten Bedingungen unterbrechen, um sich dort umzusehen. Manche Programmierer bauen dann etwa das Konstrukt aus Bild 3 ein und setzen einen entsprechenden Haltepunkt.
Bild 3: Dieses Konstrukt sorgt im Programmablauf für einen Halt an der gewünschten Stelle.
Das ist definitiv zu viel Aufwand und lässt sich erheblich leichter lösen, nämlich so:
Public Sub TestAssert() Dim intZaehler As Integer For intZaehler = 1 To 1000 'tu irgendwas Debug.Assert Not intZaehler = 500 Next intZaehler End Sub
Auch diese Routine hält bei intZaehler = 500 automatisch an, und das mit nur einer Zeile und ohne explizites Setzen eines Haltepunktes. Zu beachten ist, dass Debug.Assert einen bool'schen Ausdruck erwartet und nur dann den laufenden Code anhält, wenn dieser Ausdruck den Wert False aufweist – daher die Formulierung Not intZaehler = 500.
Bedingtes Debugging
Eine der einfachsten Arten, während des Programmablaufs zu prüfen, ob bestimmte Codeabschnitte überhaupt erreicht werden oder welche Werte Variablen zu einem bestimmten Zeitpunkt haben, ist das Einfügen der MsgBox-Anweisung in den Code. Wie bereits weiter oben erwähnt, kann das ständige Erscheinen von Meldungsfenstern den Fluss aber schon sehr stören.
Wenn Sie dennoch mit der MsgBox-Funktion arbeiten möchten, aber keine Lust haben, alle für das Debugging vorhandenen Meldungsfenster zu entfernen und wieder einzufügen, können Sie diese mit der bedingten Kompilierung ein- und ausschalten.
Die beiden Elemente der bedingten Kompilierung sind eine Konstante, die einen Wert festlegt, sowie ein If…Then-Konstrukt mit spezieller Syntax und einigen Sonderregeln.
Ein einfaches Beispiel wäre das folgende. Die Konstante bolTest legt fest, ob man sich im Debug-Betrieb befindet oder nicht – in diesem Fall ja:
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo