Fehlersuche und -behandlung mit Access

Wenn Sie bereits einmal Datenbankanwendungen mit VBA-Funktionen und -Prozeduren entwickelt haben, kennen Sie bereits das Vergnügen, sich mit dem Auffinden und Beheben der unterschiedlichsten Fehler herumzuschlagen – es sei denn, Sie programmieren so gut, dass nie Fehler auftreten. Im vorliegenden Beitrag erfahren Sie, welche Fehlerarten bei der Arbeit mit VBA auftreten können, wie man die Fehler findet und sie schließlich behebt. Dabei lernen Sie auch die unterschiedlichen Möglichkeiten der Fehlersuche kennen.

Fehlerarten in VBA

Die Fehlerarten, die bei der Programmierung mit VBA auftreten, können in drei unterschiedliche Gruppen eingeteilt werden.

Syntaxfehler

Die erste Gruppe beinhaltet die so genannten Syntaxfehler. Syntaxfehler erkennt Access entweder direkt bei der Eingabe oder spätestens beim Kompilieren. Ein häufig anzutreffender Fehler bei der Eingabe ist eine zu viel gesetzte Klammer. Auf solche Fehler weist Access Sie nach dem Verlassen der betroffenen Zeile durch eine entsprechende Fehlermeldung in einem Meldungsfenster hin (s. Bild 1). In der Regel handelt es sich bei Syntaxfehlern um solche Fehler, die Access beim Überprüfen der aktuellen Zeile entdecken kann.

image001.png

Bild 1: Access bemängelt Syntaxfehler direkt bei der Eingabe.

Möglicherweise möchten Sie nicht, dass Access Fehlermeldungen bei der Eingabe anzeigt. Dann öffnen Sie mit dem Menübefehl Extras|Optionen den Dialog Optionen und wählen hier das Register Modul aus. Hier können Sie sowohl unter Code-Optionen die Anzeige von Fehlermeldungen deaktivieren als auch im Bereich Code-Farben die Textfarbe syntaktisch falscher Zeilen einstellen (s. Bild 2).

image003.png

Bild 2: Optionen zur Anzeige von Fehlermeldungen

Wenn Sie die Fehlermeldung ignorieren und die Prozedur dennoch ausführen, weist Access mit einer etwas weniger informativen Meldung auf den Syntaxfehler hin. Immerhin markiert Access die entsprechende Zeile rot, an welcher es zu Problemen kommt.

Kompilierzeitfehler

Manche Fehler, die eigentlich als Syntaxfehler zu bezeichnen sind, fallen bei der Syntaxprüfung während der Eingabe durchs Sieb. Dabei handelt es sich beispielsweise um For…Next-Schleifen, die nicht mit der Next-Anweisung abgeschlossen wurden.

Solche Fehler erfordern die Überprüfung des gesamten Algorithmus. Da bei der Eingabe von Codes nicht nach jeder Zeile eine komplette Überprüfung stattfinden kann, erfolgt sie erst beim Kompilieren der Prozedur oder Funktion.

Eine Funktion oder Prozedur wird kompiliert, wenn Sie diese ausführen. Sie können eine Funktion aber auch kompilieren, ohne sie auszuführen. Dazu verwenden Sie einen der ersten drei Befehle des Menüs Testen.

Mit den Befehlen Alle Module kompilieren und Alle Module kompilieren und speichern kompilieren Sie alle Module. Der Befehl Geladene Module kompilieren schließt nicht geladene Module sowie die Objektmodule von Formularen und Berichten aus. Bild 3 zeigt eine Prozedur, die einen typischen Kompilierzeitfehler aufweist. In diesem Zusammenhang ist zu erwähnen, dass immer nur ein Kompilierzeitfehler gleichzeitig gemeldet werden kann, da Access das Kompilieren nach dem Auffinden eines Fehlers automatisch abbricht. Weitere Fehler findet Access erst beim folgenden Kompiliervorgang.

image005.png

Bild 3: Ein typischer Kompilierzeitfehler

Syntax- oder Kompilierzeitfehler sind recht schnell behoben, da man meist direkt eine recht eindeutige Beschreibung des Fehlers erhält. Man korrigiert den Fehler und kompiliert anschließend das Modul erneut, um zu überprüfen, ob der Fehler auch tatsächlich behoben wurde.

Laufzeitfehler

Manche Fehler können nicht bei der Eingabe oder beim Kompilieren festgestellt werden, da sie erst bei der Ausführung der Prozedur auftreten. Dabei gibt es die unterschiedlichsten Möglichkeiten:

  • Einer Variablen wird ein Wert eines anderen Datentyps zugewiesen, etwa ein String einer Integer-Variablen.
  • Der Wert einer Variablen übersteigt deren Wertebereich.
  • Eine Anweisung bezieht sich auf ein Objekt, welches nicht zur Verfügung steht.

Der klassische Vertreter der Laufzeitfehler ist die Division zweier Zahlen, wobei der Benutzer als Teiler den Wert 0 angibt. Hier tritt eine Division durch Null auf, worauf Access wie in Bild 4 reagiert.

image007.png

Bild 4: Bei der Division durch Null tritt ein Fehler auf.

Um diesen Fehler zu verhindern, gibt es zwei Möglichkeiten: Entweder Sie setzen direkt bei der Eingabe der Werte an und geben eine entsprechende Meldung aus, wenn der Wert Null für den Nenner eingegeben wurde. Dies können Sie mit einer einfachen Anweisung erledigen (If Zahl1 = 0 then …). Oder Sie überprüfen erst nach der Berechnung, ob ein Fehler aufgetreten ist. In diesem Fall legen Sie eine Fehlerbehandlung an. Wie das geht, erfahren Sie weiter unten.

Logische Fehler

Zur unbequemsten Fehlerart gehören logische Fehler. Während Access sich in den meisten Fällen beim Auftreten der bisher genannten Fehler früher oder später zu Wort meldet, müssen Sie logische Fehler selbst finden und beheben.

Ein einfacher logischer Fehler wäre beispielsweise das falsche Setzen einer Klammer bei einer Rechenoperation, denn (2+2) x 2 ist nicht dasselbe wie 2+(2×2). Wenn Sie komplizierte Berechnungen in Ihrer Anwendung durchführen und am Ende einen unerwarteten Wert erhalten, ist meist ein solch trivialer Fehler schuld am Dilemma.

Access bietet aber auch hier beim Auffinden des Fehlers Hilfestellung. Es gibt beispielsweise zahlreiche Möglichkeiten, Variable während der Laufzeit auszugeben. Wie das funktioniert, erfahren Sie weiter unten.

Starten von Prozeduren

Bevor Sie die folgenden Beispiele ausprobieren, erfahren Sie zunächst, wie Sie eine Prozedur starten können, wenn dies nicht durch das Betätigen einer Schaltfläche passiert. Die schnellste Art, eine Prozedur zu starten, während Sie den Programmcode im Modulfenster sehen, ist das Betätigen des Menübefehls Auswählen|Weiter oder der gleichnamigen Schaltfläche in der Symbolleiste. Achten Sie darauf, dass sich die Einfügemarke in der gewünschten Prozedur befindet, damit Access weiß, welche Prozedur es ausführen soll.

Das funktioniert allerdings nur, wenn der Aufruf der Prozedur keinerlei Parameter erfordert. Falls dies doch der Fall ist, bleibt Ihnen die Möglichkeit, die Prozedur über das Testfenster zu starten. Das Testfenster erreichen Sie entweder über den Menübefehl Ansicht|Testfenster oder über die Tastenkombination Strg + G. Geben Sie hier den Prozedurnamen, gefolgt von den erforderlichen Parametern in der unteren Hälfte des Fensters ein und betätigen Sie die Eingabetaste, um die Prozedur zu starten. Beachten Sie, dass Sie bei privaten Prozeduren den Namen des Moduls mit einem Punkt getrennt voranstellen (etwa modTest.TextAnzeigen). Wenn Sie Prozeduren aus Berichts- oder Formularmodulen ausführen möchten, muss das entsprechende Objekt geöffnet sein, zudem muss es sich um eine öffentliche Prozedur handeln.

Nun haben Sie das erforderliche Werkzeug, um sich an die Beispiele heranzuwagen.

Fehlerbehandlung von Laufzeitfehlern

Die Programmiersprache VBA bietet dem Entwickler die Möglichkeit, auf Laufzeitfehler in angemessener Weise zu reagieren. Das bedeutet, dass Sie Access anweisen können, beim Auftreten eines bestimmten Fehlers in eine Fehlerbehandlungsroutine zu springen, welche dann überprüft, um welchen Fehler es sich handelt, und die entsprechenden Maßnahmen ausführt.

Die folgenden Anweisungen stellen das „Gerippe“ einer Prozedur zur Fehlerbehandlung dar:

Sub <Prozedurname> (<Parameterliste>)
    On Error Goto <Sprungmarke>
    [<Anweisungen>]
    Exit Sub
<Sprungmarke>:
    <Anweisungen zur Fehlerbehandlung>
    Exit Sub
End Sub

Dabei legt die Anweisung On Error Goto <Sprungmarke> fest, dass die Prozedur im Fall eines Laufzeitfehlers mit dem Programmteil hinter der angegebenen Sprungmarke fortfährt. In diesem Programmteil können Sie dann die notwendigen Anweisungen geben, welche die Prozedur beim Auftreten eines Fehlers ausführen soll.

Die On Error-Anweisung muss nicht unbedingt auf eine Fehlerbehandlungsroutine verweisen. Sie können auch die Anweisung On Error Resume Next verwenden, um die fehlerhafte Zeile einfach zu überspringen und die Prozedur mit der nächsten Zeile fortzusetzen.

Die Funktionsweise der Fehlerbehandlung lässt sich am besten anhand eines kleinen Beispiels darstellen. Dazu verwenden Sie die Prozedur Dividieren, die Sie bereits weiter oben kennen gelernt haben. Damit der Fehler entsprechend abgefangen wird, müssen Sie einige Zeilen zum vorhandenen Programmcode hinzufügen (siehe hierzu Listing 1).

Listing 1: Benutzerdefinierte Fehlermeldung

Sub Dividieren()
    Dim Zahl1 As Double
    Dim Zahl2 As Double
    Dim Ergebnis As Double
    On Error GoTo Err_Dividieren
    Zahl1 = Val(InputBox("Geben Sie die erste Zahl ein."))
    Zahl2 = Val(InputBox("Geben Sie die zweite Zahl ein."))
    Ergebnis = Zahl1 / Zahl2
    MsgBox ("Das Ergebnis lautet: " & Ergebnis)
    Exit Sub
Err_Dividieren:
    MsgBox "Es ist ein Fehler aufgetreten." & Chr$(10) & _
        "Fehlertext: " & Err.Description & Chr$(10) & _
        "Fehlernummer: " & Err.Number
    Exit Sub
End Sub

Mit der Anweisung On Error Goto Err_Dividieren teilen Sie der Prozedur mit, dass sie beim Auftreten eines Fehlers automatisch in die Fehlerbehandlungsroutine springt, die mit der Sprungmarke Err_Division: eingeleitet wird.

Im vorliegenden Fall gibt die Fehlerbehandlungsroutine statt der üblichen Fehlermeldung eine benutzerdefinierte Fehlermeldung aus (s. Bild 5).

image038.png

Bild 5: Eine benutzerdefinierte Fehlermeldung

Wie hier zu erkennen ist, können sowohl die Fehlernummer als auch die Beschreibung des Fehlers ermittelt werden. Dies ermöglicht Ihnen, die Prozedur auf bestimmte Fehlerarten vorzubereiten.

In diesem Fall ist das die Division durch Null. In der folgenden Variante soll die Fehlermeldung den Anwender auf die falsche Eingabe hinweisen und zur Eingabe des ersten Wertes zurückspringen.

Dazu fügen Sie eine weitere Sprungmarke hinzu, mit der die Eingabe nach der Durchführung der Fehlerroutine neu gestartet werden kann.

Außerdem erstellen Sie in der Fehlerbehandlung eine Select Case-Abfrage, die abhängig von der Fehlernummer eine bestimmte Maßnahme ergreift.

Im vorliegenden Fall soll die Prozedur beim Auftreten einer Division durch Null automatisch nach einer Fehlermeldung zurück zur Fehlerausgabe springen. Bei allen anderen Fehlern soll der Ablauf der Prozedur enden. Die Prozedur sieht nun wie in Listing 2 aus.

Listing 2: Individuelle benutzerdefinierte Fehlermeldung

Sub Dividieren()
    Dim Zahl1 As Double
    Dim Zahl2 As Double
    Dim Ergebnis As Double
    On Error GoTo Err_Dividieren
    Werteingabe:
    Zahl1 = Val(InputBox("Geben Sie die erste Zahl ein."))
    Zahl2 = Val(InputBox("Geben Sie die zweite Zahl ein."))
    Ergebnis = Zahl1 / Zahl2
    MsgBox ("Das Ergebnis lautet: " & Ergebnis)
    Exit Sub
Err_Dividieren:
    Select Case Err.Number
        Case 11
            MsgBox "Sie haben den Wert Null als Teiler eingegeben. Geben Sie bitte eine reelle Zahl ein."
            Resume Werteingabe:
        Case Else
            MsgBox "Es ist ein Fehler aufgetreten." & Chr$(10) & "Fehlertext: " & Err.Description _
                  & Chr$(10) & "Fehlernummer: " & Err.Number
            Exit Sub
    End Select
End Sub

Parameter der Resume-Anweisung

Die Resume-Anweisung können Sie wie in obigem Beispiel verwenden, um aus der Fehlerroutine in das Programm zurückzuspringen. Für die Anweisung gibt es drei unterschiedliche Parameter:

  • Resume: Die Prozedur wird mit dem Befehl fortgesetzt, durch den der Fehler verursacht wurde.
  • Resume Next: Die Prozedur wird mit dem ersten Befehl hinter der Anweisung fortgesetzt, die den Fehler ausgelöst hat.
  • Resume <Sprungmarke>: Die Prozedur wird an der Stelle fortgesetzt, die durch die angegebene Sprungmarke eingeleitet wird.

Wirkungsbereich der Fehlerbehandlung

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

Schreibe einen Kommentar