Laufzeitfehler und Fehlerbehandlung Home Home

WB01727_.gif (1537 Byte)

Seiteninhalt
Jeder einigermassen erfahrene VBA-Programmierer hat schon mal eine Fehlerbehandlungsroutine geschrieben. Das ist ja auch nicht sonderlich schwierig, denn man braucht nur ein "On Error Goto <Sprungmarke>" am Prozedur-Anfang und ein bisschen VBA-Code nach der Sprungmarke. Sobald ein Laufzeitfehler auftritt, zeigt man einfach dem Benutzer die Fehlermeldung und verlässt dann die Prozedur mittels "Exit Sub". Nun gut, das ist natürlich auch ein Weg, um einem Laufzeitfehler aus dem Weg zu gehen, doch wie sieht das korrekte Vorgehen aus?
Leserprofil
VB-/VBA-Programmierer

WB01727_.gif (1537 Byte)

Inhalt

Einführung

Was sind Laufzeitfehler?

Fehlerbehandlungs-Optionen der Entwicklungsumgebung

Weitere Informationsquellen

Zum Seitenanfang


Einführung

Dieser Artikel geht unter anderem detailliert auf die Problematik der Laufzeitfehler ein. Wie gesagt: Eine Fehlerbehandlungsroutine ist einfach und schnell geschrieben, doch haben Sie sich schon einmal grundsätzliche Gedanken gemacht, wie
- Laufzeitfehler vermieden werden (d.h. gar nicht erst entstehen lässt),
- Laufzeitfehler getestet werden (d.h. ausnahmslos erkennt und abfängt),
- Laufzeitfehler interpretiert werden (d.h. die Auswirkungen und Folgen kennt),
- Laufzeitfehler behandelt werden (d.h. geeignete Massnahmen festlegt),
- Laufzeitfehler bereinigt werden (d.h. den Problemzustand beseitigt),
- Laufzeitfehler abgeschlossen werden (d.h. die Programm-Ausführung fortsetzt oder beendet),
- Laufzeitfehler analysiert werden (d.h. die Ursache findet) und
- Laufzeitfehler protokolliert werden (d.h. in einem Fehler-Log einträgt)?

Zum Seitenanfang

 


Was sind Laufzeitfehler?

Bei Laufzeitfehlern handelt es sich um Fehler, die in der Regel während der Programmausführung auftreten, also zur Programmlaufzeit. Da Sie sich jetzt vielleicht fragen werden, wie sich denn ein Laufzeitfehler bemerkbar macht, der nicht zur Laufzeit auftritt, hier ein kleines praktisches Beispiel:

Schritt 1 Wechseln Sie in den VBA-Editor von Microsoft Excel.
Schritt 2 Geben Sie im Direktfenster diese Anweisung ein:

  Application.VBE.CodePanes(100).Show

(Resultat) Diese Anweisung wird den Laufzeitfehler 452 "Ungültiger Ordinalwert" erzeugen.

Laufzeitfehler 452
Abbildung: Laufzeitfehler 452

Doch macht das überhaupt Sinn, dass ein Laufzeitfehler auch nicht zur Laufzeit auftreten kann? Die Antwortet lautet Nein!

Wenn Sie die obige Beispiel-Anweisung auf

  Application.VBE.CodePanes(1).Show

ändern, mindestens ein Codefenster geöffnet haben und dann nochmals ausführen, werden Sie erkennen, dass der Laufzeitfehler 452 ebenfalls während der Laufzeit eingeblendet wurde. Wenn Sie die Anweisung mit der Eingabe-Taste abschicken, müssen Sie die Fenster-Titelzeile des VBE-Hauptfensters ganz genau beobachten. Vielleicht müssen Sie die Anweisung ein paar Mal ausführen, bis Sie erkennen können, dass für einen Sekunden-Bruchteil die VBE in den Laufzeitmodus umschaltet.

Projekt in Ausführung (aktiv)
Abbildung: Projekt befindet sich im Laufzeitmodus

Doch nun wieder zurück zu den uns bekannten Laufzeitfehlern.

Tritt ein Laufzeitfehler auf und ist keine Laufzeitfehler-Behandlung aktiviert, wird eine Laufzeitfehler-Meldung angezeigt.

Laufzeitfehler Nr. 9
Abbildung: Laufzeitfehler-Meldung (Beispiel Laufzeitfehler 9)

Bitte beachten Sie, dass die Fehlermeldung auch erscheinen könnte, wenn die Prozedur eine (fehlerfreie) Fehlerbehandlungsroutine enthält. Die Meldung erscheint in jedem Fall, wenn in den Editor-Optionen die Einstellung "Bei jedem Fehler unterbrechen" aktiviert ist (siehe nächster Abschnitt "Fehlerbehandlungs-Optionen der Entwicklungsumgebung").

Zum Seitenanfang

 


Fehlerbehandlungs-Optionen der Entwicklungsumgebung

Die VBA-Entwicklungsumgebung bietet drei Optionen für die Fehlerbehandlung. Anhand diesen Optionen kann das Verhalten des Programmes bei Auftreten eines Laufzeitfehlers bestimmt werden. Diese Fehlerbehandlungs-Optionen stehen zur Verfügung:

Option Beschreibung
Bei jedem Fehler unterbrechen Bei jedem Fehler wird für das Projekt der Haltemodus aktiviert, unabhängig davon, ob eine Fehlerbehandlungsroutine aktiviert ist oder der Code sich in einem Klassenmodul befindet.
In Klassenmodul unterbrechen Alle nicht verarbeiteten Fehler in einem Klassenmodul bewirken, dass für das Projekt in der Codezeile des Klassenmoduls, die den Fehler verursacht hat, der Haltemodus aktiviert wird.
Bei nicht verarbeiteten Fehlern unterbrechen Wenn eine Fehlerbehandlungsroutine läuft, wird der Fehler behandelt, ohne den Haltemodus zu aktivieren. Sollte keine Fehlerbehandlungsroutine vorhanden sein, bewirkt der Fehler, dass der Haltemodus für das Projekt aktiviert wird. Ein nichtverarbeiteter Fehler in einem Klassenmodul bewirkt jedoch, dass für das Projekt in der Code-Zeile, die die falsche Prozedur für die Klasse aufgerufen hat, der Haltemodus aktiviert wird.

Tabelle: Fehlerbehandlungs-Optionen der VBA-Entwicklungsumgebung

 

Optionen-Dialog mit Fehlerbehandlungs-Einstellungen
Abbildung: Optionen-Dialogfenster mit Fehlerbehandlungs-Einstellungen (Registerkarte Allgemein)

 

Neben Laufzeitfehlern gibt es andere Fehler, wie zum Beispiel Eingabefehler, Syntaxfehler und Programmlogikfehler.

Zum Seitenanfang

 


Laufzeitfehler-Typen

Generell kann zwischen zwei verschiedenen Laufzeitfehler-Typen unterschieden werden:

Der letztere Laufzeitfehler-Typ muss sehr sorgfältig behandelt werden, da das Programm nicht einfach beendet werden darf, sondern zuerst der vor dem Programmstart vorgefundene Systemzustand wieder hergestellt werden sollte (z.B. Word-Grundeinstellungen, Standard-Drucker etc.) und allfällige nicht gespeicherte Daten wenn immer möglich noch gesichert werden sollten (z.B. Benutzereingaben, persönliche Einstellungen, nicht gespeicherte Dokumente etc.).

Damit entschieden werden kann, ob das VBA-Programm fortgeführt werden kann oder nicht, muss der Laufzeitfehler zuerst analysiert werden. Wie das geht, erfahren Sie im Abschnitt "Laufzeitfehler analysieren".

Zum Seitenanfang

 


Konzeption einer Fehlerbehandlungsroutine

Wann ist eine Fehlerbehandlung sinnvoll?

Dass es wichtig ist, Laufzeitfehler abzufangen, sind sich wohl alle einig. Anderenfalls würde das VBA-Programm abstürzen. Allerdings würde es nicht komplett abstürzen, also mit Datenverlust oder Beendigung der Office-Anwendung, sondern nur in seiner Ausführung unterbrochen.

Bevor wir in jede Prozedur und in jede Funktion eine Fehlerbehandlungsroutine einbauen, sollten wir uns zuerst überlegen, wie hoch die Wahrscheinlichkeit ist, dass in der betroffenen Prozedur überhaupt ein Laufzeitfehler entstehen kann. Wenn es offensichtlich ist, dass kein Laufzeitfehler auftreten kann, muss keine Fehlerbehandlung eingefügt werden. Wenn aber Möglichkeit besteht, dass ein Laufzeitfehler auftreten könnte, und sei die Wahrscheinlichkeit noch so gering, dann sollte eine Laufzeitfehler-Behandlung verwendet werden.

 

Wann treten Laufzeitfehler auf?

Die klassischen Fehlersituationen
Es gibt ein paar klassische Situationen, in denen Laufzeitfehler auftreten können oder es sogar nahezu unvermeidbar ist, dass Laufzeitfehler auftreten.

Grundsätzlich als kritisch einzustufen sind jegliche Datei-, Verzeichnis- und Laufwerk-Zugriffe, wie unter anderem diese Operationen:

Auch Zugriffe auf Peripherie-Geräte bergen ein gewisses Risiko, da beispielsweise im Falle eines Druckers der Drucker ausgeschaltet, nicht mit dem Netzwerk oder der Arbeitsstation verbunden oder ganz einfach nicht mehr vorhanden sein könnte.

Weitere Fehlersituationen
Bedenken Sie, dass Laufzeitfehler auch in scheinbar harmlosen Situationen auftreten können, wie am folgenden Praxis-Beispiel zu erkennen ist.

Schritt 1 Öffnen Sie den VBA-Editor von Microsoft Word.
Schritt 2 Legen Sie ein neues Code-Modul ein (Menübefehl Einfügen / Modul).
Schritt 3 Fügen Sie diese Codezeilen in das Modul ein.

Sub Test()
   Documents.Add.Save
End Sub

Schritt 4 Positionieren den Cursor innerhalb der Prozedur und starten Sie die Ausführung (z.B. mit der Taste F5).
(Resultat) Erwartungsgemäss wird ein neues Word-Dokument geöffnet und der Speichern unter-Dialog von Word eingeblendet.
Schritt 5 Klicken Sie jetzt auf die Abbrechen-Schaltfläche des Dialogfensters.
(Resultat) VBA wird an dieser Stelle den Laufzeitfehler 4198 "Befehl misslungen" erzeugen (siehe nächste Abbildung).

Laufzeitfehler Nr. 4198
Abbildung: Laufzeitfehler nach Klicken der "Abbrechen"-Schaltfläche

Sie sehen, dass eine ganz unscheinbare Anweisung wie Documents.Add.Save einen Laufzeitfehler auslösen kann.

Zum Seitenanfang

 


Laufzeitfehler und auffangbare Fehler

In der Regel kann jeder Laufzeitfehler erkannt und abgefangen werden. Daher werden Laufzeitfehler auch als auffangbare Fehler bezeichnet. Verschiedene auffangbare Fehler können allerdings auch (genauer gesagt ausschliesslich) zur Entwurfszeit auftreten. Bei diesen Fehlern handelt es sich somit nicht um Laufzeitfehler.

Zum Seitenanfang

 


Fehlerbehandlung einschalten

Der On Error Goto-Befehl

In allen wichtigen Prozeduren und Funktionen sollte die Anweisung On Error Goto als erste Programmzeile stehen. Der Name einer Sprungmarke muss innerhalb eines des VBA-Programmes nicht eindeutig sein (was bei älteren VBA-Versionen allerdings der Fall war). Zu empfehlen ist eine Kombination aus "err" (Abkürzung für "Error") und dem Prozedur- resp. Funktionsnamen (Beispiel: errLadeStammdaten). Das "err" wird dabei in Kleinschrift geschrieben, da es hier als Präfix verwendet wird.

Beispiel
Public Sub LadeStammdaten()

  On Error Goto errLadeStammdaten

  'Irgendwelche Befehle

  Exit Sub
 
errLadeStammdaten:
  'Fehlerbehandlung

End Sub

Beachten Sie bitte, dass, wie im obigen Beispiel gut zu erkennen ist, vor der Sprungmarke der Fehlerbehandlung errLadeStammdaten unbedingt die Anweisung Exit Sub (respektive Exit Function) stehen sollte. Anderenfalls würde das Programm unweigerlich alle Anweisungen, die innerhalb der Fehlerbehandlungsroutine stehen, ebenfalls abarbeiten. Also auch dann, wenn kein Laufzeitfehler auftrat.

Fehlende Exit-Sub-Anweisung
     Abbildung: "Unvollständiger" Programmcode, da die Exit Sub-Anweisung fehlt

 

Der On Error Resume Next-Befehl

Der On Error Resume Next-Befehl bewirkt, dass nach Auftreten eines Laufzeitfehlers das Programm nicht unterbrochen wird.

Public Sub DokumentNeuSpeichern()
  Documents.Add.Save
End Sub

Ist hier keine Laufzeitfehler-Behandlung aktiviert, würde der Klick auf die Abbrechen-Schaltfläche des Speichern unter-Dialogfensters einen Laufzeitfehler auslösen.

Public Sub DokumentNeuSpeichern()
  On Error Resume Next
  Documents.Add.Save
End Sub

Zum Seitenanfang

 


Laufzeitfehler analysieren

Mit Hilfe der On Error-Anweisung und des Err-Objektes können Sie auffangbare Fehler testen und darauf reagieren.

Die Err-Funktion

Alle Fehlerinformationen werden im sogenannten ErrObject-Objekt zusammengefasst. Dieses Objekt wird von der Err-Funktion zurückgegeben. Dies sind die wichtigsten Eigenschaften des ErrObject-Objekts:

Eigenschaft Bedeutung
Number Enthält die Nummer des Laufzeitfehlers.
Description Enthält den Text der Fehlermeldung.
Source Enthält den Namen des Moduls, in dem der Laufzeitfehler auftrat.

Tabelle: Die wichtigsten Eigenschaften des ErrObject-Objektes

Bei den Methoden ist die Clear-Methode interessant. Mit Clear löschen Sie das Err-Objekt explizit, nachdem ein Fehler verarbeitet wurde. Dies ist zum Beispiel erforderlich, wenn Sie On Error Resume Next verwenden und allfällig aufgetretene Fehler erst später verarbeiten. Die Clear-Methode wird automatisch aufgerufen, sobald eine der folgenden Anweisungen ausgeführt wird:

Zum Seitenanfang

 


Laufzeitfehler behandeln und Programm fortführen

Der Resume-Befehl

<Beschreibung folgt>

 

Der Resume Next-Befehl

<Beschreibung folgt>

 

Der Resume <Sprungmarke>-Befehl

<Beschreibung folgt>

 

Programmfortführung mit dem Exit Sub-Befehl

<Beschreibung folgt>

 

Programmbeendigung mit dem End-Befehl

<Beschreibung folgt>

Zum Seitenanfang

 


Fehlerbehandlung ausschalten

Der On Error Goto 0-Befehl

<Beschreibung folgt>

 

Der On Error Goto -1-Befehl

<Beschreibung folgt>

Zum Seitenanfang

 


Laufzeitfehlercodes

Jeder Laufzeitfehler besitzt eine eindeutige Fehlernummer, welche im Programm mit Err.Number abgefragt werden kann. Die folgende Tabelle zeigt diejenigen Fehlercodes, denen Sie vermutlich am meisten begegnen werden.

Code Fehlermeldung
6 Überlauf
9 Index ausserhalb des gültigen Bereichs
11 Division durch Null
13 Typen unverträglich
94 Objektvariable oder With-Blockvariable nicht festgelegt

Tabelle: Fehlercodes der am häufigsten auftretenden Laufzeitfehler

Zum Seitenanfang

 


Auffangbare Fehler von Excel

Microsoft Excel verwendet, zusätzlich zu den von Visual Basic benutzten, folgende auffangbare Fehler. Sie können in Visual Basic auch mit Microsoft Excel-Zellfehlerwerten arbeiten.

Code

Fehlermeldung und -beschreibung

1000 Das '[Objektname]'-Objekt hat nicht die '[Eigenschaftsname]'-Eigenschaft.
Die Eigenschaft existiert für dieses Objekt nicht. Weitere Informationen finden Sie in der Hilfe unter dem Namen des Objekts.
1001 Das '[Objektname]'-Objekt hat nicht die '[Methodenname]'-Methode.
Die Methode existiert für dieses Objekt nicht. Weitere Informationen finden Sie in der Hilfe unter dem Namen des Objekts.
1002 Das erforderliche '[Argumentname]'-Argument fehlt.
Die Methode erfordert ein Argument, das nicht angegeben wurde. Fügen Sie dem Code das Argument hinzu. Um eine Liste der erforderlichen Argumente anzeigen zu lassen, suchen Sie in der Hilfe nach dem Namen der Methode.
1003 Ungültige Anzahl von Argumenten.
In der Methode wurde eine falsche Anzahl von Argumenten angegeben. Dies ist beispielsweise der Fall, wenn Sie Argumente durch ihre Position anstatt durch ihren Namen angegeben haben oder zu viele Argumente angegeben haben. Um die für die Methode gültigen Argumente anzeigen zu lassen, suchen Sie in der Hilfe nach dem Namen der Methode.
1004 Die '[Methodenname]'-Methode des '[Objektname]'-Objekts ist fehlerhaft.
Die Methode kann nicht auf das Objekt angewendet werden. Mögliche Gründe dafür können folgende sein:
  • Ein Argument enthält einen ungültigen Wert. Eine häufige Ursache dieses Problems ist der Zugriffsversuch auf ein Objekt, das nicht existiert (wenn Sie z.B. versuchen, Workbooks(5) zu verwenden, obwohl nur drei Arbeitsmappen geöffnet sind).
  • Die Methode kann im angewendeten Zusammenhang nicht verwendet werden. Bei einigen Methoden des Range-Objekts ist es beispielsweise erforderlich, dass der Bereich Daten enthält. Ist dies nicht der Fall, schlägt die Methode fehl.
  • Ein externer Fehler ist aufgetreten, wie z.B. ein Fehler beim Lese- oder Schreib-Zugriff auf eine Datei.

Weitere Informationen zu der Methode finden Sie in der Hilfe unter dem Namen der Methode.

1005 Die '[Eigenschaftsname]'-Eigenschaft des '[Objektname]'-Objekts kann nicht festgelegt werden.
Die Eigenschaft kann nicht geändert werden. Mögliche Gründe dafür können folgende sein:
  • Der in der Eigenschaft verwendete Wert ist ungültig (z. B. wenn Sie den Wert einer Eigenschaft als Zeichenfolge angeben, diese aber einen booleschen Wert erfordert).
  • Die Eigenschaft verfügt nur über Lese-Zugriff.

Weitere Informationen zu der Eigenschaft finden Sie in der Hilfe unter dem Namen der Eigenschaft.

1006 Die '[Eigenschaftsname]'-Eigenschaft des '[Objektname]'-Objekts kann nicht zugeordnet werden.
Die Eigenschaft kann nicht gelesen werden. Ein möglicher Grund dafür ist, dass die Eigenschaft im angewendeten Kontext nicht verwendet werden kann. Der Code ActiveChart.Legend.Font.Color = RGB(255, 0, 0) verursacht beispielsweise einen Fehler, wenn das aktive Diagramm keine Legende enthält.

Weitere Informationen zu der Eigenschaft finden Sie in der Hilfe unter dem Namen der Eigenschaft.

Zum Seitenanfang


Laufzeitfehler

Ein Fehler, der während der Ausführung von Code auftreten kann. Ein Laufzeitfehler tritt auf, wenn eine Anweisung versucht, eine ungültige Operation auszuführen.

Fehlernummer

Eine ganze Zahl im Bereich von 0 - 65'535, die der Einstellung der Number-Eigenschaft des Err-Objekts entspricht. Wird die Fehlernummer mit der Einstellung der Name-Eigenschaft des Err-Objekts kombiniert, stellt diese Zahl eine spezielle Fehlermeldung dar.

Funktion: Error[(Fehlernummer)]

Das optionale Argument Fehlernummer kann eine beliebige gültige Fehlernummer sein. Wenn Fehlernummer eine gültige Fehlernummer ist, die nicht definiert ist, gibt Error die Zeichenfolge "Anwendungs- oder objektdefinierter Fehler" zurück. Wenn Fehlernummer ungültig ist, tritt ein Fehler auf. Wenn Fehlernummer nicht angegeben wird, wird die Meldung zurückgegeben, die dem zuletzt aufgetretenen Laufzeitfehler entspricht. Wenn kein Laufzeitfehler aufgetreten ist oder Fehlernummer den Wert 0 hat, gibt Error eine Null-Zeichenfolge ("") zurück.

Zum Seitenanfang

 


Laufzeitfehler innerhalb der Fehlerbehandlungsroutine abfangen

On Error Goto -1

 

Zum Seitenanfang

 


Zeilennummer des Laufzeitfehlers abfragen

Erl

 

Zum Seitenanfang

 


Excel-Fehlerwerte unterdrücken

XL2000: How to Programmatically Suppress an Error Value Returned by a Formula
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213387

Zum Seitenanfang

 


Fehler von API-Funktionen auswerten

System errors during calls to dynamic-link libraries (DLL) do not raise exceptions and cannot be trapped with Visual Basic error trapping. When calling DLL functions, you should check each return value for success or failure (according to the API specifications), and in the event of a failure, check the value in the Err object's LastDLLError property.

Zum Seitenanfang

 


Makro-Unterbrechung durch den Benutzer verhindern

Application.Interactive = False

True, wenn sich Microsoft Excel im interaktiven Modus befindet. In der Regel ist diese Eigenschaft True.

Setzen Sie diese Eigenschaft auf False, so wird von Microsoft Excel jegliche Eingabe von Tastatur oder Maus blockiert (ausgenommen hiervon sind Eingaben in Dialogfelder, die aus Ihrem Code aufgerufen werden). Eine Blockierung der Benutzereingabe verhindert eine Störung des Makros, wenn Microsoft Excel Objekte während des Ablaufs verschoben oder aktiviert werden.

Zum Seitenanfang

 


Excel 2002: Das ErrorCheckingOptions-Objekt

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbaxl10/html/xlobjErrorCheckingOptions.asp

 

Zum Seitenanfang

 


Weitere Informationsquellen

OFFICE: How to Use On Error to Handle Errors in a Macro
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q141571

OFFICE: Error Trapping with Visual Basic for Applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q146864

OFFICE: An Explanation of Trappable Errors in Visual Basic for Applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142138

VBA/VB: Trappable Errors
http://msdn.microsoft.com/library/en-us/vb98/html/idxRealMsgTrap.asp

OFFICE: Overview of Visual Basic Editor Debugging Tools
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q165517

OFFICE: Translating Automation Errors for VB/VBA
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q186063

XL2002: Articles About Troubleshooting Errors in Worksheets
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q293412

XL2000: How to Programmatically Suppress an Error Value Returned by a Formula
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q213387

Zum Seitenanfang

WB01727_.gif (1537 Byte)

Haben Sie Fragen, Anregungen oder einen Fehler entdeckt?
Mail senden an philipp_von_wartburg@yahoo.de

Zuletzt aktualisiert am 27.01.2006 / 21:30 Uhr
© 2002-2006 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten