Od jakiegoś czasu szukałem w internecie oraz swoich projektach rozwiązania dla globalnej obsługi błędów – prawdopodobnie VBA nie przewiduje takiego rozwiązania. Dlatego też napisałem namiastkę globalnej obsługi błędów.
Kiedy piszę kod aplikacji staram się, aby w projekcie znajdował się główny kod z odnogami do innych procedur. Do kodu dodaje zmienną ErrorStatus, aby sprawdzać czy błąd pojawił się innych procedurach. Jeżeli zmienna ErrorStatus nie zostanie użyta i unikalne numery wierszy zostaną dodane do modułu – kiedy pojawi się błąd VBA zwróci linię błędu głównej procedury.
Przykład globalnej obsługi błędów:
' Ten prosty kod pokazuje jak działa globalna obsługa błędów w module/projekcie ' Numery wierszy są uniklane dla całego modułu ' Kiedy pojawia się błąd kod zwraca numer wiersza, nazwę modułu i procedury Public ErrorMessage, ErrorStatus, ErlLine, ModName, ProcName Public Sub MainMacro() Dim i, a, s As Long 1 On Error GoTo ErrorMessage 2 ModName = "Module1" 3 ProcName = "MainMacro" 4 i = 1 5 a = 2 6 Macro1 'przywoływanie innej procedury 7 If ErrorStatus = True Then 8 GoTo ErrorMessage 9 End If 10 Macro2 'przywoływanie innej procedury 11 If ErrorStatus = True Then 12 GoTo ErrorMessage 13 End If 14 s = 3 15 Exit Sub ErrorMessage: 16 If Erl <> 0 Then 17 Debug.Print "Code Line: " & Erl & Chr(10) & "Module: " & ModName & Chr(10) & "Procedure: " & ProcName 18 Else 19 Debug.Print "Code Line: " & ErlLine & Chr(10) & "Module: " & ModName & Chr(10) & "Procedure: " & ProcName 20 End If End Sub Private Sub Macro1() ' W tej procedurze nie ma błedów Dim i, a, x As Long 21 On Error GoTo ErrorMessage 22 ProcName = "Macro1" 23 i = 2 24 a = 2 25 x = i * a 26 Exit Sub ErrorMessage: 27 ErrorStatus = True 28 ErlLine = Erl End Sub Private Sub Macro2() ' W tej procedurze jest błąd Dim i, x As Long Dim a As String 29 On Error GoTo ErrorMessage 30 ProcName = "Macro2" 31 i = 2 32 a = "dd" 33 x = i * a 'mnożenie zmiennej long z string 34 Exit Sub ErrorMessage: 35 ErrorStatus = True 36 ErlLine = Erl End Sub
Dobrze jest jeszcze dodać zmienną ErrOpis, która przy błędzie będzie zapisywała err.description.
Takie same rozwiązanie jak ErlLine.