Obslužné programy chýb vám umožňujú určiť, čo sa stane, keď sa vyskytne chyba počas spustenia kódu makra programu Excel. Obslužné nástroje chýb sú riadky podobné týmto:
Pri chybe Prejsť na MyError
Bez obsluhy chýb každá chyba, ktorá sa vyskytne vo vašom kóde, vyzve Excel, aby aktivoval menej ako užitočné chybové hlásenie, ktoré zvyčajne nebude jasne vyjadrovať, čo sa stalo. Pomocou obslužných programov chýb sa však môžete rozhodnúť ignorovať chybu alebo elegantne ukončiť kód s vlastnou správou pre používateľa.
Existujú tri typy vyhlásení o chybe:
-
On Error GoTo SomeLabel: Kód preskočí na zadaný štítok.
-
On Error Resume Next: Chyba sa ignoruje a kód sa obnoví.
-
Pri chybe GoTo 0: VBA sa resetuje na normálne správanie pri kontrole chýb.
On Error GoTo SomeLabel
Niekedy chyba vo vašom kóde znamená, že musíte postup elegantne ukončiť a dať svojim používateľom jasnú správu. V týchto situáciách môžete pomocou príkazu On Error GoTo povedať Excelu, aby preskočil na určitý riadok kódu.
Napríklad v nasledujúcom malom kúsku kódu poviete Excelu, aby vydelil hodnotu v bunke A1 hodnotou v bunke A2, a potom umiestnite odpoveď do bunky A3. Jednoduché. Čo sa môže pokaziť?
Pod makro1()
Rozsah("A3").Hodnota = Rozsah("A1").Hodnota / Rozsah("A2").Hodnota
End Sub
Ako sa ukazuje, môžu sa pokaziť dve hlavné veci. Ak bunka A2 obsahuje 0, dostanete chybu delenia 0. Ak bunka A2 obsahuje nenumerickú hodnotu, zobrazí sa chyba nesúladu typu.
Ak sa chcete vyhnúť nepríjemnej chybovej správe, môžete Excelu povedať, že Pri chybe chcete, aby spustenie kódu preskočilo na štítok s názvom MyExit.
V nasledujúcom kóde za štítkom MyExit nasleduje správa pre používateľa, ktorá namiesto škaredého chybového hlásenia poskytuje priateľskú radu. Všimnite si tiež riadok Exit Sub pred štítkom MyExit, ktorý zaisťuje, že kód sa jednoducho ukončí, ak sa nevyskytne žiadna chyba:
Pod makro1()
Pri chybe GoTo MyExit
Rozsah("A3").Hodnota = Rozsah("A1").Hodnota / Rozsah("A2").Hodnota
Ukončiť Sub
MyExit:
MsgBox "Použite prosím platné nenulové čísla"
End Sub
Pri chybe Pokračujte ďalej
Niekedy chcete, aby Excel ignoroval chybu a jednoducho pokračoval v spúšťaní kódu. V týchto situáciách môžete použiť príkaz On Error Resume Next.
Napríklad nasledujúci kus kódu je určený na odstránenie súboru s názvom GhostFile.exe z adresára C:Temp. Po odstránení súboru sa používateľovi zobrazí pekné okno so správou, že súbor je preč:
Pod makro1()
Zabiť "C: TempGhostFile.exe"
MsgBox "Súbor bol odstránený."
End Sub
Kód funguje skvele, ak skutočne existuje súbor na odstránenie. Ak však z nejakého dôvodu súbor s názvom GhostFile.exe na jednotke C:Temp neexistuje, zobrazí sa chyba.
V tomto prípade je vám jedno, či tam súbor nie je, pretože ste ho aj tak chceli vymazať. Takže môžete jednoducho ignorovať chybu a pokračovať v kóde.
Pomocou príkazu On Error Resume Next sa kód spustí bez ohľadu na to, či cieľový súbor existuje alebo nie:
Pod makro1()
Pri chybe Pokračujte ďalej
Zabiť "C: TempGhostFile.exe"
MsgBox "Súbor bol odstránený."
End Sub
Pri chybe Prejsť na 0
Pri použití určitých chybových vyhlásení môže byť potrebné resetovať správanie VBA pri kontrole chýb. Aby ste pochopili, čo to znamená, pozrite si nasledujúci príklad.
Tu najprv chcete odstrániť súbor s názvom GhostFile.exe z adresára C: Temp. Aby ste sa vyhli chybám, ktoré môžu vyplývať zo skutočnosti, že cieľový súbor neexistuje, použite príkaz On Error Resume Next. Potom sa pokúsite urobiť nejakú podozrivú matematiku vydelením 100/Mike:
Pod makro1()
Pri chybe Pokračujte ďalej
Zabiť "C: TempGhostFile.exe"
Rozsah ("A3"). Hodnota = 100 / "Mike"
End Sub
Spustenie tohto kusu kódu by malo vygenerovať chybu v dôsledku nejasnej matematiky, ale nevyvoláva to. prečo? Pretože posledná inštrukcia, ktorú ste dali kódu, bola On Error Resume Next. Akákoľvek chyba, ktorá sa vyskytne po tomto riadku, bude účinne ignorovaná.
Na odstránenie tohto problému môžete použiť príkaz On Error GoTo 0 na obnovenie normálneho správania pri kontrole chýb:
Pod makro1()
Pri chybe Pokračujte ďalej
Zabiť "C: TempGhostFile.exe"
Pri chybe Prejsť na 0
Rozsah ("A3"). Hodnota = 100 / "Mike"
End Sub
Tento kód bude ignorovať chyby až do príkazu On Error GoTo 0. Po tomto vyhlásení sa kód vráti k normálnej kontrole chýb a spustí očakávanú chybu vyplývajúcu z fuzzy matematiky.