AW: Objekt_Error - Ereignis in UserForm
18.02.2008 14:24:09
fcs
Hallo Andreas,
bei mir sieht eine aufwendige Fehlerbehandlung beispielhaft etwa wie folgt aus. Dabei wird immer der Fehler in einer MsgBox angezeigt. Danach folgt dann die Fehlerauswertung via Select Case mit Code, der entweder den Fehler bereinigt, z.B. durch Usereingaben oder sonstige Anweisungen, oder gezielt eine als Private bzw. Public deklarierte Variable setzt, die dann ggf. in weiteren Prozeduren ausgewertet werden kann.
Zusätzlich setze ich ich an kritischen Stellen im Code eine Variable, so dass ich weiss/prüfen kann, in welchem Abschnitt einer Prozedur der Fehler aufgetreten ist.
Zum Testen der Fehlerroutinen: bewußt den Fehler einbauen (z.B. falsche Blattnamen, Variablentypen etc.), der geprüft werden soll.
Mit "On Error Resume Next" sollte man meiner Meinung nach sehr sparsam umgehen, da man nicht nachvollziehen kann (ausser bei schrittweiser Ausführung) wo ein Fehler auftritt und es gibt ggf. nur noch eine chaotisches Ergebnis. Besser ist es im Code an kritischen Stellen entsprechende Prüfungen auf korrekte Input-Daten einzubauen.
Gruß
Franz
Private boFehler as Boolean
Sub aatest()
'Variablendeklarationen etc
Dim Fehler As Integer, wks As Worksheet
On Error GoTo Fehlerbehandlung
Fehler = 1
'Code Teil 1
set wks = Worksheets("Tabelle21")
Fehler = 2
'Code Teil 2
Fehler = 3
'Code Teil 2
GoTo Ende
Fehlerbehandlung:
MsgBox "Fehler-Nr.: " & Err.Number & " ist aufgetreten!" & vbLf & vbLf & Err.Description
Select Case Err.Number
Case 1014
'Anweisungen zur Bereinigung des Fehlers
boFehler = True
Case Else
Select Case Fehler
Case 1
'Code zur Bereinigung des Fehlers
Resume 'Prozedur wird in der Zeile mit dem Fehler fortgesetzt
Case 2
'Code zur Bereinigung des Fehlers
Resume 'Prozedur wird in der Zeile mit dem Fehler fortgesetzt
Case 3
MsgBox "Nach Zeile Fehler = 3 ist der Fehler aufgetreten. Makro wird beendet!"
boFehler = True
GoTo Ende
End Select
End Select
Ende:
'Code, der beim Verlasen der Routine immer ausgeführt werden soll
Set wks = Nothing
Application.ScreenUpdating = True
End Sub