Home > Artikel > Ausgabe 7/2011 > Fehler unter VBA

Fehler unter VBA

  PDF ansehen

  Download PDF

Wer mit VBA arbeitet und damit seine Access-Anwendung automatisieren möchte, macht Fehler – gerade als Einsteiger. Da ist es gut zu wissen, welche Fehler passieren können und wie diese einzuordnen sind. Dieser Artikel stellt die verschiedenen Fehlerarten vor, denen Sie im Laufe Ihres Entwicklerlebens begegnen werden.

Fehlerarten unter VBA

Unter VBA gibt es verschiedene Fehler, die sich zu unterschiedlichen Anlässen bemerkbar machen:

  • Syntaxfehler
  • Kompilierzeitfehler
  • Laufzeitfehler

Die folgenden Abschnitte stellen die Fehlerarten vor.

Syntaxfehler

Syntaxfehler sind die am einfachsten zu behandelnden Fehler: Sie entstehen gleich bei der Eingabe und werden entweder direkt beim Verlassen der Codezeile oder spätestens beim Ausführen gemeldet.

Ein Beispiel ist eine fehlende schließende Klammer wie in Bild 1. Der Fehler fällt dem VBA-Interpreter gleich auf, wenn Sie die Zeile verlassen. In diesem Falle wird das Then-Schlüsselwort markiert, weil es das erste ungültige ist, dem eigentlich die schließende Klammer hätte vorangehen müssen.

Syntaxfehler durch eine fehlende Klammer

Bild 1: Syntaxfehler durch eine fehlende Klammer

Syntaxfehler beheben

Nach dem Bestätigen der Fehlermeldungen mit OK hinterlegt der VBA-Editor die Kopfzeile der Routine übrigens gelb und will Ihnen damit sagen: Korrigieren Sie den Fehler und betätigen Sie die Taste F5, damit wir einen neuen Versuch unternehmen können.

Das können Sie tun, wenn es sich nur um eine kleine Ergänzung wie etwa das Hinzufügen einer schließenden Klammer oder einer End If-Zeile handelt – wenn Sie die Routine etwa als Ereignisprozedur über das Anklicken einer Schaltfläche eines Formulars gestartet haben, brauchen Sie nicht erneut auf die Schaltfläche zu klicken, sondern können direkt mit F5 fortfahren.

Anzeige von Syntaxfehlern ausschalten

Irgendwann kennen Sie die typischen Syntaxfehler und möchten vielleicht auf die Anzeiger der Fehlermeldungen verzichten. Für diesen Fall hält der Optionen-Dialog des VBA-Editors eine passende Einstellung bereit.

Öffnen Sie den Optionen-Dialog mit dem Menü-Eintrag Extras|Optionen und deaktivieren Sie die Einstellung Automatische Syntaxüberprüfung (siehe Bild 2).

Deaktivieren der Anzeige von Syntaxfehlern

Bild 2: Deaktivieren der Anzeige von Syntaxfehlern

Wenn Sie nun einen Syntaxfehler produzieren, der bereits durch die Prüfung einer einzigen Zeile ermittelt werden kann, zeigt der VBA-Editor keine Fehlermeldung an, sondern markiert einfach nur die fehlerhafte Zeile rot.

Dabei kann es durchaus vorkommen, dass mehrere fehlerhafte Zeilen gleichzeitig markiert werden (siehe Bild 3). Für Einsteiger mag das nicht relevant sein, aber später werden Sie es möglicherweise zu schätzen wissen, wenn Sie etwa beim Importieren und Umwandeln von Code in anderen Programmiersprachen nicht ständig Fehlermeldungen wegklicken müssen, um den Code in Ruhe VBA-konform zu gestalten.

Ohne automatische Syntaxüberprüfung können auch mehrere fehlerhafte Zeilen farbig hinterlegt werden.

Bild 3: Ohne automatische Syntaxüberprüfung können auch mehrere fehlerhafte Zeilen farbig hinterlegt werden.

Und wenn wir gerade schon bei den Optionen zur Anzeige von Syntaxfehlern sind: Auf der zweiten Seite der Optionen können Sie unter Code-Farben einstellen, in welcher Farbe verschieden markierte Zeilen und Texte erscheinen sollen.

Wenn Sie also beispielsweise in der Schule zuviele rote Kommentare in Ihren Klassenarbeiten vorgefunden haben, möchten Sie fehlerhafte Zeilen vielleicht eher grün gefärbt vorfinden (siehe Bild 4).

Einstellen der Textfarbe etwa für Zeilen mit Syntaxfehlern

Bild 4: Einstellen der Textfarbe etwa für Zeilen mit Syntaxfehlern

Kompilierzeitfehler

Andere Syntaxfehler kann VBA nicht direkt beim Abschließen einer Zeile, sondern erst beim Ausführen der betroffenen Routine erkennen. Dabei handelt es sich um Fehler beim Aufbau von mehrzeiligen Konstrukten wie beispielsweise If...Then, Do...Loop oder For...Next.

Ein Beispiel zeigt Bild 5. VBA prüft die Syntax der Routine und stellt fest, dass sich vor dem Ende der Routine zwar ein If...Then, aber kein End If befindet. Das ist natürlich nicht erlaubt, also erscheint auch hier eine Fehlermeldung – allerdings erst, nachdem die Prozedur aufgerufen wurde.

Syntaxfehler durch unvollständige Code-Konstrukte

Bild 5: Syntaxfehler durch unvollständige Code-Konstrukte

Die Syntaxprüfung erfolgt vor dem Kompilieren der Routine, um diese in ausführbaren Code zu übersetzen. Treten dort Fehler auf, kann die Kompilierung nicht fortgesetzt werden und es erscheint eine entsprechende Meldung.

Die Kompilierung können Sie allerdings auch durchführen, ohne die Routine auszuführen. Den dazu notwendigen Befehl finden Sie im Menü unter Debuggen|Kompilieren von .

Dieser Befehl kompiliert immer das komplette VBA-Projekt, also alle in den Standard- und Klassenmodulen enthaltenen Deklarationen und Routinen.

Der VBA-Editor meldet beim Kompilieren immer nur einen Fehler gleichzeitig. Um weitere Fehler zu entdecken, müssen Sie diesen Fehler beheben und dann erneut kompilieren. Erst wenn kein Fehler mehr vorliegt, können Sie das komplette Projekt kompilieren.

Wenn Sie eine Routine aufrufen, wird diese auf jeden Fall kompiliert, andere unabhängige Routinen jedoch nicht. Wenn die Routine jedoch weitere Prozeduren oder Funktionen aufruft, werden zuerst alle Routinen kompiliert.

Beispiele für Kompilierzeitfehler

Beim Kompilieren können beispielsweise die folgenden Fehler auftreten:

  • Sie rufen eine Funktion auf, aber geben nicht alle notwendigen Parameter an. Beispiel: Der Aufruf von Msgbox ohne Parameter liefert den Fehler Argument ist nicht optional.
  • Sie verwenden eine Variable, die nicht deklariert wurde (siehe Bild 6). Dieser Fehler tritt nur auf, wenn oben im Modul die Zeile Option Explicit steht – deshalb ist die explizite Deklaration so wichtig! Anderenfalls wird jede nicht deklarierte Variable automatisch als Variable des Typs Variant angesehen, was zu interessanten Fehlern führen kann.
  • Kompilierfehler bei Verwendung nicht deklarierter Variablen

    Bild 6: Kompilierfehler bei Verwendung nicht deklarierter Variablen

Explizite Variablendeklaration

Je nach Access-Version fügt der VBA-Editor gleich beim Anlegen eines neuen Moduls oder einer neuen Klasse die Zeile Option Explicit ganz oben im Modul ein.

Ob dies geschieht, hängt von der Einstellung der Option Variablendeklaration erzwingen ab.

Diese Einstellung finden Sie im Optionen-Dialog des VBA-Editors auf der ersten Seite (siehe Bild 7).

Durch diese Einstellung landet die Zeile Option Explicit in jedem neuen Modul.

Bild 7: Durch diese Einstellung landet die Zeile Option Explicit in jedem neuen Modul.

Warum Microsoft diese Option in verschiedenen Versionen standardmäßig deaktiviert, ist übrigens ein gut gehütetes Geheimnis ...

Laufzeitfehler

Laufzeitfehler treten, wie der Name schon sagt, zu der Zeit auf, während eine Routine läuft. Laufzeitfehler werden beim Kompilieren noch nicht erkannt, sondern werden erst durch eine bestimmte Anweisung ausgelöst.

Dies kann beispielsweise in folgenden Fällen geschehen:

  • Sie deklarieren eine Variable als Integer und weisen dieser einen Wert eines inkompatiblen Datentyps zu, beispielsweise eine Zeichenkette (Typen unverträglich, Fehler 13).
  • Sie weisen einer Zahl-Variablen einen Wert zu, der zwar auch einer Zahl entspricht, aber den Wertebereich des Datentyps der Variablen übersteigt (Überlauf, Fehler 6 – siehe Bild 8).
  • Laufzeitfehler durch einen Überlauf

    Bild 8: Laufzeitfehler durch einen Überlauf

  • Sie referenzieren mit einer Anweisung ein Objekt, das nicht vorhanden ist – beispielsweise wenn Sie ein Feld eines Formulars referenzieren möchten, dass es gar nicht gibt (diverse Fehlermeldungen).
  • Sie teilen einen Wert durch die Zahl 0 (Division durch 0, Fehler 11).

Von der Fehlerzahl zur Fehlerbeschreibung

Wenn Sie sich einmal die Liste aller Fehlermeldungen von Access, VBA und Co. ansehen möchten, können Sie die folgende Routine eingeben und starten:

Public Sub AlleFehler()

     Dim l As Long

     For l = 1 To 50000

         If Len(AccessError(l)) > 0 Then

             If Not AccessError(l) = "Anwendungs- µ

                 oder objektdefinierter Fehler" Then

                 Debug.Print l, AccessError(l)

             End If

         End If

     Next l

End Sub

Sie macht sich die Funktion AccessError zunutze, die für eine mit dem einzigen Parameter übergebene Fehlernummer die Fehlermeldung ausgibt – im Direktfenster zum Beispiel so:

Debug.Print AccessError(13)

Typen unverträglich

Dabei schließt die Routine alle Fehlernummern mit leerer Fehlermeldung und solche mit der Meldung Anwendung- oder objektdefinierter Fehler aus.

Logische Fehler

Es gibt natürlich auch Programmierfehler, die sic nicht in Fehlermeldungen äußern, sondern schlicht durch falsche Ergebnisse etwa in Berechnungen. Diese Fehler nennt man logische Fehler.

Ein Beispiel für einen logischen Fehler ist etwa eine Berechnung, bei der die Klammern falsch gesetzt wurden – also etwa (a+b)*c statt a+(b*c), wobei die Klammern in letzterem Falle sogar unnötig sind.

Logische Fehler lassen sich am einfachsten durch geschicktes Debugging ermitteln. Wie dies funktioniert und welche Möglichkeiten der VBA-Editor bietet, erfahren Sie in einem weiteren Artikel in einer der folgenden Ausgaben von Access [basics].

Fehler bei der Datenbearbeitung

Auch beim Bearbeiten von Daten, also beim Löschen oder beim Hinzufügen oder Ändern von Datensätzen, können Fehler auftreten. Diese Eingabefehler unterscheiden sich von den oben genannten dadurch, dass Sie nicht unbedingt durch benutzerdefinierten VBA-Code entstehen, sondern durch Eingaben, die nicht den festgelegten Regeln entsprechen. So kann es beispielsweise sein, dass Sie versuchen, eine Kategorie zu löschen, die aber noch mit einem Artikel verknüpft ist. Oder Sie möchten einen unzulässigen Wert in ein Feld eingeben: Das passiert beispielsweise, wenn ein Feld mit einem eindeutigen Index versehen wurde und Sie einen Wert eingeben, der bereits im gleichen Feld eines anderen Datensatzes enthalten ist.

Eigentlich sind dies keine Fehler im eigentlichen Sinne, aber die erscheinenden Meldungen lösen mitunter Unsicherheit beim Benutzer aus und sollten somit ernstgenommen und gegebenenfalls durch eigene Meldungen ersetzt werden. Mehr zu solchen Fehlern und deren Behandlung erfahren Sie im Artikel Fehlerbehandlung in Formularen in der nächsten Ausgabe von Access [basics].