Ściągawka z błędami VBA
Błędy
OpisKod VBAW przypadku błędu - kod zatrzymania i błąd wyświetlaniaW przypadku błędu Przejdź do 0W przypadku błędu - pomiń błąd i kontynuuj działaniePrzy błędzie Wznów DalejW przypadku błędu - przejdź do wiersza kodu [Etykieta]W przypadku błędu Przejdź do [Etykieta]Czyści (resetuje) błądW przypadku błędu Przejdź do -1Pokaż numer błęduMsgBox Err.NumerPokaż opis błęduMsgBox Err.OpisFunkcja generowania własnego błęduBłąd.PodnieśZobacz więcej „Ściągawek” VBA i bezpłatne pliki PDF do pobrania
Obsługa błędów VBA
Obsługa błędów VBA odnosi się do procesu przewidywania, wykrywania i rozwiązywania błędów środowiska wykonawczego VBA. Proces obsługi błędów VBA następuje podczas pisania kodu, zanim wystąpią jakiekolwiek błędy.
Błędy wykonawcze VBA są błędami, które występują podczas wykonywania kodu. Przykłady błędów w czasie wykonywania to:
- Odwoływanie się do nieistniejącego skoroszytu, arkusza lub innego obiektu
- Nieprawidłowe dane np. odwoływanie się do komórki Excela zawierającej błąd
- Próba dzielenia przez zero
Oświadczenie o błędzie w VBA
Większość obsługi błędów VBA odbywa się za pomocą Komunikat o błędzie. Instrukcja On Error informuje VBA, co ma zrobić, jeśli napotka błąd. Znajdują się trzy O oświadczeniach o błędach:
- W przypadku błędu Przejdź do 0
- Przy błędzie Wznów Dalej
- W przypadku błędu Przejdź do Linia
W przypadku błędu Przejdź do 0
W przypadku błędu Przejdź do 0 to domyślne ustawienie VBA. Możesz przywrócić to ustawienie domyślne, dodając następujący wiersz kodu:
1 | W przypadku błędu Przejdź do 0 |
Gdy wystąpi błąd z W przypadku błędu Przejdź do 0, VBA przestanie wykonywać kod i wyświetli standardowe okno komunikatu o błędzie.
Często będziesz dodawać W przypadku błędu Przejdź do 0 po dodaniu Przy błędzie Wznów Dalej obsługa błędów (następna sekcja):
123456789 | Błąd podrzędny Przejdź do 0()Przy błędzie Wznów DalejActiveSheet.Shapes("Przycisk_Start").UsuńW przypadku błędu Przejdź do 0„Uruchom więcej kodu”Napis końcowy |
Przy błędzie Wznów Dalej
Przy błędzie Wznów Dalej mówi VBA, aby pominął wszystkie wiersze kodu zawierające błędy i przeszedł do następnego wiersza.
1 | Przy błędzie Wznów Dalej |
Notatka: Przy błędzie Wznów Dalej nie naprawia błędu ani nie rozwiązuje go w inny sposób. Po prostu mówi VBA, aby postępował tak, jakby wiersz kodu zawierający błąd nie istniał. Niewłaściwe użycie Przy błędzie Wznów Dalej może spowodować niezamierzone konsekwencje.
Świetny czas w użyciu Przy błędzie Wznów Dalej jest podczas pracy z obiektami, które mogą, ale nie muszą istnieć. Na przykład chcesz napisać kod, który usunie kształt, ale jeśli uruchomisz kod, gdy kształt jest już usunięty, VBA zgłosi błąd. Zamiast tego możesz użyć Przy błędzie Wznów Dalej aby powiedzieć VBA, aby usunął kształt, jeśli istnieje.
123 | Przy błędzie Wznów DalejActiveSheet.Shapes("Przycisk_Start").UsuńW przypadku błędu Przejdź do 0 |
Zauważ, że dodaliśmy W przypadku błędu Przejdź do 0 po wierszu kodu zawierającym potencjalny błąd. Spowoduje to zresetowanie obsługi błędów.
W następnej sekcji pokażemy, jak sprawdzić, czy wystąpił błąd za pomocą Numer błędu, dając Ci bardziej zaawansowane opcje obsługi błędów…
Err.Number, Err.Clear i wyłapywanie błędów
Zamiast po prostu przeskakiwać wiersz zawierający błąd, możemy go złapać za pomocą Przy błędzie Wznów Dalej oraz Numer błędu.
Numer błędu zwraca numer błędu odpowiadający rodzajowi wykrytego błędu. Jeśli nie ma błędu, Numer błędu = 0.
Na przykład ta procedura zwróci „11”, ponieważ występujący błąd to: Błąd wykonania „11”.
1234567 | Numer błędu podrzędnego_ex()Przy błędzie Wznów DalejAktywnaKomórka.Wartość = 2 / 0MsgBox Err.NumerNapis końcowy |
Obsługa błędów z Err.Number
Prawdziwa moc Numer błędu polega na możliwości wykrycia, czy wystąpił błąd (Numer błędu 0). W poniższym przykładzie stworzyliśmy funkcję, która sprawdzi, czy arkusz istnieje, używając Err.Number.
12345678910111213141516171819 | Podtest WS()MsgBox DoesWSExist("test")Napis końcowyFunkcja DoesWSExist(wsName As String) jako BooleanDim ws As WorksheetPrzy błędzie Wznów DalejUstaw ws = Arkusze(wsName)„Jeśli błąd WS nie istnieje”Jeśli błąd numer 0 WtedyCzy WSistnieje = FałszW przeciwnym razieCzy WSistnieje = PrawdaZakończ, jeśliW przypadku błędu Przejdź do -1Koniec funkcji |
Uwaga: dodaliśmy W przypadku błędu Przejdź do -1 do końca, który resetuje Err.Number do 0 (patrz dwie sekcje poniżej).
Z Przy błędzie Wznów Dalej oraz Numer błędu, możesz powielić "Próbuj złapać" funkcjonalność innych języków programowania.
W przypadku błędu Przejdź do Linia
W przypadku błędu Przejdź do Linia mówi VBA, aby "przeszedł do" oznaczonego wiersza kodu, gdy wystąpi błąd. Deklarujesz instrukcję Go To w ten sposób (gdzie errHandler jest etykietą linii, do której należy przejść):
1 | W przypadku błędu GoTo errHandler |
i utwórz taką etykietę linii:
1 | Obsługa błędów: |
Uwaga: jest to ta sama etykieta, której używasz ze zwykłą instrukcją VBA GoTo.
Poniżej zademonstrujemy za pomocą W przypadku błędu Przejdź do Linia aby zakończyć procedurę.
W przypadku błędu Wyjdź Sub
Możesz użyć opcji On Error GoTo Line, aby wyjść z podrzędnej, gdy wystąpi błąd.
Możesz to zrobić, umieszczając etykietę linii obsługi błędu na końcu procedury:
12345678 | Sub ErrGoToEnd()W przypadku błędu Przejdź do końcaProc„Jakiś kod”proces końcowy:Napis końcowy |
lub za pomocą polecenia Exit Sub:
123456789101112131415 | Sub ErrGoToEnd()W przypadku błędu Przejdź do końcaProc„Jakiś kod”IdźDo pomińWyjdźproces końcowy:Wyjście SubpomińWyjście:„Nieco więcej kodu”Napis końcowy |
Err.Clear, w przypadku błędu GoTo -1 i resetowanie Err.Number
Po obsłużeniu błędu należy go ogólnie wyczyścić, aby zapobiec przyszłym problemom z obsługą błędów.
Po wystąpieniu błędu, Zarówno Błąd.Wyczyść oraz W przypadku błędu Przejdź do -1 może być używany do resetowania Numer błędu do 0. Ale jest jedna bardzo ważna różnica: Błąd.Wyczyść nie resetuje samego błędu, lecz tylko resetuje Numer błędu.
Co to znaczy? Za pomocąBłąd.Wyczyść, nie będzie można zmienić ustawienia obsługi błędów. Aby zobaczyć różnicę, przetestuj ten kod i wymień W przypadku błędu Przejdź do -1 z Błąd.Wyczyść:
123456789101112131415161718192021 | Przykłady błędów pomocniczych()W przypadku błędu GoTo errHandler:„Błąd „zdefiniowany w aplikacji”Błąd (13)Wyjście SubObsługa błędów:'Wyczyść błądW przypadku błędu Przejdź do -1W przypadku błędu GoTo errHandler2:Błąd „Niezgodność typów”Błąd (1034)Wyjście SubObsługa błędów2:Debug.Print Błąd.OpisNapis końcowy |
Zazwyczaj polecam zawsze używać W przypadku błędu Przejdź do -1, chyba że masz dobry powód do użycia Błąd.Wyczyść zamiast.
VBA w przypadku błędu MsgBox
Możesz również chcieć wyświetlić okno komunikatu w przypadku błędu. Ten przykład wyświetli różne okna komunikatów w zależności od miejsca wystąpienia błędu:
12345678910111213141516171819202122232425262728 | Sub ErrorMessageEx()Dim errMsg jako ciągW przypadku błędu GoTo errHandler'Scena 1errMsg = "Wystąpił błąd podczas etapu kopiowania i wklejania."„Błąd Podnieś (11)'Etap 2errMsg = "Wystąpił błąd podczas etapu sprawdzania poprawności danych."„Błąd Podnieś (11)„Etap 3”errMsg = "Wystąpił błąd podczas etapu tworzenia rachunku zysków i strat oraz kopiowania."Błędne podniesienie (11)„Etap 4”errMsg = "Wystąpił błąd podczas próby rejestrowania importu na stronie konfiguracji"„Błąd Podnieś (11)Przejdź do końcaProcObsługa błędów:MsgBox errMsgproces końcowy:Napis końcowy |
Tutaj możesz zastąpić Err.Raise(11) swoim rzeczywistym kodem.
VBA IsError
Innym sposobem obsługi błędów jest testowanie ich za pomocą funkcji VBA IsError. Funkcja IsError testuje wyrażenie pod kątem błędów, zwracając TRUE lub FALSE, jeśli wystąpi błąd.
123 | Sub IsErrorEx()MsgBox IsError(Range("a7").Value)Napis końcowy |
Jeśli błąd VBA
Możesz także obsługiwać błędy w VBA za pomocą funkcji Excel IfError. Dostęp do funkcji IfError należy uzyskać za pomocą Arkusz roboczyKlasa funkcji:
1234567 | Sub JeśliBłądEx()Dim n As Longn = WorksheetFunction.IfError(Range("a10").Value, 0)MsgBox nNapis końcowy |
Spowoduje to wyświetlenie wartości z zakresu A10, jeśli wartość jest błędem, zamiast tego zostanie wyprowadzone 0.
Typy błędów VBA
Błędy uruchomieniowe
Jak stwierdzono powyżej:
Błędy wykonawcze VBA są błędami, które występują podczas wykonywania kodu. Przykłady błędów w czasie wykonywania to:
- Odwoływanie się do nieistniejącego skoroszytu, arkusza lub innego obiektu
- Nieprawidłowe dane np. odwoływanie się do komórki Excela zawierającej błąd
- Próba dzielenia przez zero
Możesz „obsługiwać błędy” błędów w czasie wykonywania, korzystając z metod omówionych powyżej.
Błędy składni
Błędy składni VBA są błędy w pisaniu kodu. Przykłady błędów składniowych obejmują:
- Błędna pisownia
- Brakująca lub nieprawidłowa interpunkcja
Edytor VBA identyfikuje wiele błędów składniowych z czerwonym podświetleniem:
Edytor VBA ma również opcję „Automatyczne sprawdzanie składni”:
Gdy ta opcja jest zaznaczona, Edytor VBA wygeneruje okno komunikatu ostrzegające o błędach składni po wprowadzeniu wiersza kodu:
Osobiście uważam to za bardzo denerwujące i wyłączam tę funkcję.
Błędy kompilacji
Przed próbą uruchomienia procedury VBA „skompiluje” procedurę. Kompilacja przekształca program z kodu źródłowego (który możesz zobaczyć) do postaci wykonywalnej (nie możesz jej zobaczyć).
Błędy kompilacji VBA to błędy, które uniemożliwiają kompilację kodu.
Dobrym przykładem błędu kompilacji jest brak deklaracji zmiennej:
Inne przykłady obejmują:
- Do z pominięciem Następny
- Wybierz z pominięciem Koniec Wybierz
- Gdyby z pominięciem Zakończ, jeśli
- Dzwonię do procedura to nie istnieje
Błędy składni (poprzednia sekcja) są podzbiorem błędów kompilacji.
Debuguj > Kompiluj
Błędy kompilacji pojawią się podczas próby uruchomienia procedury. Ale najlepiej byłoby zidentyfikować błędy kompilacji przed próbą uruchomienia procedury.
Możesz to zrobić, kompilując projekt z wyprzedzeniem. Aby to zrobić, przejdź do Debuguj > Kompiluj projekt VBA.
Kompilator „przejdzie” do pierwszego błędu. Po naprawieniu tego błędu ponownie skompiluj projekt. Powtarzaj, aż wszystkie błędy zostaną naprawione.
Możesz stwierdzić, że wszystkie błędy zostały naprawione, ponieważ Skompiluj projekt VBA będzie wyszarzony:
Błąd przepełnienia
ten Błąd przepełnienia VBA występuje, gdy próbujesz umieścić wartość w zmiennej, która jest zbyt duża. Na przykład, Zmienne całkowite może zawierać tylko wartości z zakresu od -32 768 do 32 768. Jeśli wprowadzisz większą wartość, otrzymasz błąd przepełnienia:
Zamiast tego powinieneś użyć Długa zmienna zapisać większą liczbę.
Inne warunki dotyczące błędów VBA
Błąd przechwytywania VBA
W przeciwieństwie do innych języków programowania, w VBA nie ma Oświadczenie złapania. Możesz jednak zreplikować instrukcję Catch za pomocą Przy błędzie Wznów Dalej oraz Jeśli Err.Number 0 Wtedy. Zostało to omówione powyżej w rozdziale Obsługa błędów z Err.Number.
Błąd ignorowania VBA
Aby zignorować błędy w VBA, po prostu użyj Przy błędzie Wznów Dalej oświadczenie:
1 | Przy błędzie Wznów Dalej |
Jednak, jak wspomniano powyżej, należy zachować ostrożność podczas korzystania z tej instrukcji, ponieważ nie naprawia ona błędu, po prostu ignoruje wiersz kodu zawierający błąd.
Błąd rzutu VBA / Err.Raise
Aby przejść przez błąd w VBA, użyj Błąd.Podnieś metoda.
Ten wiersz kodu wywoła błąd wykonania „13”: Niezgodność typów:
1 | Błędne podniesienie (13) |
Zatrzymywanie błędów VBA
Zatrzymywanie błędów VBA to tylko kolejny termin na obsługę błędów VBA.
Komunikat o błędzie VBA
A Komunikat o błędzie VBA wygląda tak:
Po kliknięciu „Debuguj” zobaczysz wiersz kodu, który powoduje błąd:
Obsługa błędów VBA w pętli
Najlepszym sposobem obsługi błędów w pętli jest użycie Przy błędzie Wznów Dalej wraz z Numer błędu aby wykryć, czy wystąpił błąd (Pamiętaj, aby użyć Błąd.Wyczyść aby usunąć błąd po każdym wystąpieniu).
Poniższy przykład podzieli dwie liczby (kolumna A na kolumnę B) i wyśle wynik do kolumny C. Jeśli wystąpi błąd, wynik będzie równy 0.
12345678910111213141516 | Test podrzędny()Przyciemnij komórkę jako zakresPrzy błędzie Wznów DalejDla każdej komórki w zakresie("a1:a10")'Ustaw wartość komórkicell.Offset(0, 2).Value = cell.Value / cell.Offset(0,1).Value'Jeżeli Cell.Value to Error, to wartość domyślna to 0Jeśli błąd numer 0 Wtedykomórka.Przesunięcie(0, 2).Wartość = 0Błąd.WyczyśćZakończ, jeśliNastępnyNapis końcowy |
Obsługa błędów VBA w programie Access
Wszystkie powyższe przykłady działają dokładnie tak samo w Access VBA, jak w Excel VBA.
123456789101112131415161718 | Funkcja DelRecord(frm As Form)'ta funkcja służy do usuwania rekordu w tabeli z formularzaW przypadku błędu Przejdź do zakończeniaZ frmJeśli .Nowy rekord to.CofnijWyjdź z funkcjiZakończ, jeśliKończyć zZ frm.RecordsetClone.Zakładka = frm.Zakładka.Kasowaćfrm.RequeryKończyć zWyjdź z funkcjikończący się:Kończyć sięKoniec funkcji |