Spracovanie chýb programu Excel VBA - všetko, čo potrebujete vedieť!

Bez ohľadu na to, aké máte skúsenosti s kódovaním VBA, chyby budú vždy súčasťou.

Rozdiel medzi nováčikom a odborným programátorom VBA je v tom, že skúsení programátori vedia, ako efektívne narábať s chybami a používať ich.

V tomto tutoriále vám ukážem rôzne spôsoby, ktoré môžete použiť na efektívne riešenie chýb v programe Excel VBA.

Predtým, ako sa dostaneme k spracovaniu chýb VBA, najskôr porozumieme rôznym typom chýb, s ktorými sa pravdepodobne stretnete pri programovaní v programe Excel VBA.

Typy chýb VBA v programe Excel

V programe Excel VBA existujú štyri typy chýb:

  1. Chyby syntaxe
  2. Chyby pri kompilácii
  3. Chyby runtime
  4. Logické chyby

Poďme rýchlo pochopiť, čo sú tieto chyby a kedy sa s nimi pravdepodobne stretnete.

Chyba syntaxe

Chyba syntaxe, ako naznačuje názov, nastane, keď VBA nájde niečo zlé so syntaxou v kóde.

Ak napríklad zabudnete potrebnú časť príkazu/syntaxe, zobrazí sa chyba kompilácie.

V nižšie uvedenom kóde, akonáhle stlačím kláves Enter za druhým riadkom, vidím chybu pri kompilácii. Dôvodom je, že IF vyhlásenie potrebuje mať „Potom‘, Ktorý v nižšie uvedenom kóde chýba.

Poznámka: Pri písaní kódu v programe Excel VBA kontroluje každú vetu hneď, ako stlačíte kláves Enter. Ak VBA nájde niečo, čo chýba v syntaxi, okamžite to zobrazí správu s textom, ktorý vám môže pomôcť porozumieť chýbajúcej časti.

Aby ste sa uistili, že sa vám zobrazí chyba syntaxe vždy, keď niečo chýba, musíte sa uistiť, že je povolená kontrola automatickej syntaxe. Ak to chcete urobiť, kliknite na „Nástroje“ a potom kliknite na „Možnosti“. V dialógovom okne možností sa uistite, že je povolená možnosť „Automatická kontrola syntaxe“.

Ak je možnosť „Automatická kontrola syntaxe“ deaktivovaná, VBA zvýrazní riadok s chybou syntaxe červenou farbou, ale nezobrazí chybové dialógové okno.

Chyba kompilácie

Chyby kompilácie sa vyskytujú vtedy, keď chýba niečo, čo je potrebné na spustenie kódu.

Napríklad v nižšie uvedenom kóde sa pri pokuse o spustenie kódu zobrazí nasledujúca chyba. Stáva sa to, pretože som použil príkaz IF Then bez toho, aby som ho uzavrel povinným „End If“.

Chyba syntaxe je tiež typom chyby kompilácie. K chybe syntaxe dôjde hneď, ako stlačíte kláves Enter a VBA zistí, že niečo chýba. K chybe kompilácie môže dôjsť aj vtedy, keď VBA pri zadávaní kódu nenájde nič chýbajúce, ale stane sa to pri kompilácii alebo spustení kódu.

VBA kontroluje každý riadok pri zadávaní kódu a zvýrazňuje chybu syntaxe, akonáhle je riadok nesprávny a stlačíte kláves Enter. Chyby kompilácie, na druhej strane, sú identifikované iba vtedy, keď VBA analyzuje celý kód.

Nasleduje niekoľko scenárov, v ktorých narazíte na chybu kompilácie:

  1. Použitie vyhlásenia IF bez konca IF
  2. Použitie príkazu For s príkazom Next
  3. Použitie príkazu Select bez použitia príkazu End Select
  4. Prebieha deklarácia premennej (funguje to len vtedy, ak je povolená možnosť Explicitné)
  5. Volanie sub/funkcie, ktorá neexistuje (alebo s nesprávnymi parametrami)
Poznámka k „Explicitnej možnosti“: Keď pridáte „Možnosť explicitná“, budete musieť pred spustením kódu deklarovať všetky premenné. Ak existuje nejaká premenná, ktorá nebola deklarovaná, VBA zobrazí chybu. Je to osvedčený postup, pretože ukazuje chybu v prípade, že máte nesprávne napísanú premennú. Tu si môžete prečítať viac o Explicitnej voľbe.

Chyby za behu

Chyby za behu sú tie, ktoré sa vyskytujú, keď je kód spustený.

Chyby za behu sa vyskytnú iba vtedy, keď je postarané o všetky chyby syntaxe a kompilácie.

Ak napríklad spustíte kód, ktorý má otvoriť zošit programu Excel, ale tento zošit nie je k dispozícii (buď je odstránený, alebo sa zmenil názov), vo vašom kóde sa zobrazí chyba pri spustení.

Akonáhle dôjde k chybe runtime, kód sa zastaví a zobrazí sa chybové dialógové okno.

O niečo užitočnejšia je správa v dialógovom okne Chyba pri spustení. Snaží sa vysvetliť problém, ktorý vám môže pomôcť napraviť.

Ak kliknete na tlačidlo Debug, zvýrazní sa časť kódu, ktorá vedie k chybe.

Ak ste chybu opravili, môžete kliknutím na tlačidlo Spustiť na paneli s nástrojmi (alebo stlačením klávesu F5) pokračovať v spustení kódu tam, kde skončil.

Alebo môžete z kódu vyjsť aj kliknutím na tlačidlo Ukončiť.

Dôležité: V prípade, že kliknete na tlačidlo Ukončiť v dialógovom okne, zastaví sa kód na riadku, na ktorom sa vyskytne. Všetky riadky kódu pred tým by však boli vykonané.

Logické chyby

Logické chyby by váš kód nezastavili, ale môžu viesť k nesprávnym výsledkom. Môžu to byť aj najťažšie typy chýb na riešenie problémov.

Tieto chyby nie sú zvýraznené kompilátorom a je potrebné ich ručne odstrániť.

Jeden príklad logickej chyby (s ktorou sa často stretávam) uviazol v nekonečnej slučke.

Ďalším príkladom môže byť situácia, ktorá prináša nesprávny výsledok. Môžete napríklad použiť nesprávnu premennú v kóde alebo pridať dve premenné, ak jedna nie je správna.

Na riešenie logických chýb používam niekoľko spôsobov:

  1. Vložte pole so správami na nejaké miesto v kóde a zvýraznite hodnoty/údaje, ktoré vám môžu pomôcť pochopiť, či eberything pokračuje podľa očakávania.
  2. Namiesto toho, aby ste kód spustili naraz, prejdite každý riadok jeden po druhom. Ak to chcete urobiť, kliknite kdekoľvek v kóde a stlačte kláves F8. Všimli by ste si, že pri každom stlačení klávesu F8 sa spustí jeden riadok. To vám umožní prejsť kódom po jednom riadku a identifikovať logické chyby.

Použitie ladenia na nájdenie chýb kompilácie/syntaxe

Keď ste s kódom hotoví, je vhodné ho najskôr skompilovať pred spustením.

Ak chcete skompilovať kód, kliknite na voľbe Debug na paneli s nástrojmi a kliknite na Kompilovať VBAProject.

Keď kompilujete projekt VBA, prejde kódom a identifikuje chyby (ak existujú).

V prípade, že nájde chybu, zobrazí vám dialógové okno s chybou. Zistí chyby jednu po druhej. Ak teda nájde chybu a vy ste ju opravili, musíte znova spustiť kompiláciu, aby ste našli ďalšie chyby (ak existujú).

Keď váš kód neobsahuje chyby, možnosť Kompilovať projekt VBAProjekt bude sivá.

Upozorňujeme, že kompilácia nájde iba chyby „Syntax“ a „Kompilácia“. NIE nájde chyby pri spustení.

Pri písaní kódu VBA nechcete, aby sa chyby opakovali. Aby ste tomu zabránili, môžete použiť mnoho spôsobov spracovania chýb.

V niekoľkých nasledujúcich častiach tohto článku sa budem zaoberať metódami, ktoré môžete použiť na spracovanie chýb VBA v programe Excel.

Konfigurácia nastavení chýb (spracované vs. nespracované chyby)

Predtým, ako začnete pracovať s kódom, musíte skontrolovať jedno nastavenie v programe Excel VBA.

Prejdite na panel nástrojov VBA, kliknite na položku Nástroje a potom kliknite na položku Možnosti.

V dialógovom okne Možnosti kliknite na kartu Všeobecné a uistite sa, že v skupine „Chybové zachytávanie“ je začiarknuté políčko „Rozbiť pri neošetrených chybách“.

Vysvetlím tri možnosti:

  1. Prestávka na všetky chyby: Toto zastaví váš kód pri všetkých typoch chýb, aj keď ste použili techniky na spracovanie týchto chýb.
  2. Modul prestávky v triede: Toto zastaví váš kód pri všetkých neošetrených chybách a zároveň, ak používate objekty ako Userforms, tiež sa v týchto objektoch rozbije a zvýrazní presný riadok spôsobujúci chybu.
  3. Prestávka pri neošetrených chybách: Tým sa váš kód zastaví iba v prípade chýb, s ktorými sa nespracováva. Toto je predvolené nastavenie, pretože zaisťuje upozornenie na všetky neošetrené chyby. Ak používate objekty ako Userforms, nezvýrazní sa tým riadok spôsobujúci chybu v objekte, ale zvýrazní sa iba riadok, ktorý odkazuje na daný objekt.
Poznámka: Ak pracujete s objektmi, ako sú napríklad Userforms, môžete toto nastavenie zmeniť na „Break on Class Modules“. Rozdiel medzi #2 a #3 je v tom, že keď použijete modul Break in Class Module, dostanete sa na konkrétny riadok v objekte, ktorý spôsobuje chybu. Môžete sa tiež rozhodnúť ísť s tým namiesto „Prestávky pri neošetrených chybách“.

Stručne povedané - ak s programom Excel VBA len začínate, uistite sa, že je začiarknuté políčko „Rozbiť neošetrené chyby“.

Riešenie chýb VBA s vyhláseniami „O chybe“

Keď sa vo vašom kóde vyskytne chyba, môžete urobiť niekoľko vecí:

  1. Ignorujte chybu a nechajte kód pokračovať
  2. Nainštalujte kód na spracovanie chýb a spustite ho, keď sa vyskytne chyba

Obe tieto metódy spracovania chýb zaisťujú, že koncový používateľ chybu neuvidí.

Na ich vykonanie môžete použiť niekoľko vyhlásení o chybe.

Pri chybe Pokračovať ďalej

Keď vo svojom kóde použijete „On Error Resume Next“, všetky zistené chyby budú ignorované a kód bude pokračovať v prevádzke.

Táto metóda spracovania chýb sa používa pomerne často, ale pri jej používaní musíte byť opatrní. Pretože úplne ignoruje všetky chyby, ktoré sa môžu vyskytnúť, je možné, že nebudete schopní identifikovať chyby, ktoré je potrebné opraviť.

Ak je napríklad spustený nižšie uvedený kód, vráti chybu.

Sub AssignValues ​​() x = 20/4 y = 30/0 0 End Sub

Stáva sa to preto, že číslo nemôžete rozdeliť nulou.

Ak však v tomto kóde použijem príkaz „On Error Resume Next“ (ako je uvedené nižšie), bude chybu ignorovať a nebudem vedieť, že existuje problém, ktorý je potrebné opraviť.

Sub AssignValues ​​() Pri chybe Pokračovať Ďalej x = 20 /4 y = 30 /0 Koniec pod

Funkciu On Error Resume Next by ste mali používať iba vtedy, ak jasne poznáte druh chýb, ktoré by váš kód VBA mal spôsobiť, a je v poriadku ho ignorovať.

Nižšie je napríklad uvedený kód udalosti VBA, ktorý by okamžite pridal hodnotu dátumu a času do bunky A1 novo vloženého hárka (tento kód sa pridá do pracovného hárka, nie do modulu).

Súbor Sub Subbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

Aj keď to vo väčšine prípadov funguje skvele, ak pridám namiesto pracovného hárka graf, zobrazí sa chyba. Pretože hárok grafu neobsahuje bunky, kód by vyvolal chybu.

Ak teda v tomto kóde použijem príkaz „On Error Resume Next“, bude fungovať podľa očakávaní s pracovnými listami a nebude nič robiť s hárkami grafov.

Súbor Sub Subbook_NewSheet (objekt ByVal Sh As) pri chybe Pokračovať ďalej Sh.Range ("A1") = formát (teraz "dd-mmm-rrrr hh: mm: ss") Koniec

Poznámka: Nasledujúce vyhlásenie o obnovení chyby sa najlepšie použije, ak viete, s akými chybami sa pravdepodobne stretnete. A potom, ak si myslíte, že je bezpečné tieto chyby ignorovať, môžete to použiť.

Tento kód môžete posunúť na ďalšiu úroveň tak, že analyzujete, či došlo k chybe, a zobrazíte k nemu relevantnú správu.

Nasledujúci kód by zobrazil okno so správou, ktoré by používateľa informovalo, že nebol vložený pracovný hárok.

Súkromný čiastkový zošit_Nový list (objekt ByVal Sh ako objekt) Pri chybe Pokračovať ďalej Sh.Range ("A1") = Formát (teraz "dd-mmm-rrrr hh: mm: ss") Ak je Err.Number 0 Then MsgBox "Vyzerá ako vy bol vložený hárok grafu „& vbCrLf &“ Chyba - ”& Err.Popis Konec Ak Koniec Sub

„Err.Number“ sa používa na získanie čísla chyby a „Err.Description“ sa používa na získanie popisu chyby. Tieto budú popísané neskôr v tomto návode.

Pri chybe GoTo 0

„On Error GoTo 0“ zastaví kód na riadku, ktorý spôsobuje chybu, a zobrazí hlásenie s popisom chyby.

Jednoducho povedané, umožňuje predvolené správanie pri kontrole chýb a zobrazuje predvolené chybové hlásenie.

Tak prečo to vlastne používať?

Bežne nemusíte používať „On Error Goto 0“, ale môže byť užitočné, keď ho použijete v spojení s „On Error Resume Next“

Nechaj ma vysvetliť!

Nasledujúci kód by vybral všetky prázdne bunky vo výbere.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Vyberte End Sub

Ukázalo by to však chybu, ak vo vybratých bunkách nie sú žiadne prázdne bunky.

Aby ste sa vyhli zobrazovaniu chyby, môžete použiť Pri chybe Pokračovať ďalej “

Teraz tiež zobrazí akúkoľvek chybu pri spustení nižšie uvedeného kódu:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks). Vyberte End Sub

Zatiaľ je všetko dobré!

Problém nastáva, ak je v časti kódu chyba, ktorá sa môže vyskytnúť, a keďže používate funkciu „On Error Resume Next“, kód ju jednoducho ignoruje a presunie sa na nasledujúci riadok.

Napríklad v nižšie uvedenom kóde by nebola žiadna chybová výzva:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks). Select '… more code that can contain error End Sub

Vo vyššie uvedenom kóde existujú dve miesta, kde môže dôjsť k chybe. Na prvom mieste vyberáme všetky prázdne bunky (pomocou Selection.SpecialCells) a na druhom mieste je zvyšný kód.

Aj keď sa očakáva prvá chyba, žiadna ďalšia chyba nie je.

Tu On Error Goto 0 príde na záchranu.

Keď ho použijete, obnovíte predvolené nastavenie chýb, kde začne zobrazovať chyby, keď na ne narazí.

Napríklad v nižšie uvedenom kóde by nebola žiadna chyba v prípade, že nie sú žiadne prázdne bunky, ale vyskytla by sa výzva na zadanie chyby kvôli '10/0 '

Sub SelectFormulaCells () On Error Pokračovať v ďalšom výbere.SpecialCells (xlCellTypeBlanks). Vyberte On Error GoTo 0 '… ďalší kód, ktorý môže obsahovať chybu End Sub

Pri chybe Choďte na [štítok]

Vyššie uvedené dve metódy - „On Error Resume Next“ a „On Error Goto 0“ - nám nedovolia chybu skutočne zvládnuť. Jeden spôsobí, že kód chybu ignoruje a druhý obnoví kontrolu chýb.

On Error Go [Štítok] je spôsob, pomocou ktorého môžete určiť, čo chcete urobiť v prípade chyby kódu.

Nasleduje štruktúra kódu, ktorá používa tento obslužný program chýb:

Drobný test () Pri chybe Štítok GoTo: X = 10 /0 'tento riadok spôsobuje chybu' …. Váš zostávajúci kód prejde sem. Ukončite podznačku: 'kód na zvládnutie chyby End Sub

Všimnite si toho, že pred manipuláciou s chybami „Štítok“ sa nachádza podsekcia Ukončiť. To zaisťuje, že v prípade, že nedochádza k žiadnym chybám, sub sa ukončí a kód „Label“ sa nevykoná. V prípade, že nepoužívate Exit Sub, vždy sa spustí kód „Label“.

V nižšie uvedenom príklade kódu, keď dôjde k chybe, kód skočí a vykoná kód v sekcii obsluhy (a zobrazí okno so správou).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončiť Sub ErrMsg: MsgBox "Zdá sa, že došlo k chybe" & vbCrLf & Err.Popis Koniec Sub

Všimnite si toho, že keď dôjde k chybe, kód už bol spustený a spustený riadky pred riadkom spôsobujúcim chybu. Vo vyššie uvedenom príklade kód nastaví hodnotu X na 12, ale keďže k chybe dôjde v nasledujúcom riadku, nenastaví hodnoty pre Y a Z.

Akonáhle kód skočí na kód obsluhy chýb (v tomto prípade ErrMsg), bude pokračovať vo vykonávaní všetkých riadkov v kóde a pod kódom obsluhy chýb a ukončením podradenej položky.

Pri chybe Choďte na -1

Toto je trochu komplikované a vo väčšine prípadov to pravdepodobne nebudete používať.

Ale budem to stále pokrývať, pretože som sa stretol so situáciou, kde to bolo potrebné (pokojne ignorujte a preskočte na ďalšiu časť, ak hľadáte iba základy).

Predtým, ako sa dostanem k mechanike, skúsim vysvetliť, kde to môže byť užitočné.

Predpokladajme, že máte kód, v ktorom sa vyskytla chyba. Ale všetko je v poriadku, pretože máte k dispozícii jeden nástroj na spracovanie chýb. Ale čo sa stane, keď je v kóde obsluhy chýb iná chyba (áno … niečo ako úvodný film).

V takom prípade nemôžete použiť druhý obslužný program, pretože prvá chyba nebola odstránená. Aj keď ste zvládli prvú chybu, v pamäti VBA stále existuje. A pamäť VBA má miesto iba pre jednu chybu - nie pre dve alebo viac.

V tomto scenári môžete použiť On Error Goto -1.

Vymaže chybu a uvoľní pamäť VBA na zvládnutie ďalšej chyby.

Dosť bolo rečí!

Vysvetlíme to teraz na príkladoch.

Predpokladajme, že mám nižšie uvedený kód. To spôsobí chybu, pretože tam je delenie nulou.

Pomocný obslužný nástroj chýb () X = 12 Y = 20/0 Z = 30 Koncový podrad

Aby som to zvládol, používam kód obsluhy chýb (s názvom ErrMsg), ako je uvedené nižšie:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončiť Sub ErrMsg: MsgBox "Zdá sa, že došlo k chybe" & vbCrLf & Err.Popis Koniec Sub

Teraz je všetko opäť dobré. Hneď ako sa vyskytne chyba, použije sa obsluha chýb a zobrazí sa okno so správou, ako je uvedené nižšie.

Teraz kód rozšírim, aby som mal ďalší kód v alebo za obslužným programom chýb.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončiť Sub ErrMsg: MsgBox „Zdá sa, že sa vyskytla chyba“ & vbCrLf & Err.Popis A = 10 /2 B = 35 /0 Koniec Sub

Pretože bola spracovaná prvá chyba, ale druhá nebola, opäť vidím chybu, ako je uvedené nižšie.

Stále všetko dobré. Kód sa správa tak, ako sme od neho očakávali.

Na zvládnutie druhej chyby teda používam iný obslužný program chýb (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončiť Sub ErrMsg: MsgBox "Zdá sa, že došlo k chybe" & vbCrLf & Err.Popis pri chybe GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Ukončiť Sub ErrMsg2: MsgBox „Zdá sa, že opäť došlo k chybe“ & vbCrLf & Err.Popis Koniec Sub

A tu to je nefunguje podľa očakávania.

Ak spustíte vyššie uvedený kód, stále sa vám zobrazí chyba pri spustení, a to aj vtedy, keď bude na mieste druhý obslužný program chýb.

Stáva sa to, pretože sme nevymazali prvú chybu z pamäte VBA.

Áno, zvládli sme to! Ale stále to zostáva v pamäti.

A keď VBA narazí na inú chybu, stále sa zasekne pri prvej chybe, a preto sa druhý obslužný program chýb nepoužije. Kód sa zastaví na riadku, ktorý spôsobil chybu, a zobrazí chybové hlásenie.

Na vymazanie pamäte VBA a vymazanie predchádzajúcej chyby musíte použiť príkaz „On Error Goto -1“.

Ak teda pridáte tento riadok do nižšie uvedeného kódu a spustíte ho, bude fungovať podľa očakávania.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončiť Sub ErrMsg: MsgBox "Zdá sa, že sa vyskytla chyba" & vbCrLf & Err.Popis Pri chybe GoTo -1 Pri chybe GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Ukončiť Sub ErrMsg2: MsgBox „Zdá sa, že opäť došlo k chybe“ & vbCrLf & Err.Popis Koniec Sub
Poznámka: Chyba sa automaticky odstráni, keď sa podprogram skončí.„On Error Goto -1“ môže byť teda užitočné, ak v tom istom podprograme nájdete dve alebo viac ako dve chyby.

Objekt Err

Kedykoľvek dôjde k chybe s kódom, je to objekt Err, ktorý sa používa na získanie podrobností o chybe (napríklad číslo chyby alebo popis).

Chybné vlastnosti objektu

Objekt Err má nasledujúce vlastnosti:

Nehnuteľnosť Popis
Číslo Číslo, ktoré predstavuje typ chyby. Ak nie je žiadna chyba, táto hodnota je 0
Popis Krátky popis chyby
Zdroj Názov projektu, v ktorom sa vyskytla chyba
HelpContext ID kontextu pomoci pre chybu v súbore pomoci
HelpFile Reťazec, ktorý predstavuje umiestnenie priečinka a názov súboru súboru pomocníka

Aj keď vo väčšine prípadov nepotrebujete používať objekt Err, niekedy môže byť užitočný pri spracovaní chýb v programe Excel.

Predpokladajme napríklad, že máte množinu údajov, ako je uvedené nižšie, a pre každé číslo vo výbere chcete vypočítať druhú odmocninu v susednej bunke.

Nasledujúci kód to dokáže, ale keďže v bunke A5 je textový reťazec, hneď ako k tomu dôjde, zobrazí chybu.

Sub FindSqrRoot () Dim rng As Range Set rng = Selection for each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Next cell End Sub

Problém s týmto typom chybového hlásenia je, že vám neposkytne nič o tom, čo sa stalo a kde sa problém vyskytol.

Na zvýšenie zmysluplnosti týchto chybových hlásení môžete použiť objekt Err.

Ak napríklad teraz použijem nižšie uvedený kód VBA, kód sa zastaví, akonáhle dôjde k chybe, a zobrazí sa hlásenie s adresou bunky bunky, kde je problém.

Sub FindSqrRoot () Dim rng As Range Set rng = Selection for each cell In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Next cell ErrHandler: MsgBox "Error Number:" & Err .Number & vbCrLf & _ "Popis chyby:" & Err.Popis & vbCrLf & _ "Chyba pri:" & bunke. Adresa Koniec Sub

Vyššie uvedený kód by vám poskytol oveľa viac informácií ako jednoduchý „nesúlad typov“, najmä adresu bunky, aby ste vedeli, kde sa vyskytla chyba.

Tento kód môžete ďalej upresniť, aby ste sa presvedčili, že váš kód beží až do konca (namiesto prerušovania pri každej chybe), a potom vám poskytne zoznam adries buniek, kde sa chyba vyskytuje.

Nasledujúci kód by to urobil:

Sub FindSqrRoot2 () Dim ErrorCells as String Dim rng as Range On Error Resume Next Set rng = Selection for each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Error in the following cells" & ErrorCells Exit Sub End Sub Sub

Vyššie uvedený kód beží až do konca a dáva odmocninu všetkých buniek, v ktorých sú čísla (v susednom stĺpci). Potom sa zobrazí správa so zoznamom všetkých buniek, v ktorých došlo k chybe (ako je uvedené nižšie):

Metódy chyby objektu

Aj keď sú vlastnosti Err užitočné na zobrazenie užitočných informácií o chybách, existujú aj dve metódy Err, ktoré vám môžu pomôcť pri riešení chýb.

Metóda Popis
jasný Vymaže všetky nastavenia vlastností objektu Err
Zdvihnite Generuje chybu pri spustení

Rýchlo sa naučíme, čo to je a ako/prečo ich používať s VBA v Exceli.

Metóda vymazania chyby

Predpokladajme, že máte množinu údajov, ako je uvedené nižšie, a chcete získať odmocninu všetkých týchto čísel v susednom stĺpci.

Nasledujúci kód dostane odmocniny všetkých čísel v susednom stĺpci a zobrazí správu, že sa vyskytla chyba pre bunky A5 a A9 (pretože tieto obsahujú text).

Sub FindSqrRoot2 () Dim ErrorCells as String Dim rng as Range On Error Resume Next Set rng = Selection for each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Chyba v nasledujúcich bunkách" & ErrorCells End Sub

Všimnite si toho, že som použil metódu Err.Clear v príkaze If Then.

Akonáhle dôjde k chybe a je zachytená podmienkou If, metóda Err.Clear resetuje číslo chyby späť na 0. To zaisťuje, že podmienka IF zachytí chyby iba pre bunky, v ktorých je vyvolaná.

Ak by som nepoužil metódu Err.Clear, akonáhle sa chyba vyskytne, vždy by platila v podmienkach IF a číslo chyby by nebolo vynulované.

Ďalším spôsobom, ako to zabezpečiť, je použiť On Error Goto -1, ktoré chybu úplne vynuluje.

Poznámka: Err.Clear sa líši od chyby pri chybe --1. Err.Clear vymaže iba popis chyby a číslo chyby. neresetuje to úplne. To znamená, že ak je v tom istom kóde ešte jeden prípad chyby, pred jeho resetovaním to nezvládnete (čo je možné vykonať pomocou „On Error Goto -1“ a nie pomocou „Err.Clear“).

Metóda Err Raise

Metóda Err.Raise umožňuje vyvolať chybu pri spustení.

Nasleduje syntax použitia metódy Err.Raise:

Err.Raise [číslo], [zdroj], [popis], [súbor pomoci], [kontext pomoci]

Všetky tieto argumenty sú voliteľné a môžete ich použiť na zvýšenie zmysluplnosti svojho chybového hlásenia.

Prečo by ste však niekedy chceli urobiť chybu sami?

Dobrá otázka!

Túto metódu môžete použiť v prípade výskytu chyby (čo znamená, že k chybe aj tak dôjde) a potom pomocou tejto metódy informujete používateľa o chybe viac (namiesto menej užitočného chybového hlásenia, ktoré zobrazuje VBA) predvolene).

Predpokladajme napríklad, že máte množinu údajov, ako je uvedené nižšie, a chcete, aby všetky bunky mali iba číselné hodnoty.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler for each Cell In rng If Not (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Koniec ak ďalšej bunky ErrHandler: MsgBox Err.Popis & vbCrLf & Err.HelpFile End Sub

Vyššie uvedený kód by zobrazil chybové hlásenie so zadaným popisom a kontextovým súborom.

Osobne som nikdy nepoužil Err.Raise, pretože väčšinou pracujem iba s programom Excel. Ale pre niekoho, kto používa VBA na prácu s Excelom spolu s inými aplikáciami, ako je Outlook, Word alebo PowerPoint, to môže byť užitočné.

Tu je podrobný článok o metóde Err.Raise v prípade, že sa chcete dozvedieť viac.

Osvedčené postupy pri riešení chýb VBA

Bez ohľadu na to, ako dobre ovládate písanie kódu VBA, chyby budú vždy súčasťou. Najlepší kodéri sú tí, ktorí majú schopnosti správne zaobchádzať s týmito chybami.

Tu je niekoľko osvedčených postupov, ktoré môžete použiť pri riešení chýb v programe Excel VBA.

  1. Na začiatku kódu použite príkaz „On Error Go [Label]“. Tým sa zaistí, že budú spracované všetky chyby, ktoré sa odtiaľ môžu vyskytnúť.
  2. „Pokračovať pri chybe ďalej“ používajte IBA vtedy, ak ste si istí chybami, ktoré sa môžu vyskytnúť. Používajte ho iba s očakávanou chybou. V prípade, že ho použijete s neočakávanými chybami, bude ho jednoducho ignorovať a posunie sa vpred. „On Error Resume Next“ s „Err.Raise“ môžete použiť, ak chcete určitý typ chyby ignorovať a ostatné odchytiť.
  3. Pri používaní obslužných rutín chýb sa ubezpečte, že používate obslužné nástroje Exit Sub. Tým sa zabezpečí, že kód obsluhy chýb sa spustí iba vtedy, ak dôjde k chybe (inak bude spustený vždy).
  4. Na zachytenie rôznych druhov chýb použite viacero obslužných rutín chýb. Použitie obsluhy viacerých chýb zaisťuje, že chyba je správne vyriešená. Napríklad by ste chceli spracovať chybu „nezhoda typu“ inak ako chybu pri behu „Delenie 0“.

Dúfam, že ste našli tento článok programu Excel užitočný!

Tu je niekoľko ďalších návodov k programu Excel VBA, ktoré by sa vám mohli páčiť:

  • Dátové typy Excel VBA - kompletný sprievodca
  • Slučky Excel VBA - pre ďalšie, robte kým, robte do, pre každého
  • Udalosti programu Excel VBA - ľahký (a kompletný) sprievodca
  • Excel Visual Basic Editor - Ako ho otvoriť a používať v programe Excel

Vám pomôže rozvoju miesta, zdieľať stránku s priateľmi

wave wave wave wave wave