| Laufzeitfehler und Fehlerbehandlung | Home |
![]()
| 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 |
![]()
Fehlerbehandlungs-Optionen der Entwicklungsumgebung
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)?
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.
|
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.

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.

Abbildung: Laufzeitfehler-Meldung (Beispiel
Laufzeitfehler 9)
| 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. |

Abbildung: Optionen-Dialogfenster mit
Fehlerbehandlungs-Einstellungen (Registerkarte Allgemein)
Neben Laufzeitfehlern gibt es andere Fehler, wie zum Beispiel Eingabefehler, Syntaxfehler und Programmlogikfehler.
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".
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
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.
| 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() |
| 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). |

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.
Beispiel
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.

Abbildung: "Unvollständiger" Programmcode, da die Exit
Sub-Anweisung fehlt
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
| 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. |
<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>
<Beschreibung folgt>
<Beschreibung folgt>
| 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
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:
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:
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. |
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.
Laufzeitfehler innerhalb der Fehlerbehandlungsroutine abfangen
On Error Goto -1
Zeilennummer des Laufzeitfehlers abfragen
Erl
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
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.
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.
Excel 2002: Das ErrorCheckingOptions-Objekt
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
![]()
Zuletzt aktualisiert am
27.01.2006 / 21:30 Uhr
© 2002-2006 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten