Fehlerbehandlung VBA
Als zusätzliches Feature wird unterschieden zwischen "erwarteten" und anderen Fehlern. Erwartet sind Anwenderfehler udgl., die der Programmierer selbst mit Err.Raise wirft bzw. die in der Fehlerroutine speziell abgefangen werden. Erwartete Fehler zeigen nur den "geworfenen" Fehlertext ohne Angabe von Modul(Form/Report) und Control.
Hierzu gibt es zunächst die Prozedur ErrorBox.
Sie wird in einen geeigneten Modul gelegt (Allgemein oder Common könnte passen).
Public Sub Errorbox(Optional erwarteterFehlerText As String = "")
Dim n As String: n = Screen.ActiveForm.Name
Dim c As String: c = Screen.ActiveControl.Name
Dim s As String
If Err.Number = 10000 Then erwarteterFehlerText = Err.Description
If erwarteterFehlerText = "" Then
s = "Verzeihung! Das hätte nicht passieren dürfen." & vbCrLf & vbCrLf
s = s & "Fehler " & Err.Number & " in " & n & "." & c & vbCrLf & Err.Description
Else
s = erwarteterFehlerText
End If
If erwarteterFehlerText = "" Then
s = s & vbCrLf & vbCrLf _
& "Wenn Sie diesen Fehler nicht verstehen, informieren Sie bitte den Programmierer. Danke."
End If
MsgBox s, vbCritical + vbOKOnly, "Fehlermitteilung"
End Sub
Normale Anwendung in jeglicher Funktion/Prozedur

Private Sub irgendwas(...)
On Error GoTo Er
... 'der Code
Ex: Exit Sub
Er: Errorbox
Resume Ex
End Sub
Das Resume Ex kann auch noch weggelassen werden, wenn hinter Ex: nicht weitere Operationen stehen, die auch nach dem Fehlerfall ausgeführt werden sollen.
Übrigens: Den verwirrenden Quatsch, den Marken immer noch den Prozedurnamen beizufügen, kann man lassen. Ex: und Er: sind lokal und können immer wieder in jeglicher Prozedur verwendet werden.
Wie werfe ich irgendwo in meinem Code einen Anwendungsfehler?

... 'Code
Err.Raise 10000, , "Die Liste ist zum kompletten Markieren zu groß"
... 'Code
Die Fehlernummer 10000 ist reserviert und wird die Errorbox veranlassen, außer der Meldung keine "technischen" Informationen zu zeigen. Man kann natürlich auch einen Fehler mit einer anderen Nummer werfen, um den Ort mit angezeigt zu bekommen.
Übrigens: Zwar ist mir die 10000 verboten, aber wer kennt den Fehler, den Microsoft unter dieser Nr. meldet?
Wie verwende ich ErrorBox in der Fehlerroutine?

... 'Code
Ex: ...
Er:
If Err.Number = 5174 Then
Errorbox "Beim Öffnen des Worddokuments trat ein Fehler auf." _
& vbCrLf & "Das Dokument kann nicht gefunden werden."
Resume Ex
End If
'sonstige Fehler
Errorbox
Resume Ex
End Sub
Übrigens: Leider habe ich keinen Trick gefunden, den Namen der Prozedur zu ermitteln, aus welcher ErrorBox gerufen wird (und in welcher ja auch der Methodenname enthalten ist). Sollte einem der Leser dazu was einfallen, wird ihm die ganze VBA-Gemeinde dankbar sein.






