Globalna obsługa błędów

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

1 myśl w temacie “Globalna obsługa błędów

  1. Dobrze jest jeszcze dodać zmienną ErrOpis, która przy błędzie będzie zapisywała err.description.
    Takie same rozwiązanie jak ErlLine.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.