VBA-Programmierung in Microsoft Excel

Tutorial: Excel-Beispiele

VBA-Begriff: On Error-Anweisung

Aktiviert eine Fehlerbehandlungsroutine und gibt deren Position innerhalb einer Prozedur an. Die Anweisung kann auch zum Deaktivieren einer Fehlerbehandlungsroutine verwendet werden.

Syntax

On Error GoTo Zeile

On Error Resume Next

On Error GoTo 0

Sie können die On Error-Anweisung mit folgender Syntax verwenden:

Anweisung Beschreibung
On Error GoTo Zeile Aktiviert die Fehlerbehandlungsroutine, die in der Zeile beginnt, welche im erforderlichen Argument Zeile festgelegt wurde. Das Argument Zeile ist eine beliebige Zeilenmarke oder Zeilennummer. Tritt danach ein Laufzeitfehler auf, so verzweigt die Programmsteuerung zu Zeile und aktiviert so die Fehlerbehandlungsroutine. Die angegebene Zeile muß sich in derselben Prozedur wie die On Error-Anweisung befinden, andernfalls tritt ein Fehler zur Kompilierungszeit auf.
On Error Resume Next Legt fest, daß das Programm die Ausführung beim Auftreten eines Laufzeitfehlers mit der Anweisung fortsetzt, die auf die fehlerverursachende Anweisung folgt. Sie sollten diese Form anstelle von On Error GoTo verwenden, wenn Sie auf Objekte zugreifen.
On Error GoTo 0 Deaktiviert alle aktivierten Fehlerbehandlungsroutinen in der aktuellen Prozedur.

Bemerkungen

Wenn Sie keine On Error-Anweisung verwenden, führt jeder Laufzeitfehler zur Anzeige einer Fehlermeldung und zum Beenden des Programms.

Eine "aktivierte" Fehlerbehandlungsroutine ist eine Routine, die durch eine On Error-Anweisung "eingeschaltet" wurde. Eine "aktive" Fehlerbehandlungsroutine ist eine aktivierte Behandlungsroutine, die momentan einen Fehler verarbeitet. Wenn ein Fehler auftritt, während eine Fehlerbehandlungsroutine aktiv ist (also zwischen dem Auftreten des Fehlers und der Ausführung einer Resume-, Exit Sub-, Exit Function- oder Exit Property-Anweisung), kann die Fehlerbehandlungsroutine den Fehler nicht bearbeiten. Das Programm wird in der aufrufenden Prozedur fortgesetzt. Falls für die aufrufende Prozedur eine Fehlerbehandlungsroutine verfügbar ist, wird diese aktiviert, um den Fehler zu verarbeiten. Ist auch diese Fehlerbehandlungsroutine bereits aktiv, so wird die Steuerung so lange an die früheren aufrufenden Prozeduren weitergegeben, bis eine aktivierte Fehlerbehandlungsroutine gefunden wird, die jedoch momentan nicht aktiv ist. Wenn keine aktivierte Fehlerbehandlungsroutine im nichtaktiven Zustand gefunden wird, wird das Programm durch den Fehler an der Stelle beendet, an der der Fehler tatsächlich aufgetreten ist. Sobald die Fehlerbehandlungsroutine die Steuerung an die aufrufende Prozedur zurückgibt, wird diese Prozedur zur aktuellen Prozedur. Nachdem ein Fehler von einer Fehlerbehandlungsroutine in einer beliebigen Prozedur verarbeitet wurde, setzt das Programm die Ausführung in der aktuellen Prozedur an der Stelle fort, die durch die Resume-Anweisung angegeben ist.

Anmerkung Eine Fehlerbehandlungsroutine ist keine Sub- oder Function-Prozedur, sondern ein durch eine Zeilenmarke oder Zeilennummer gekennzeichneter Code-Bereich.

Fehlerbehandlungsroutinen verwenden den Wert in der Number-Eigenschaft des Err-Objekts, um die Fehlerursache zu bestimmen. Die Fehlerbehandlungsroutine sollte die wichtigen Eigenschaftswerte des Err-Objekts überprüfen oder speichern, bevor ein anderer Fehler auftreten kann oder bevor eine Prozedur, die einen Fehler auslösen kann, aufgerufen wird. Die Werte in den Eigenschaften des Err-Objekts geben nur den zuletzt aufgetretenen Fehler wieder. Die Fehlermeldung für Err.Number ist in Err.Description enthalten.

Das Programm setzt nach einer On Error Resume Next-Anweisung die Ausführung mit der Anweisung fort, die unmittelbar auf die Anweisung folgt, die den Laufzeitfehler verursacht hat, oder mit der Anweisung, die unmittelbar auf den letzten Aufruf einer anderen Prozedur folgt, in der die On Error Resume Next-Anweisung enthalten ist. Dadurch kann das Programm die Ausführung trotz eines Laufzeitfehlers fortsetzen, und Sie können die Fehlerbehandlungsroutine direkt an der Stelle durchführen, an der die fehlerverursachende Anweisung auftritt, anstatt an eine andere Stelle innerhalb der Prozedur zu verzweigen. Eine On Error Resume Next-Anweisung wird inaktiv, wenn eine andere Prozedur aufgerufen wird. Sie sollten daher eine On Error Resume Next-Anweisung in jeder aufgerufenen Routine ausführen, wenn Sie die Fehlerbehandlung direkt in der jeweiligen Routine durchführen möchten.

Anmerkung Die Konstruktion On Error Resume Next ist möglicherweise besser geeignet als On Error GoTo, wenn Sie Fehler verarbeiten, die beim Zugriff auf andere Objekte ausgelöst wurden. Wenn Sie Err nach jeder Interaktion mit einem Objekt überprüfen, wird jederzeit eindeutig festgestellt, auf welches Objekt der Code zugegriffen hat. Sie wissen daher, welches Objekt den Fehler-Code in Err.Number gespeichert hat und welches (in Err.Source angegebene) Objekt den Fehler ursprünglich ausgelöst hat.

On Error GoTo 0 deaktiviert die Fehlerbehandlung in der aktuellen Prozedur. Dabei wird die Zeile 0 nicht als Startpunkt des Fehlerbehandlungs-Codes interpretiert (auch dann nicht, wenn die Prozedur eine Zeile 0 enthält). Eine Fehlerbehandlungsroutine ohne eine On Error GoTo 0-Anweisung wird beim Verlassen einer Prozedur automatisch deaktiviert.

Damit der Fehlerbehandlungs-Code nicht ausgeführt wird, wenn kein Fehler aufgetreten ist, können Sie eine geeignete Exit Sub-, Exit Function- oder Exit Property-Anweisung unmittelbar vor die Fehlerbehandlungsroutine schreiben, wie im folgenden Beispiel:

Sub InitialisiereMatrix(Var1, Var2, Var3, Var4)
    On Error GoTo ErrorHandler
    . . .
    Exit Sub
ErrorHandler:
    . . .
    Resume Next
End Sub

In diesem Beispiel steht der Fehlerbehandlungs-Code hinter der Exit Sub-Anweisung und vor der End Sub-Anweisung, um ihn vom normalen Programmablauf in der Prozedur zu trennen. Sie können Fehlerbehandlungs-Code ansonsten beliebig innerhalb einer Prozedur positionieren.

Nichtaufgefangene Fehler in Objekten werden zur steuernden Anwendung zurückgegeben, wenn das Objekt als ausführbare Datei aktiviert ist. Innerhalb der Entwicklungsumgebung werden die nichtaufgefangenen Fehler nur zur steuernden Anwendung zurückgegeben, wenn die entsprechenden Optionen aktiviert sind. Um zu erfahren, welche Optionen während der Fehlerbehandlung aktiviert sein sollten, wie sie aktiviert werden und ob die Host-Anwendung Klassen erstellen kann, lesen Sie die Dokumentation Ihrer Host-Anwendung.

Wenn Sie ein Objekt erstellen, das auf andere Objekte zugreift, sollten Sie versuchen, die aus diesen Objekten unbehandelt zurückgegebenen Fehler zu verarbeiten. Wenn Sie derartige Fehler nicht verarbeiten können, sollten Sie den Fehler-Code in Err.Number zuerst auf einen Ihrer eigenen Fehler festlegen und dann diese Fehler an die Routine zurückgeben, die Ihr Objekt aufgerufen hat. Sie sollten Ihren Fehler angeben, indem Sie Ihren Fehler-Code zur Konstanten vbObjectError addieren. Wenn Ihr Fehler-Code zum Beispiel den Wert 1052 hat, weisen Sie ihn wie folgt zu:

Err.Number = vbObjectError + 1052

Anmerkung Systemfehler beim Aufrufen von Dynamic Link Libraries (DLLs) oder Macintosh-Code-Ressourcen lösen keine Ausnahmen (Exceptions) aus, d.h., sie können mit der Fehlerbehandlung von Visual Basic nicht aufgefangen werden. Beim Aufrufen von DLL-Funktionen sollten Sie jeden Rückgabewert daraufhin überprüfen, ob der Aufruf erfolgreich war (entsprechend den API-Spezifikationen). Überprüfen Sie anderenfalls den Wert der LastDLLError-Eigenschaft des Err-Objekts.LastDLLError gibt auf dem Macintosh immer Null zurück.