Ich finde, dass Folgendes am besten funktioniert, der als zentraler Ansatz zur Fehlerbehandlung bezeichnet wird.
Leistungen
Sie haben zwei Möglichkeiten, Ihre Anwendung auszuführen : Debug und Produktion . Im Debug- Modus stoppt der Code bei jedem unerwarteten Fehler und ermöglicht Ihnen ein einfaches Debuggen, indem Sie durch zweimaliges Drücken von F8 zu der Zeile springen, in der er aufgetreten ist. Im Produktionsmodus wird dem Benutzer eine aussagekräftige Fehlermeldung angezeigt.
Sie können absichtliche Fehler wie diesen auslösen, wodurch die Ausführung des Codes mit einer Nachricht an den Benutzer gestoppt wird:
Err.Raise vbObjectError, gsNO_DEBUG, "Some meaningful error message to the user"
Err.Raise vbObjectError, gsUSER_MESSAGE, "Some meaningful non-error message to the user"
Err.Raise vbObjectError, gsSILENT
Implementierung
Sie müssen alle Unterprogramme und Funktionen mit einer signifikanten Menge an Code mit den folgenden Kopf- und Fußzeilen "umschließen" und dabei sicherstellen, dass Sie ehCallTypeEntryPoint
alle Ihre Einstiegspunkte angeben . Beachten Sie auch die msModule
Konstante, die in alle Module eingefügt werden muss.
Option Explicit
Const msModule As String = "<Your Module Name>"
Public Sub AnEntryPoint()
Const sSOURCE As String = "AnEntryPoint"
On Error GoTo ErrorHandler
ErrorExit:
Exit Sub
ErrorHandler:
If CentralErrorHandler(Err, ThisWorkbook, msModule, sSOURCE, ehCallTypeEntryPoint) Then
Stop
Resume
Else
Resume ErrorExit
End If
End Sub
Sub AnyOtherSub()
Const sSOURCE As String = "AnyOtherSub"
On Error GoTo ErrorHandler
ErrorExit:
Exit Sub
ErrorHandler:
If CentralErrorHandler(Err, ThisWorkbook, msModule, sSOURCE) Then
Stop
Resume
Else
Resume ErrorExit
End If
End Sub
Der Inhalt des zentralen Fehlerbehandlungsmoduls ist folgender:
Option Explicit
Option Private Module
Private Const msModule As String = "MErrorHandler"
Public Const gsAPP_NAME As String = "<You Application Name>"
Public Const gsSILENT As String = "UserCancel"
Public Const gsNO_DEBUG As String = "NoDebug"
Public Const gsUSER_MESSAGE As String = "UserMessage"
Private Const msDEBUG_MODE_COMPANY = "<Your Company>"
Private Const msDEBUG_MODE_SECTION = "<Your Team>"
Private Const msDEBUG_MODE_VALUE = "DEBUG_MODE"
Public Enum ECallType
ehCallTypeRegular = 0
ehCallTypeEntryPoint
End Enum
Public Function DebugMode() As Boolean
DebugMode = CBool(GetSetting(msDEBUG_MODE_COMPANY, msDEBUG_MODE_SECTION, msDEBUG_MODE_VALUE, 0))
End Function
Public Sub SetDebugMode(Optional bMode As Boolean = True)
SaveSetting msDEBUG_MODE_COMPANY, msDEBUG_MODE_SECTION, msDEBUG_MODE_VALUE, IIf(bMode, 1, 0)
End Sub
Public Function CentralErrorHandler(ErrObj As ErrObject, Wbk As Workbook, ByVal sModule As String, ByVal sSOURCE As String, _
Optional enCallType As ECallType = ehCallTypeRegular, Optional ByVal bRethrowError As Boolean = True) As Boolean
Static ssModule As String, ssSource As String
If Len(ssModule) = 0 And Len(ssSource) = 0 Then
ssModule = sModule
ssSource = sSOURCE
End If
CentralErrorHandler = DebugMode And ErrObj.Source <> gsNO_DEBUG And ErrObj.Source <> gsUSER_MESSAGE And ErrObj.Source <> gsSILENT
If CentralErrorHandler Then
Debug.Print "#Err: " & Err.Description
ElseIf enCallType = ehCallTypeEntryPoint Then
If ErrObj.Source <> gsSILENT Then
Dim sMsg As String: sMsg = ErrObj.Description
If ErrObj.Source <> gsNO_DEBUG And ErrObj.Source <> gsUSER_MESSAGE Then sMsg = "Unexpected VBA error in workbook '" & Wbk.Name & "', module '" & ssModule & "', call '" & ssSource & "':" & vbCrLf & vbCrLf & sMsg
MsgBox sMsg, vbOKOnly + IIf(ErrObj.Source = gsUSER_MESSAGE, vbInformation, vbCritical), gsAPP_NAME
End If
ElseIf bRethrowError Then
Err.Raise ErrObj.Number, ErrObj.Source, ErrObj.Description
End If
End Function
Führen Sie im Sofortfenster Folgendes aus, um sich in den Debug- Modus zu versetzen :
SetDebugMode True