Obslužné rutiny chyb vám umožňují určit, co se stane, když dojde k chybě při spuštění kódu makra aplikace Excel. Obslužné rutiny chyb jsou řádky podobné následujícím:
On Error GoTo MyError
Bez obslužných programů chyb každá chyba, která se objeví ve vašem kódu, vyzve Excel k aktivaci méně užitečné chybové zprávy, která obvykle jasně nevyjadřuje, co se stalo. S pomocí obslužných rutin chyb se však můžete rozhodnout chybu ignorovat nebo kód elegantně ukončit se svou vlastní zprávou pro uživatele.
Existují tři typy příkazů On Error:
-
On Error GoTo SomeLabel: Kód skočí na zadaný štítek.
-
On Error Resume Next: Chyba je ignorována a kód pokračuje.
-
On Error GoTo 0: VBA se resetuje na normální chování při kontrole chyb.
On Error GoTo SomeLabel
Někdy chyba ve vašem kódu znamená, že musíte postup elegantně ukončit a dát uživatelům jasnou zprávu. V těchto situacích můžete pomocí příkazu On Error GoTo sdělit aplikaci Excel, aby skočila na určitý řádek kódu.
Například v následujícím malém úryvku kódu řeknete Excelu, aby vydělil hodnotu v buňce A1 hodnotou v buňce A2, a poté umístil odpověď do buňky A3. Snadný. Co by se mohlo pokazit?
Dílčí makro1()
Rozsah("A3").Hodnota = Rozsah("A1").Hodnota / Rozsah("A2").Hodnota
End Sub
Jak se ukazuje, mohou se pokazit dvě hlavní věci. Pokud buňka A2 obsahuje 0, dostanete chybu dělení 0. Pokud buňka A2 obsahuje nečíselnou hodnotu, zobrazí se chyba nesouladu typu.
Chcete-li se vyhnout nepříjemné chybové zprávě, můžete Excelu sdělit, že při chybě chcete, aby spuštění kódu přešlo na štítek s názvem MyExit.
V následujícím kódu je po štítku MyExit následována zpráva pro uživatele, která poskytuje přátelskou radu namísto ošklivé chybové zprávy. Všimněte si také řádku Exit Sub před štítkem MyExit, který zajišťuje, že kód jednoduše skončí, pokud nenastane žádná chyba:
Dílčí makro1()
Při chybě GoTo MyExit
Rozsah("A3").Hodnota = Rozsah("A1").Hodnota / Rozsah("A2").Hodnota
Exit Sub
MyExit:
MsgBox "Použijte prosím platná nenulová čísla"
End Sub
Při chybě pokračovat dále
Někdy chcete, aby Excel ignoroval chybu a jednoduše pokračoval ve spuštění kódu. V těchto situacích můžete použít příkaz On Error Resume Next.
Například následující část kódu je určena k odstranění souboru s názvem GhostFile.exe z adresáře C:Temp. Po odstranění souboru se uživateli zobrazí pěkné okno se zprávou, že soubor je pryč:
Dílčí makro1()
Zabijte "C: TempGhostFile.exe"
MsgBox "Soubor byl smazán."
End Sub
Kód funguje skvěle, pokud skutečně existuje soubor k odstranění. Pokud však z nějakého důvodu soubor s názvem GhostFile.exe na jednotce C:Temp neexistuje, dojde k chybě.
V tomto případě je vám jedno, jestli tam soubor není, protože jste ho stejně chtěli smazat. Takže můžete chybu jednoduše ignorovat a pokračovat v kódu.
Pomocí příkazu On Error Resume Next se kód spustí bez ohledu na to, zda cílový soubor existuje či nikoli:
Dílčí makro1()
Při chybě pokračovat dále
Zabijte "C: TempGhostFile.exe"
MsgBox "Soubor byl smazán."
End Sub
Při chybě GoTo 0
Při použití určitých chybových příkazů může být nutné resetovat chování VBA při kontrole chyb. Abyste pochopili, co to znamená, podívejte se na následující příklad.
Zde nejprve chcete odstranit soubor s názvem GhostFile.exe z adresáře C:Temp. Chcete-li se vyhnout chybám, které mohou pocházet ze skutečnosti, že cílový soubor neexistuje, použijte příkaz On Error Resume Next. Poté se pokusíte provést nějakou podezřelou matematiku dělením 100/Mike:
Dílčí makro1()
Při chybě pokračovat dále
Zabijte "C: TempGhostFile.exe"
Rozsah ("A3"). Hodnota = 100 / "Mike"
End Sub
Spuštění tohoto kusu kódu by mělo vygenerovat chybu kvůli fuzzy matematice, ale nedělá. Proč? Protože poslední instrukce, kterou jste dali kódu, byla On Error Resume Next. Jakákoli chyba zjištěná po tomto řádku je efektivně ignorována.
Chcete-li tento problém vyřešit, můžete pomocí příkazu On Error GoTo 0 obnovit normální chování při kontrole chyb:
Dílčí makro1()
Při chybě pokračovat dále
Zabijte "C: TempGhostFile.exe"
Při chybě GoTo 0
Rozsah ("A3"). Hodnota = 100 / "Mike"
End Sub
Tento kód bude ignorovat chyby až do příkazu On Error GoTo 0. Po tomto příkazu se kód vrátí k normální kontrole chyb a spustí očekávanou chybu pramenící z fuzzy matematiky.