Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Tutorials

Fehlerbehandlung (1) -On Error Goto und Err

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 7 Folgen 1 2 3 4 5 6 7 Sie sind in Folge:2
Wichtiger Hinweis:
Dies ist ein Teil des Fehlerbehandlungs Tutorials.
Starten Sie unbedingt mit dem Anfang, also mit : Fehlerbehandlung (0) - Einführung

On Error Goto und Err

VBA stellt uns verschiedene Möglichkeiten zur Verfügung, auf abfangbare Laufzeitfehler zu reagieren.
Wenn wir dies tun, muss uns bewusst sein, dass für VBA damit der Fehler bearbeitet ist und wir frisch fröhlich unseren zusammengestrickten Code weiter ausführen lassen. Wir sind dafür verantwortlich, wie das Programm danach weiterarbeiten soll.

Aber beginnen wir mit einem einfachen Beispiel:
	
Public Sub Fehler0()
	Dim i As Long, k As Long
	i = 3 / k
End Sub
Klar - oder, dies produziert einen Fehler mit einer Meldung von VBA und fertig ist die Geschichte - ähh das Programm.
Sehr unschön für den Anwender und auch für unser Programm, sofern wir da noch mehr dahinter stehen haben.

Wir wollen dies nun ein klein wenig verändern:
	
Public Sub Fehler0()
	Dim i As Long, k As Long
	On Error GoTo Fehler
	i = 3 / k
	Exit Sub
	Fehler:
	MsgBox "Da war ein Fehler"
End Sub

Hier kontrollieren wir selbst den Fehler.
Aber schauen wir uns das im Einzelnen an:
On Error Goto Fehler:
Dies bedeutet für VBA, dass es bei einem Laufzeitfehler zu der Sprungmarke Fehler: gehen soll.
Eine Sprungmarke kann ich nennen wie ich will, solange sie den Regeln für Bezeichner gehorcht.
Also ich kann diese Timbuktu oder erowirööyöhh oder sonstwie nennen. Für die bessere Lesbarkeit sollte man aber deutliche Namen nehmen.

Der Bezeichner selbst wird in der Prozedur mit einem Doppelpunkt geschrieben.

Ist Ihnen das Exit Sub aufgefallen?
Dies ist ein ganz wichtiger Bestandteil unserer Error Behandlung.
Würde dieses fehlen, würde meine MsgBox ja immer auftauchen, auch wenn gar kein Fehler passiert ist.
(In einer Function habe ich natürlich ein Exit Function)


Zwischenstopp: Vernünftige Meldung und das Err Objekt
In unserem letztem Beispiel haben wir natürlich eine vollkommen verblödete Meldung ausgegeben.
Diese ist ungeheuer hilfreich. Der Anwender ruft uns an und sagt: Da war ein Fehler.
Klasse, da könnte er uns genauso sagen, gestern hat es geregnet.

Wichtig ist ganz klar, dass wir in Erfahrung bringen, was für ein Fehler, vielleicht noch die Fehlernummer dazu und wenn wir wirklich fleißig sind, auch noch die Prozedur (Dies lässt sich auch noch ausdehnen, aber dies überlasse ich dann den ganz ganz Fleißigen)

Wir änderen unser Beispiel ein wenig:

Public Sub Fehler0()
Dim i As Long, k As Long
On Error GoTo Fehler
i = 3 / k
Exit Sub
Fehler:
MsgBox "Fehler in Sub Fehler0" & vbCrLf & "Fehlernummer: " & Err.Number & _
	vbCrLf & "Fehlerbeschreibung: " & Err.Description
End Sub

Dies sieht doch schon ganz anders aus.
Aber was hat es mit dem Err.Number und Err.Description auf sich.
Nun ganz einfach, dieses Objekt stellt uns VBA zur Verfügung und damit kann ich auf die letzte Fehlernummer und Fehlerbeschreibung zugreifen.
Das Err Objekt kann noch mehr aber dies soll hier nicht das Thema sein.

On Error GoTo mehrfach

Public Sub Fehler0()
Dim i As Long, k As Long
On Error GoTo Fehler
i = 3 / 2
On Error GoTo WeitererFehler
i = 4 / k
Exit Sub
Fehler:
MsgBox "Fehler in Sub Fehler0 Erste Division" & vbCrLf _
 & "Fehlernummer: " & Err.Number & _
 vbCrLf & "Fehlerbeschreibung: " & Err.Description
Exit Sub
WeitererFehler:
MsgBox "Fehler in Sub Fehler0 Zweite Division" & _
 vbCrLf & "Fehlernummer: " & Err.Number & _
 vbCrLf & "Fehlerbeschreibung: " & Err.Description
End Sub
Selbstverständlich können wir innerhalb einer Routine auch mehrfache On Errors Anweisungen haben.
Wichtig ist dabei aber nicht zu vergessen, unsere Exits zwischen den einzelnen Sprungmarken zu haben!

Spielen Sie nun einen Moment damit rum und lesen Sie dann weiter.

On Error GoTo 0

Public Sub Fehler0()
Dim i As Long, k As Long
On Error GoTo Fehler
i = 3 / 2
On Error GoTo 0
i = 4 / k
Exit Sub
Fehler:
MsgBox "Fehler in Sub Fehler0 Erste Division" & vbCrLf _
 & "Fehlernummer: " & Err.Number & _
 vbCrLf & "Fehlerbeschreibung: " & Err.Description
End Sub
On Error GoTo 0 ist die Möglichkeit, die Fehlerbehandlung wieder auszuschalten.
Damit übernimmt VBA wieder das Kommando.
Dies ist gerade beim Entwickeln ungeheuer hilfreich, um bewusst das Programm abfliegen zu lassen.
Im fertigen Zustand sollte dies natürlich nicht mehr vorkommen, sondern wieder eine Fehlerbehandlung werden.



Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben
rechte seite