VBA chyby podvádza
Chyby
PopisKód VBAPri chybe - Zastavte kód a zobrazte chybuPri chybe Choďte na 0Pri chybe - preskočte chybu a pokračujte v prevádzkePri chybe Pokračovať ďalejPri chybe - Prejdite na riadok kódu [Štítok]Pri chybe Choďte na [štítok]Vymaže (resetuje) chybuPri chybe GoTo -1Zobraziť číslo chybyMsgBox Err.ČísloZobraziť popis chybyMsgBox Err.PopisFunkcia na generovanie vlastnej chybyErr. RaisePozrite si ďalšie „Cheat Sheets“ VBA a bezplatné sťahovanie súborov PDF
Spracovanie chýb VBA
Spracovanie chýb VBA sa týka procesu predvídania, zisťovania a riešenia chýb runtime VBA. Proces spracovania chýb VBA nastáva pri písaní kódu skôr, ako sa skutočne vyskytnú chyby.
Chyby runtime VBA sú chyby, ktoré sa vyskytujú počas vykonávania kódu. Medzi príklady chýb za behu patrí:
- Odkazovanie na neexistujúci zošit, pracovný hárok alebo iný objekt
- Neplatné údaje napr. odkazovanie na bunku programu Excel obsahujúcu chybu
- Pokus o delenie nulou
VBA o vyhlásení o chybe
Väčšina spracovania chýb VBA sa vykonáva pomocou Vo vyhlásení o chybe. Príkaz On Error hovorí VBA, čo má robiť, ak narazí na chybu. Sú tam tri O chybových hláseniach:
- Pri chybe GoTo 0
- Pri chybe Pokračovať ďalej
- Pri chybe GoTo Riadok
Pri chybe GoTo 0
Pri chybe GoTo 0 je predvolené nastavenie VBA. Toto predvolené nastavenie môžete obnoviť pridaním nasledujúceho riadku kódu:
1 | Pri chybe GoTo 0 |
Keď sa vyskytne chyba s Pri chybe GoTo 0, VBA zastaví spustenie kódu a zobrazí štandardné pole s chybovým hlásením.
Často pridáte príponu Pri chybe GoTo 0 po pridaní Pri chybe Pokračovať ďalej spracovanie chýb (ďalšia časť):
123456789 | Vedľajšia chybaGoTo0 ()Pri chybe Pokračovať ďalejActiveSheet.Shapes ("Start_Button"). OdstrániťPri chybe GoTo 0„Spustiť viac kóduKoniec pod |
Pri chybe Pokračovať ďalej
Pri chybe Pokračovať ďalej hovorí VBA, aby preskočila všetky riadky kódu obsahujúce chyby a pokračovala na nasledujúci riadok.
1 | Pri chybe Pokračovať ďalej |
Poznámka: Pri chybe Pokračovať ďalej neopravuje chybu ani ju inak nerieši. Jednoducho to VBA povie, aby postupovalo, ako keby riadok kódu obsahujúci chybu neexistoval. Nesprávne používanie Pri chybe Pokračovať ďalej môže mať za následok nechcené následky.
Skvelý čas na použitie Pri chybe Pokračovať ďalej je pri práci s predmetmi, ktoré môžu, ale nemusia existovať. Napríklad chcete napísať nejaký kód, ktorý odstráni tvar, ale ak kód spustíte, keď je tvar už odstránený, VBA vyvolá chybu. Namiesto toho môžete použiť Pri chybe Pokračovať ďalej povedať VBA, aby odstránil tvar, ak existuje.
123 | Pri chybe Pokračovať ďalejActiveSheet.Shapes ("Start_Button"). OdstrániťPri chybe GoTo 0 |
Všimli sme si, že sme pridali Pri chybe GoTo 0 za riadok kódu obsahujúci potenciálnu chybu. Tým sa resetuje spracovanie chýb.
V nasledujúcej časti vám ukážeme, ako otestovať, či sa pri použití vyskytla chyba Err.číslo, čím získate pokročilejšie možnosti spracovania chýb …
Chybné číslo, chybné číslo a chyby chytania
Namiesto toho, aby sme jednoducho preskočili riadok obsahujúci chybu, môžeme chybu zachytiť pomocou Pri chybe Pokračovať ďalej a Err.číslo.
Err.číslo vráti číslo chyby zodpovedajúce typu zistenej chyby. Ak nie je žiadna chyba, Err.číslo = 0.
Tento postup napríklad vráti „11“, pretože chyba, ktorá sa vyskytne, je Chyba pri spustení „11“.
1234567 | Vedľajšia chybaČíslo_ex ()Pri chybe Pokračovať ďalejActiveCell.Value = 2/0Číslo MsgBox Err.Koniec pod |
Riešenie chýb s číslom Err.
Skutočná sila Err.číslo spočíva v schopnosti zistiť, či došlo k chybe (Err.číslo 0). V nižšie uvedenom príklade sme vytvorili funkciu, ktorá pomocou Err.Number otestuje, či hárok existuje.
12345678910111213141516171819 | Sub testWS ()MsgBox DoesWSExist („test“)Koniec podFunkcia DoesWSExist (wsName As String) As BooleanDim ws As worksheetPri chybe Pokračovať ďalejNastaviť ws = hárky (wsName)„Ak chyba WS neexistujeAk Err.Number 0 PotomDoesWSExist = FalseInakDoesWSExist = PravdaKoniec AkPri chybe GoTo -1Koncová funkcia |
Poznámka: Pridali sme a Pri chybe GoTo -1 na koniec, ktorý vynuluje Err.Number na 0 (pozri dve časti dole).
S Pri chybe Pokračovať ďalej a Err.číslo, môžete replikovať súbor "Skús chytiť" funkčnosť iných programovacích jazykov.
Pri chybe GoTo Riadok
Pri chybe GoTo Riadok hovorí VBA, aby pri chybe „prešiel“ na označený riadok kódu. Príkaz Prejsť na deklarujete takto (kde errHandler je menovka riadku, na ktorú sa má prejsť):
1 | Pri chybe GoTo errHandler |
a vytvorte riadkový štítok takto:
1 | errHandler: |
Poznámka: Toto je rovnaký štítok, ktorý by ste použili s bežným vyhlásením VBA GoTo.
Nižšie si ukážeme používanie Pri chybe GoTo Riadok ukončiť procedúru.
Pri chybe Ukončiť Pod
Riadok On Error GoTo Line môžete použiť na ukončenie podradenej položky v prípade chyby.
Môžete to urobiť tak, že na koniec postupu umiestnite štítok riadka popisovača chýb:
12345678 | Sub ErrGoToEnd ()Pri chybe GoTo endProc„Nejaký kódendProc:Koniec pod |
alebo pomocou príkazu Exit Sub:
123456789101112131415 | Sub ErrGoToEnd ()Pri chybe GoTo endProc„Nejaký kódGoTo skipExitendProc:Ukončiť subskipExit:„Ďalší kódKoniec pod |
Err.Clear, On Error GoTo -1 a resetovanie Err.Number
Po odstránení chyby by ste ju mali spravidla vymazať, aby ste predišli budúcim problémom s riešením chýb.
Potom, čo sa vyskytne chyba, obaja Err. Jasné a Pri chybe GoTo -1 možno použiť na resetovanie Err.číslo až 0. Existuje však jeden veľmi dôležitý rozdiel: Err. Jasné neresetuje samotnú skutočnú chybu, ale iba vynuluje Err.číslo.
Čo to znamená? PoužitímErr. Jasné, nebudete môcť zmeniť nastavenie spracovania chýb. Ak chcete vidieť rozdiel, vyskúšajte tento kód a nahraďte ho Pri chybe GoTo -1 s Err. Jasné:
123456789101112131415161718192021 | Sub ErrExamples ()Pri chybe GoTo errHandler:Chyba „Definované aplikáciou“Chyba (13)Ukončiť suberrHandler:'Vymazať chybuPri chybe GoTo -1Pri chybe GoTo errHandler2:Chyba „Neshoda typov“Chyba (1034)Ukončiť suberrHandler2:Debug.Print Err.PopisKoniec pod |
Spravidla odporúčam vždy používať Pri chybe GoTo -1, pokiaľ nemáte pádny dôvod na použitie Err. Jasné namiesto.
Chyba VBA MsgBox
Môžete tiež chcieť zobraziť pole so správou pri chybe. Tento príklad zobrazí rôzne polia so správami v závislosti od toho, kde sa chyba vyskytla:
12345678910111213141516171819202122232425262728 | Sub ErrorMessageEx ()Dim errMsg ako reťazecPri chybe GoTo errHandler„Fáza 1errMsg = "Počas fázy kopírovania a prilepenia sa vyskytla chyba."„Err.Raise (11)„Fáza 2errMsg = "Počas fázy overovania údajov sa vyskytla chyba."„Err.Raise (11)„Etapa 3errMsg = "Vo fáze vytvárania P & L a kopírovania sa vyskytla chyba."Err.Raise (11)„Fáza 4errMsg = "Pri pokuse o prihlásenie importu na stránku nastavenia došlo k chybe"„Err.Raise (11)Choďte na koniecProcerrHandler:MsgBox errMsgendProc:Koniec pod |
Tu by ste nahradili Err.Raise (11) svojim skutočným kódom.
VBA je chyba
Ďalším spôsobom, ako zvládnuť chyby, je otestovať ich pomocou funkcie VBA IsError. Funkcia IsError testuje chyby vo výraze, pričom v prípade chyby vráti hodnotu TRUE alebo FALSE.
123 | Sub IsErrorEx ()MsgBox IsError (rozsah ("a7"). Hodnota)Koniec pod |
Ak sa vyskytne chyba VBA
Chyby vo VBA zvládnete aj pomocou funkcie Excel IfError. K funkcii IfError je potrebné pristupovať pomocou Pracovný list Funkčná trieda:
1234567 | Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (rozsah ("a10"). hodnota, 0)MsgBox čKoniec pod |
Výsledkom bude hodnota rozsahu A10, ak je hodnota chybou, namiesto toho sa zobrazí 0.
Typy chýb VBA
Chyby runtime
Ako je uvedené vyššie:
Chyby runtime VBA sú chyby, ktoré sa vyskytujú počas vykonávania kódu. Medzi príklady chýb za behu patrí:
- Odkazovanie na neexistujúci zošit, pracovný hárok alebo iný objekt
- Neplatné údaje napr. odkazovanie na bunku programu Excel obsahujúcu chybu
- Pokus o delenie nulou
Chyby runtime „zvládnuť chybu“ môžete pomocou vyššie uvedených metód.
Chyby syntaxe
Chyby syntaxe VBA sú chyby pri písaní kódu. Medzi príklady chýb syntaxe patrí:
- Nesprávne
- Chýbajúca alebo nesprávna interpunkcia
Editor VBA identifikuje mnoho syntaktických chýb červeným zvýraznením:
Editor VBA má tiež možnosť „Automatickej kontroly syntaxe“:
Keď je to začiarknuté, editor VBA vygeneruje okno so správou, ktoré vás upozorní na chyby syntaxe po zadaní riadka kódu:
Mne osobne to pripadá veľmi nepríjemné a túto funkciu deaktivujem.
Chyby kompilácie
Pred pokusom o spustenie procedúry VBA procedúru „skomplikuje“. Kompilácia transformuje program zo zdrojového kódu (ktorý vidíte) do spustiteľnej podoby (nevidíte).
Chyby kompilácie VBA sú chyby, ktoré bránia kompilácii kódu.
Dobrým príkladom chyby kompilácie je chýbajúca deklarácia premennej:
Medzi ďalšie príklady patria:
- Pre bez Ďalšie
- Vyberte bez Ukončiť výber
- Ak bez Koniec Ak
- Volanie a postup to neexistuje
Chyby syntaxe (predchádzajúca časť) sú podmnožinou chýb kompilácie.
Ladenie> Kompilovať
Pri pokuse o spustenie procedúry sa zobrazia chyby kompilácie. V ideálnom prípade by ste však pred pokusom o spustenie postupu identifikovali chyby pri kompilácii.
Môžete to urobiť tak, že projekt skompilujete vopred. Ak to chcete urobiť, prejdite na stránku Ladenie> Kompilovať projekt VBA.
Kompilátor „prejde“ na prvú chybu. Hneď ako chybu opravíte, skompilovajte projekt znova. Opakujte, kým nie sú všetky chyby opravené.
Môžete povedať, že všetky chyby sú opravené, pretože Zostavte projekt VBA budú sivé:
Chyba pretečenia
The Chyba pretečenia VBA nastane, keď sa pokúsite vložiť hodnotu do príliš veľkej premennej. Napríklad, Celočíselné premenné môže obsahovať iba hodnoty od -32 768 do 32 768. Ak zadáte väčšiu hodnotu, zobrazí sa chyba pretečenia:
Namiesto toho by ste mali použiť Dlhá premenná na uloženie väčšieho počtu.
Ďalšie podmienky chyby VBA
Chyba zachytenia VBA
Na rozdiel od iných programovacích jazykov, vo VBA neexistuje Vyhlásenie o úlovku. Vyhlásenie o úlovkoch však môžete replikovať pomocou Pri chybe Pokračovať ďalej a Ak Err.Number 0 Potom. Toto je popísané vyššie v časti Manipulácia s chybami s číslom Err.Number.
Chyba ignorovania VBA
Ak chcete ignorovať chyby vo VBA, jednoducho použite Pri chybe Pokračovať ďalej vyhlásenie:
1 | Pri chybe Pokračovať ďalej |
Ako je však uvedené vyššie, pri použití tohto príkazu by ste mali byť opatrní, pretože neopravuje chybu, iba ignoruje riadok kódu obsahujúci chybu.
Chyba pri hode VBA / Zvýšenie
Na chybu vo VBA použite príkaz Err. Raise metóda.
Tento riadok kódu spôsobí chybu pri spustení „13“: Nesúlad typov:
1 | Err.Raise (13) |
Chybové zachytávanie VBA
Chybové zachytávanie VBA je len ďalší výraz pre spracovanie chýb VBA.
Chybové hlásenie VBA
A Chybové hlásenie VBA vyzerá takto:
Po kliknutí na položku „Ladiť“ sa zobrazí riadok kódu, ktorý spôsobuje chybu:
Spracovanie chýb VBA v slučke
Najlepším spôsobom, ako spracovať chyby v slučke, je pomocou Pri chybe Pokračovať ďalej spolu s Err.číslo zistiť, či došlo k chybe (Nezabudnite použiť Err. Jasné vymazať chybu po každom výskyte).
Nasledujúci príklad rozdelí dve čísla (stĺpec A na stĺpec B) a výsledok vynesie do stĺpca C. Ak dôjde k chybe, výsledok bude 0.
12345678910111213141516 | Vedľajší test ()Dim bunka ako rozsahPri chybe Pokračovať ďalejPre každú bunku v rozsahu („a1: a10“)„Nastavte hodnotu bunkycell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value„Ak je Cell.Value chyba, potom je predvolená hodnota 0Ak Err.Number 0 Potombunka. Odsadenie (0, 2). Hodnota = 0Err. JasnéKoniec AkĎalšieKoniec pod |
Spracovanie chýb VBA v programe Access
Všetky vyššie uvedené príklady fungujú v programe Access VBA úplne rovnako ako v programe Excel VBA.
123456789101112131415161718 | Funkcia DelRecord (ako formulár)„táto funkcia sa používa na vymazanie záznamu v tabuľke z formuláraPri chybe GoTo končíS frmAk .Nový Záznam Potom.Vrátenie späťUkončiť funkciuKoniec AkUkončiť sS frm.RecordsetClone.Bookmark = frm.Bookmark.Odstrániťfrm. PožiadavkaUkončiť sUkončiť funkciukoniec:KoniecKoncová funkcia |