Chyba VBA - osvědčené postupy při zpracování chyb

VBA Chyby Cheat Sheet

Chyby

PopisKód VBAOn Error - Zastavte kód a zobrazte chybuPři chybě Přejít na 0Při chybě - Přeskočte chybu a pokračujte v běhuPři chybě Pokračovat DalšíPři chybě - Přejděte na řádek kódu [Štítek]Při chybě Přejít [Štítek]Vymaže (resetuje) chybuPři chybě GoTo -1Zobrazit číslo chybyMsgBox Err.čísloZobrazit popis chybyMsgBox Err.PopisFunkce pro generování vlastní chybyErr. Raise

Podívejte se na další „Cheat Sheets“ VBA a bezplatné stahování PDF

Zpracování chyb VBA

Zpracování chyb VBA označuje proces předvídání, detekce a řešení chyb za běhu VBA. Proces zpracování chyb VBA nastává při psaní kódu, než se skutečně vyskytnou chyby.

Chyby runtime VBA jsou chyby, ke kterým dochází během provádění kódu. Mezi chyby za běhu patří:

  • Odkazování na neexistující sešit, list nebo jiný objekt
  • Neplatné údaje, např. odkazování na buňku aplikace Excel obsahující chybu
  • Pokus o dělení nulou

Prohlášení o chybě VBA

Většina zpracování chyb VBA se provádí pomocí On Error Statement. Příkaz On Error říká VBA, co má dělat, když narazí na chybu. Tam jsou tři Na chybových hlášeních:

  • Při chybě GoTo 0
  • Při chybě Pokračovat Další
  • Při chybě GoTo Čára

Při chybě GoTo 0

Při chybě GoTo 0 je výchozí nastavení VBA. Toto výchozí nastavení můžete obnovit přidáním následujícího řádku kódu:

1 Při chybě GoTo 0

Když dojde k chybě s Při chybě GoTo 0, VBA zastaví provádění kódu a zobrazí jeho standardní pole s chybovou zprávou.

Často přidáte příponu Při chybě GoTo 0 po přidání Při chybě Pokračovat Další zpracování chyb (další část):

123456789 Dílčí chybaGoTo0 ()Při chybě Pokračovat DalšíActiveSheet.Shapes ("Start_Button"). OdstranitPři chybě GoTo 0„Spustit více kóduEnd Sub

Při chybě Pokračovat Další

Při chybě Pokračovat Další říká VBA, aby přeskočil všechny řádky kódu obsahující chyby a pokračoval na další řádek.

1 Při chybě Pokračovat Další

Poznámka: Při chybě Pokračovat Další neopravuje chybu ani ji jinak nevyřeší. Jednoduše řekne VBA, aby postupovala, jako by řádek kódu obsahující chybu neexistoval. Nesprávné použití Při chybě Pokračovat Další může mít za následek nezamýšlené důsledky.

Skvělý čas na použití Při chybě Pokračovat Další je při práci s objekty, které mohou nebo nemusí existovat. Chcete například napsat nějaký kód, který odstraní tvar, ale pokud kód spustíte, když je tvar již odstraněn, VBA vyvolá chybu. Místo toho můžete použít Při chybě Pokračovat Další říci VBA, aby odstranil tvar, pokud existuje.

123 Při chybě Pokračovat DalšíActiveSheet.Shapes ("Start_Button"). OdstranitPři chybě GoTo 0

Všimli jsme si, že jsme přidali Při chybě GoTo 0 za řádek kódu obsahující potenciální chybu. Tím se resetuje zpracování chyb.

V další části vám ukážeme, jak otestovat, zda nedošlo k chybě pomocí Err. Číslo, což vám poskytne pokročilejší možnosti zpracování chyb …

Err.Number, Err.Clear, and Catching Errors

Místo toho, abychom jednoduše přeskočili řádek obsahující chybu, můžeme chybu zachytit pomocí Při chybě Pokračovat Další a Err. Číslo.

Err. Číslo vrací číslo chyby odpovídající typu detekované chyby. Pokud nedojde k chybě, Err. Číslo = 0.

Tento postup například vrátí „11“, protože dojde k chybě Chyba za běhu „11“.

1234567 Sub ErrorNumber_ex ()Při chybě Pokračovat DalšíActiveCell.Value = 2/0MsgBox Err.NumberEnd Sub

Zpracování chyb s Err.Number

Skutečná síla Err. Číslo spočívá ve schopnosti zjistit, zda došlo k chybě (Err. Číslo 0). V níže uvedeném příkladu jsme vytvořili funkci, která pomocí Err.Number otestuje, zda list existuje.

12345678910111213141516171819 Dílčí testWS ()MsgBox DoesWSExist („test“)End SubFunkce DoesWSExist (wsName As String) As BooleanDim ws As WorksheetPři chybě Pokračovat DalšíSet ws = Sheets (wsName)'Pokud chyba WS neexistujePokud Err.Number 0 ThenDoesWSExist = FalseJinýDoesWSExist = TrueKonec IfPři chybě GoTo -1Koncová funkce

Poznámka: Přidali jsme a Při chybě GoTo -1 na konec, který resetuje Err.Number na 0 (viz dvě části níže).

S Při chybě Pokračovat Další a Err. Číslo, můžete replikovat soubor "Zkus chytit" funkčnost jiných programovacích jazyků.

Při chybě GoTo Čára

Při chybě GoTo Čára řekne VBA, aby „přešel“ na označený řádek kódu, když dojde k chybě. Prohlášení Přejít na deklarujete takto (kde errHandler je popisek řádku, na který se má přejít):

1 Při chybě GoTo errHandler

a vytvořte popisek řádku takto:

1 errHandler:

Poznámka: Toto je stejný štítek, který byste použili s běžným prohlášením VBA GoTo.

Níže si předvedeme použití Při chybě GoTo Čára pro ukončení procedury.

On Error Exit Sub

Pomocí linky On Error GoTo Line můžete ukončit dílčí část, když dojde k chybě.

To lze provést umístěním popisku řádku obslužné rutiny chyby na konec postupu:

12345678 Sub ErrGoToEnd ()Při chybě GoTo endProc„Nějaký kódendProc:End Sub

nebo pomocí příkazu Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Při chybě GoTo endProc„Nějaký kódGoTo skipExitendProc:Ukončit dílčískipExit:„Nějaký další kódEnd Sub

Err.Clear, On Error GoTo -1 a Reseting Err.Number

Po zpracování chyby byste ji měli obecně vymazat, abyste předešli budoucím problémům se zpracováním chyb.

Poté, co dojde k chybě, oba Err.Jasné a Při chybě GoTo -1 lze použít k resetování Err. Číslo na 0. Ale je tu jeden velmi důležitý rozdíl: Err.Jasné neresetuje samotnou skutečnou chybu, pouze resetuje Err. Číslo.

Co to znamená? PoužitímErr.Jasné, nebudete moci změnit nastavení zpracování chyb. Chcete -li vidět rozdíl, vyzkoušejte tento kód a nahraďte ho Při chybě GoTo -1 s Err.Jasné:

123456789101112131415161718192021 Sub ErrExamples ()Při chybě GoTo errHandler:Chyba „Definováno aplikací“Chyba (13)Ukončit dílčíerrHandler:'Vymazat chybuPři chybě GoTo -1Při chybě GoTo errHandler2:Chyba „Neshoda typu“Chyba (1034)Ukončit dílčíerrHandler2:Debug.Print Err.PopisEnd Sub

Obvykle doporučuji vždy použít Při chybě GoTo -1, pokud k tomu nemáte pádný důvod Err.Jasné namísto.

Chyba VBA MsgBox

Můžete také chtít zobrazit okno se zprávou při chybě. Tento příklad zobrazí různá pole se zprávami podle toho, kde k chybě dojde:

12345678910111213141516171819202122232425262728 Dílčí ErrorMessageEx ()Dim errMsg jako řetězecPři chybě GoTo errHandler`` Fáze 1errMsg = "Během fáze kopírování a vkládání došlo k chybě."'Err.Raise (11)`` Fáze 2errMsg = "Ve fázi ověření dat došlo k chybě."'Err.Raise (11)`` Fáze 3errMsg = "Ve fázi vytváření a kopírování P & L došlo k chybě."Err.Raise (11)`` Fáze 4errMsg = "Při pokusu o přihlášení importu na instalační stránce došlo k chybě"'Err.Raise (11)Přejít na konecProcerrHandler:MsgBox errMsgendProc:End Sub

Zde byste nahradili Err.Raise (11) skutečným kódem.

VBA je chyba

Dalším způsobem, jak zvládnout chyby, je otestovat je pomocí funkce VBA IsError. Funkce IsError testuje výraz na chyby, vrací TRUE nebo FALSE, pokud dojde k chybě.

123 Sub IsErrorEx ()MsgBox IsError (Rozsah ("a7"). Hodnota)End Sub

Pokud chyba VBA

Chyby ve VBA můžete také zpracovávat pomocí funkce Excel IfError. K funkci IfError je nutné přistupovat pomocí Třída funkce:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Rozsah ("a10"). Hodnota, 0)MsgBox čEnd Sub

Tím se zobrazí hodnota rozsahu A10, pokud je hodnota chybou, místo toho se zobrazí 0.

Typy chyb VBA

Chyby runtime

Jak je uvedeno výše:

Chyby runtime VBA jsou chyby, ke kterým dochází během provádění kódu. Mezi chyby za běhu patří:

  • Odkazování na neexistující sešit, list nebo jiný objekt
  • Neplatné údaje, např. odkazování na buňku aplikace Excel obsahující chybu
  • Pokus o dělení nulou

Chyby runtime „zpracovat chyby“ můžete pomocí výše uvedených metod.

Chyby syntaxe

Chyby syntaxe VBA jsou chyby při psaní kódu. Mezi příklady chyb syntaxe patří:

  • Špatně
  • Chybějící nebo nesprávná interpunkce

Editor VBA identifikuje mnoho chyb syntaxe červeným zvýrazněním:

Editor VBA má také možnost „Automatická kontrola syntaxe“:

Když je toto zaškrtnuto, editor VBA vygeneruje okno se zprávou upozorňující na chyby syntaxe po zadání řádku kódu:

Osobně mi to připadá extrémně otravné a tuto funkci deaktivuji.

Chyby kompilace

Před pokusem o spuštění procedury VBA proceduru „zkomplikuje“. Kompilace transformuje program ze zdrojového kódu (který vidíte) do spustitelné podoby (nevidíte).

Chyby kompilace VBA jsou chyby, které brání kompilaci kódu.

Dobrým příkladem chyby kompilace je chybějící deklarace proměnné:

Mezi další příklady patří:

  • Pro bez další
  • Vybrat bez Konec Vybrat
  • Li bez Konec If
  • Volání a postup to neexistuje

Chyby syntaxe (předchozí část) jsou podmnožinou chyb kompilace.

Ladění> Kompilovat

Při pokusu o spuštění procedury se zobrazí chyby kompilace. V ideálním případě byste ale před pokusem o spuštění procedury identifikovali chyby kompilace.

Můžete to udělat tak, že projekt zkompilováte předem. Chcete -li to provést, přejděte na Ladění> Kompilovat projekt VBA.

Kompilátor „přejde“ na první chybu. Jakmile tuto chybu opravíte, zkompilujte projekt znovu. Opakujte, dokud nebudou všechny chyby opraveny.

Můžete říci, že všechny chyby jsou opraveny, protože Zkompilovat projekt VBA bude zobrazeno šedě:

Chyba přetečení

The Chyba přetečení VBA nastane, když se pokusíte vložit hodnotu do příliš velké proměnné. Například, Celočíselné proměnné může obsahovat pouze hodnoty mezi -32 768 až 32 768. Pokud zadáte vyšší hodnotu, zobrazí se chyba Přetečení:

Místo toho byste měli použít Dlouhá proměnná k uložení většího počtu.

Další podmínky chyby VBA

Chyba chycení VBA

Na rozdíl od jiných programovacích jazyků ve VBA neexistuje Prohlášení o úlovcích. Prohlášení o úlovku však můžete replikovat pomocí Při chybě Pokračovat Další a Pokud Err.Number 0 Then. To je popsáno výše v části Zpracování chyb pomocí Err.Number.

Chyba ignorování VBA

Chcete -li ignorovat chyby ve VBA, jednoduše použijte Při chybě Pokračovat Další tvrzení:

1 Při chybě Pokračovat Další

Jak je však uvedeno výše, při používání tohoto příkazu byste měli být opatrní, protože neopravuje chybu, pouze ignoruje řádek kódu obsahující chybu.

VBA Throw Error / Err.Raise

Chcete -li prostřednictvím chyby ve VBA použít Err. Raise metoda.

Tento řádek kódu vyvolá chybu běhu „13“: Neshoda typu:

1 Err.Raise (13)

Chyby soutisku VBA

Chyby soutisku VBA je jen další termín pro zpracování chyb VBA.

Chybová zpráva VBA

A Chybová zpráva VBA vypadá takto:

Když kliknete na „Ladit“, zobrazí se řádek kódu, který vyvolává chybu:

Zpracování chyb VBA ve smyčce

Nejlepší způsob, jak zpracovat chyby v rámci smyčky, je pomocí Při chybě Pokračovat Další spolu s Err. Číslo zjistit, zda došlo k chybě (Nezapomeňte použít Err.Jasné vymazat chybu po každém výskytu).

Níže uvedený příklad rozdělí dvě čísla (sloupec A na sloupec B) a výsledek vyvede do sloupce C. Pokud dojde k chybě, výsledkem bude 0.

12345678910111213141516 Dílčí test ()Dim buňka jako rozsahPři chybě Pokračovat DalšíPro každou buňku v dosahu („a1: a10“)'Nastavit hodnotu buňkycell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Pokud je Cell.Value Chyba, pak výchozí na 0Pokud Err.Number 0 Thenbuňka.Offset (0, 2) .Hodnota = 0Err.JasnéKonec IfdalšíEnd Sub

Zpracování chyb VBA v Accessu

Všechny výše uvedené příklady fungují v Access VBA úplně stejně jako v Excelu VBA.

123456789101112131415161718 Funkce DelRecord (frm jako formulář)'tato funkce se používá k odstranění záznamu v tabulce z formuláře.'Při chybě GoTo končíS frmPokud .NewRecord Then.VrátitFunkce ukončeníKonec IfKonec sS frm.RecordsetClone.Bookmark = frm.Bookmark.Vymazatfrm. PožadavekKonec sFunkce ukončeníkonec:KonecKoncová funkce
wave wave wave wave wave