Poniżej zajmiemy się sytuacjami, w których błąd już się pojawił.
Błędy podczas projektowania
Najprostszy i najczęstszy błąd to zwykła literówka. VBE podczas pisania kodu sprawdza czy wszystkie pisane instrukcje są rozpoznawalne. Wszystkie słowa kluczowe są domyślnie kolorowane na niebiesko. Na tym etapie nie są jeszcze sprawdzane funkcje i nazwy zmiennych.
Jeżeli składnia nie będzie odpowiadać VBE, linia zostanie zaznaczona na czerwono, dodatkowo domyślnie pojawi się msgbox z odpowiednią informacją.
Szybko okazuje się, że ten MsgBox jest bardzo irytujący i jeżeli jeszcze go nie wyłączyłeś to można to zrobić w Tools/Options/Auto Syntax Check. Po wyłączeniu tej opcji nieprawidłowe linie wciąż będą się zaznaczać na czerwono, jednak będziemy mogli łatwo przerwać pisanie linii kodu (na przykład, żeby zadeklarować jakąś zmienną).
Błędy podczas uruchamiania
Podczas uruchamiania programu sprawdzane są nazwy wszystkich procedur. Jeżeli gdzieś w kodzie napiszemy funkcję, która nie jest ani wbudowana, ani napisana przez nas to pojawi się ostrzeżenie i uruchamianie zatrzyma się na nazwie uruchamianej procedury.
Option Explicit
Jeżeli chcemy, żeby w tym momencie Excel sprawdzał także poprawność zmiennych, należy na początku modułu napisać instrukcję Option Explicit. Jest do absolutnie kluczowa rzecz, o czym napiszę za chwilę. Jeżeli chcemy, żeby ta instrukcja pojawiała się automatycznie możemy włączyć: Tools/Options/require Variable Declaration i bezwględnie każdy to powinien zrobić.
Po włączeniu tej opcji każda zmienna / stała musi być
zadeklarowana przy pomocy instrukcji odpowiednio Dim lub Const, zanim zostanie użyta. Odpowiedni komunikat pojawi się jeżeli użyjemy zmiennej nie zadeklarowanej.
Co się stanie, jeżeli nie włączymy tej opcji? Nie musimy deklarować żadnej zmiennej. Odpowiednie miejsce w pamięci zostanie dla niej zajęte w momencie pierwszego użycia i przyjmie typ Variant. Na pierwszy rzut oka może być to wygodne. Jednak:
- Tracimy kontrolę nad typami zmiennych.
- Przede wszystkim: Narażamy się na błędy związane z literówkami
Spójrzmy na poniższy kod, option explicit nie zostało użyte. Nie musiałem deklarować zmiennej text.
|
Sub analiza() Text = "ala ma kota" MsgBox tekst End Sub |
Przy braku Option Explicit powyższy kod wykona się, jednak nic nie pojawi się w okienku MsgBox ponieważ zostaną utworzone dwie różne zmienne: Text i tekst. Przy włączonym zabezpieczeniu VBE ostrzeże nas, że nie zadeklarowaliśmy zmiennej Text, a chcemy z nią cos robić.
Dla mnie Option Explicit ma dodatkową wartość. Zawsze nazywam zmienne używając dużych liter. Następnie piszę zmienne używając tylko małych liter. Jeżeli napisałem zmienną prawidłowo, VBE automatycznie zmienia małe litery na duże zgodnie z definicją. Wiem wtedy, że wpisałem zmienną prawidłowo.
O znaczeniu gc w nazwie opowiem w następnej części kursu.
Błędy podczas wykonywania
Wszelkie błędy uniemożliwiające uruchomienie zostały już usunięte, zajmijmy się więc błędami podczas samego działania programu. Są to błędy, które zwykle przerywają działanie programu.
Powyższa instrukcja zaznacza następny arkusz. Przerywa działanie programu i pokazuje błąd, jeżeli aktualnie zaznaczony arkusz jest już ostatnim (brak następnego do zaznaczenia). Żaden kod więcej się nie wykona.
Przy pomocy poniższej instrukcji, możemy kontynuować wykonanie i zdecydować co się będzie działo w przypadku błędu.
On Error
Powyższa instrukcja występuje w trzech wariantach:
Po etykiecie musi być zawsze napisany dwukropek. Istotne jest, żeby przed etykietą wstawić Exit Sub. Inaczej nasz kod obsługi błędu wykona się nawet, jeżeli błąd nie nastąpi (spróbuj sam uruchomić ten program bez Exit Sub).
W każdej chwili mamy dostęp do obiektu Err, który zawiera szczegóły problemu. Dzięki temu możemy napisać bardziej ogólną procedurę obsługi. Interesują nas szczególne atrybuty Err.Number i Err.Description. Err.number jest równy zero, dopóki nie zajdzie błąd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Sub zmiana() On Error GoTo ErrHandler ActiveSheet.Next.Select Exit Sub ErrHandler: If Err.Number = 91 Then MsgBox "Nie ma następnego arkusza." Else 'inny błąd MsgBox "Wystąpił błąd nr: " & Err.Number & Chr(10) & _ Err.Description End If Err.Clear End Sub |
On Error Resume Next sprawia, że błędy są ignorowane. W przypadku błędu obiekt Err jest wypełniany i system zaczyna wykonywać następną instrukcję. Przejmujemy w ten sposób całkowitą kontrolę nad wykonywaniem programu i musimy zachować szczególną ostrożność. W ten sposób możemy nawet świadomie wywoływać błędy, spójrzmy na poniższy kod:
|
Option Explicit Const gc_FirstSheet As Integer = 1 Sub zmiana() If ActiveSheet.Index = Sheets.Count Then Sheets(gc_FirstSheet).Select Else ActiveSheet.Next.Select End If End Sub |
Zaznaczany jest następny arkusz, lub pierwszy, jeżeli numer aktualnie zaznaczonego arkusza jest równy liczbie wszystkich arkuszy (czyli zaznaczony już jest ostatni).
Ten sam efekt możemy uzyskać przy pomocy obsługi błędów.
|
Option Explicit Const gc_FirstSheet As Integer = 1 Sub zmiana() On Error Resume Next ActiveSheet.Next.Select If Err.Number <> 0 Then Sheets(gc_FirstSheet).Select Err.Clear End If On Error GoTo 0 End Sub |
Metoda Err.Clear czyści zawartość obiektu Err, kiedy już się uporamy z obsługą błędu.
On Error GoTo 0 przywraca standardową obsługę błędów przez system.
Osobiście mówię, że On Error Goto Etykieta włącza obsługę błędów, (mając na myśli obsługę przez użytkownika) często jednak mówi się też, że ta instrukcja wyłącza obsługę błędów (mając na myśli obsługę przez system). Należy o tym pamiętać rozmawiając z innymi programistami.
Błędy logiczne
Absolutnie największą zmorą programistów są błędy logiczne. Nie powodują one żadnych komunikatów. Kod błędny logicznie zwraca wartości, jednak efekt ostateczny działania programu jest nieprawidłowy z punktu widzenia projektu programu.
Zmaganie z tego typu błędami wymaga doświadczenia i na pewno pomaga debagowanie, o którym napiszę wkrótce, oraz stosowanie
dobrych praktyk pisania kodu.
Subskrybuj RSS, lub polub blog na Facebooku aby otrzymywać najnowsze informacje o rozwoju kursu.
Zapraszam do zadawania pytań w komentarzach.
Comments 2
Brakuje linka do kolejnej części kursu 🙂
Dziękuję Panie Adrianie. Rzeczywiście coś się pomieszało na pewnym etapie. Już jest poprawione.