Obsługa błędów

W poniższym przykładzie może się okazać, że wystąpi jakiś błąd, który przerwie wykonywanie makra. Przykładowo chcemy skasować plik, który nie istnieje, albo drugi raz chcemy utworzyć folder, który już istnieje. Dlatego Warto jest włączyć obsługę błędów. Można to zrobić na dwa sposoby:

Sposób #1: Specjalny fragment kodu, który zostanie wykonany, gdy wystąpi błąd

Sub KasujPlik(Plik As String)
    On Error GoTo Err
    
    Kill (Plik)

Err_powrot:
    Exit Sub
Err:
    MsgBox "Nie mogłem skasować pliku" & Plik, vbExclamation

Resume Err_powrot

End Sub

Dwa słowa wyjaśnienia: w swoich makrach nigdy nie używam „na pałę” instrukcji Kill, gdyż błąd (np. brak uprawnień do danego folderu, podano błędną nazwę pliku etc.) mógłby niespodziewanie przerwać wykonanie makra. Piszę swoją procedurę do kasowania pliku, która zawiera instrukcję Kill, ale moja procedura posiada obsługę błędów.

W pierwszej linijce mówię, że jeśli wystąpi błąd to interpreter języka VBA ma przejść do etykiety Err (linia zaczynająca się od Err: ). Tam piszę własny kod obsługi błędu (np. wyświetlam użytkownikowi komunikat i kończe działanie programu, albo próbuję np. utworzyć plik który nie istnieje z wpisanymi domyślnymi wartościami, albo po prostu nic nie robię).

Natomiast jeśli błąd nie wystąpi (uda się skasować plik) to tuż przed etykietą Err znajduje sięinstrukcja Exit Sub która mówi, że w tym miejscu jest koniec tej procedury (interpreter języka VBA wraca do procedury nadrzędnej, która tę procedurę wykonała lub kończy działanie makra).

Dodatkowo w bloku Err: użyłem instrukcji Resume Err_powrot co oznacza, że po obsłużeniu błędu (wyświetleniu komunikatu z błędem) wrócimy do tej etykiety. Jest to zalecane rozwiązanie, gdyż bardzo często po wyświetleniu komunikatu z błędem chcemy jeszcze zakończyć pewne czynności (np. zamknąć otworzone wcześniej pliki, wyczyścić jakąś zmienną etc.)

Sposób #2: Ignorowanie wszystkich błędów (w danej procedurze)

Na początku procedury można dodać instrukcje On Error Resume Next. Procedura normalnie będzie się wykonywała a wszelkie błędy będą systematycznie ignorowane

Sub DemonstracjaIgnorowaniaBledow()
    On Error Resume Next
    
    '... tutaj jakieś instrukcje ....
    
    ' Skasuj plik (jeśli nie istnieje to błąd będzie zignorowany)
    Kill "c:\plik.txt"
    
    '... tutaj jakieś instrukcje ....
End Sub

Wróć do spisu treści