Zpracování chyb Excel VBA - vše, co potřebujete vědět!

Bez ohledu na to, jaké máte zkušenosti s kódováním VBA, chyby budou vždy součástí.

Rozdíl mezi nováčkem a odborným programátorem VBA spočívá v tom, že zkušení programátoři vědí, jak efektivně zvládat a používat chyby.

V tomto tutoriálu vám ukážu různé způsoby, jak můžete efektivně zpracovávat chyby v aplikaci Excel VBA.

Než se pustíme do zpracování chyb VBA, pojďme nejprve porozumět různým typům chyb, se kterými se pravděpodobně setkáte při programování v aplikaci Excel VBA.

Typy chyb VBA v aplikaci Excel

V aplikaci Excel VBA existují čtyři typy chyb:

  1. Chyby syntaxe
  2. Chyby kompilace
  3. Chyby za běhu
  4. Logické chyby

Pojďme rychle pochopit, jaké jsou tyto chyby a kdy se s nimi pravděpodobně setkáte.

Chyba syntaxe

Chyba syntaxe, jak název napovídá, nastane, když VBA najde něco špatně se syntaxí v kódu.

Pokud například zapomenete část příkazu/syntaxe, která je potřebná, zobrazí se chyba kompilace.

V níže uvedeném kódu, jakmile stisknu Enter za druhým řádkem, vidím chybu kompilace. Je to proto, že IF prohlášení potřebuje mít ‘Pak‘, Který v níže uvedeném kódu chybí.

Poznámka: Když píšete kód v aplikaci Excel VBA, zkontroluje každou větu, jakmile stisknete Enter. Pokud VBA najde něco, co chybí v syntaxi, okamžitě zobrazí zprávu s nějakým textem, který vám pomůže porozumět chybějící části.

Abyste se ujistili, že vidíte chybu syntaxe vždy, když něco chybí, musíte se ujistit, že je povolena kontrola automatické syntaxe. Chcete -li to provést, klikněte na „Nástroje“ a poté na „Možnosti“. V dialogovém okně možností se ujistěte, že je povolena možnost „Automatická kontrola syntaxe“.

Pokud je možnost „Automatická kontrola syntaxe“ deaktivována, VBA bude stále zvýrazňovat řádek s chybou syntaxe červeně, ale nezobrazí chybové dialogové okno.

Chyba kompilace

K chybám kompilace dochází, když chybí něco, co je potřeba ke spuštění kódu.

Například v níže uvedeném kódu, jakmile se pokusím spustit kód, zobrazí se následující chyba. K tomu dochází, protože jsem použil příkaz IF Then, aniž bych jej zavřel povinným „End If“.

Chyba syntaxe je také typem chyby kompilace. K chybě syntaxe dojde, jakmile stisknete klávesu Enter a VBA zjistí, že něco chybí. Chyba kompilace může také nastat, když VBA při psaní kódu nic nezjistí, ale objeví se, když je kód zkompilován nebo spuštěn.

VBA kontroluje každý řádek při psaní kódu a zvýrazňuje chybu syntaxe, jakmile je řádek nesprávný a stisknete Enter. Chyby kompilace, na druhé straně, jsou identifikovány pouze tehdy, když je celý kód analyzován VBA.

Níže jsou uvedeny některé scénáře, ve kterých narazíte na chybu kompilace:

  1. Použití příkazu IF bez konce IF
  2. Použití příkazu For s příkazem Next
  3. Použití příkazu Select bez použití End Select
  4. Proměnná není deklarována (funguje to pouze v případě, že je povolena možnost Explicit)
  5. Volání sub/funkce, která neexistuje (nebo se špatnými parametry)
Poznámka k „Explicitní možnosti“: Když přidáte „Možnost explicitní“, budete muset před spuštěním kódu deklarovat všechny proměnné. Pokud existuje nějaká proměnná, která nebyla deklarována, VBA zobrazí chybu. Je to dobrá praxe, protože ukazuje chybu v případě, že máte chybně napsanou proměnnou. Více o Option Explicit si můžete přečíst zde.

Chyby doby běhu

Chyby runtime jsou chyby, ke kterým dochází při spuštění kódu.

K chybám za běhu dojde pouze tehdy, když je postaráno o všechny chyby syntaxe a kompilace.

Pokud například spustíte kód, který má otevřít sešit aplikace Excel, ale tento sešit není k dispozici (buď odstraněn, nebo změněn název), kód by vám způsobil chybu za běhu.

Když dojde k chybě za běhu, kód se zastaví a zobrazí se chybové dialogové okno.

Zpráva v dialogovém okně Chyba spuštění je o něco užitečnější. Snaží se vysvětlit problém, který vám může pomoci jej napravit.

Pokud kliknete na tlačítko Debug, zvýrazní se část kódu, která vede k chybě.

Pokud jste chybu opravili, můžete kliknutím na tlačítko Spustit na panelu nástrojů (nebo stisknutím klávesy F5) pokračovat v spouštění kódu z místa, kde odešel.

Nebo také můžete z kódu vyjít kliknutím na tlačítko Konec.

Důležité: V případě, že v dialogovém okně kliknete na tlačítko Konec, zastaví se kód na řádku, na kterém je nalezen. Všechny řádky kódu před tím by však byly provedeny.

Logické chyby

Logické chyby by váš kód nezastavily, ale mohly by vést k nesprávným výsledkům. Mohou to být také nejobtížnější typy chyb při odstraňování problémů.

Tyto chyby nejsou kompilátorem zvýrazněny a je třeba je řešit ručně.

Jedním příkladem logické chyby (se kterou se často setkávám) je běh do nekonečné smyčky.

Jiným příkladem může být situace, kdy je výsledek špatný. Můžete například skončit s použitím nesprávné proměnné v kódu nebo přidat dvě proměnné tam, kde jedna není správná.

K řešení logických chyb používám několik způsobů:

  1. Vložte pole se zprávou na nějaké místo v kódu a zvýrazněte hodnoty/data, která vám pomohou pochopit, zda eberything probíhá podle očekávání.
  2. Místo toho, abyste kód spustili najednou, projděte každý řádek jeden po druhém. Chcete -li to provést, klikněte kamkoli v kódu a stiskněte klávesu F8. všimli byste si, že pokaždé, když stisknete F8, bude spuštěn jeden řádek. To vám umožní procházet kód po jednom řádku a identifikovat logické chyby.

Použití ladění k vyhledání chyb kompilace/syntaxe

Jakmile budete s kódem hotovi, je vhodné jej nejprve zkompilovat před spuštěním.

Chcete -li zkompilovat kód, klikněte na možnosti Debug na panelu nástrojů a klikněte na Compile VBAProject.

Když kompilujete projekt VBA, projde kódem a identifikuje chyby (pokud existují).

V případě, že najde chybu, zobrazí vám dialogové okno s chybou. Najde chyby jednu po druhé. Pokud tedy najde chybu a vy jste ji opravili, musíte znovu spustit kompilaci, abyste našli další chyby (pokud existují).

Když váš kód neobsahuje chyby, bude možnost Kompilovat VBAProject šedá.

Kompilace najde pouze chyby „Syntaxe“ a „Kompilace“. Nenajde chyby za běhu.

Při psaní kódu VBA nechcete, aby se chyby objevovaly. Abyste tomu zabránili, můžete použít mnoho metod zpracování chyb.

V příštích několika částech tohoto článku se budu zabývat metodami, které můžete použít pro zpracování chyb VBA v aplikaci Excel.

Konfigurace nastavení chyb (zpracované vs. neošetřené chyby)

Než začnete pracovat s kódem, musíte zkontrolovat jedno nastavení v aplikaci Excel VBA.

Přejděte na panel nástrojů VBA a klikněte na Nástroje a poté klikněte na Možnosti.

V dialogovém okně Možnosti klikněte na kartu Obecné a ujistěte se, že ve skupině „Chybové chytání“ je zaškrtnuto políčko „Přerušit neošetřené chyby“.

Dovolte mi vysvětlit tři možnosti:

  1. Přestávka na všechny chyby: Tím se zastaví váš kód u všech typů chyb, i když jste použili techniky ke zpracování těchto chyb.
  2. Přestávka v modulu třídy: Tím se zastaví váš kód u všech neošetřených chyb a zároveň, pokud používáte objekty, jako jsou Userforms, se v těchto objektech také rozbije a zvýrazní přesný řádek způsobující chybu.
  3. Přestávka na neošetřené chyby: Tím se váš kód zastaví pouze u chyb, které nejsou zpracovány. Toto je výchozí nastavení, protože zajišťuje upozornění na všechny neošetřené chyby. Pokud používáte objekty, jako jsou Userforms, nezvýrazní se řádek způsobující chybu v objektu, ale zvýrazní se pouze řádek, který odkazuje na daný objekt.
Poznámka: Pokud pracujete s objekty, jako jsou Userforms, můžete toto nastavení změnit na „Break on Class Modules“. Rozdíl mezi č. 2 a č. 3 je ten, že když použijete přerušení v modulu třídy, přenese vás na konkrétní řádek v objektu, který způsobuje chybu. Můžete se také rozhodnout jít místo toho „Přerušit neošetřené chyby“.

Stručně řečeno - pokud s aplikací Excel VBA teprve začínáte, zkontrolujte, zda je zaškrtnuto políčko „Přerušit neošetřené chyby“.

Zpracování chyb VBA s příkazy „Při chybě“

Když váš kód narazí na chybu, můžete udělat několik věcí:

  1. Ignorujte chybu a nechte kód pokračovat
  2. Mějte na místě kód pro zpracování chyb a spusťte jej, když dojde k chybě

Obě tyto metody zpracování chyb zajišťují, že koncový uživatel neuvidí chybu.

K jejich provedení můžete použít několik příkazů „Při chybě“.

Při chybě Pokračovat Další

Když v kódu použijete „On Error Resume Next“, veškerá zjištěná chyba bude ignorována a kód bude nadále běžet.

Tato metoda zpracování chyb se používá poměrně často, ale při jejím používání musíte být opatrní. Jelikož zcela ignoruje všechny chyby, ke kterým může dojít, je možné, že nebudete schopni identifikovat chyby, které je třeba opravit.

Pokud je například spuštěn níže uvedený kód, vrátí chybu.

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

K tomu dochází, protože číslo nemůžete vydělit nulou.

Pokud ale v tomto kódu použiji příkaz „On Error Resume Next“ (jak je uvedeno níže), bude chybu ignorovat a nebudu vědět, že existuje problém, který je třeba opravit.

Sub AssignValues ​​() On Error Resume Další x = 20/4 y = 30/0 0 End Sub

On Error Resume Next by měl být použit pouze tehdy, když jasně znáte druh chyb, které by měl váš kód VBA vyvolat, a je v pořádku jej ignorovat.

Níže je například kód události VBA, který by okamžitě přidal hodnotu data a času do buňky A1 nově vloženého listu (tento kód je přidán do listu a ne do modulu).

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

I když to ve většině případů funguje skvěle, zobrazilo by to chybu, kdybych místo listu přidal list grafu. Protože list grafu neobsahuje buňky, kód by vyvolal chybu.

Pokud tedy v tomto kódu použiji příkaz „On Error Resume Next“, bude to fungovat podle očekávání s listy a nic neudělat s listy grafů.

Soukromý dílčí sešit_Nový list (objekt ByVal Sh jako objekt) Při chybě Pokračovat Další Sh.Range ("A1") = Formát (Nyní "dd-mmm-rrrr hh: mm: ss") End Sub

Poznámka: On Error Resume Další prohlášení je nejlepší použít, když víte, s jakými chybami se pravděpodobně setkáte. A pokud si myslíte, že je bezpečné tyto chyby ignorovat, můžete to použít.

Tento kód můžete posunout na další úroveň analýzou, pokud došlo k chybě, a zobrazením příslušné zprávy.

Níže uvedený kód by zobrazil okno se zprávou, které by uživatele informovalo, že nebyl vložen list.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") If Err.Number 0 Then MsgBox "Vypadá jako vy vložen list s grafem "& vbCrLf &" Chyba - "& Err.Popis Konec Pokud Konec Sub

„Err.Number“ se používá k získání čísla chyby a „Err.Description“ se používá k získání popisu chyby. Ty budou popsány později v tomto kurzu.

Při chybě GoTo 0

„On Error GoTo 0“ zastaví kód na řádku, který způsobuje chybu, a zobrazí okno se zprávou, které chybu popisuje.

Jednoduše řečeno, umožňuje výchozí chování při kontrole chyb a zobrazuje výchozí chybovou zprávu.

Proč to tedy vůbec používat?

Normálně nemusíte používat „On Error Goto 0“, ale může to být užitečné, když jej používáte ve spojení s „On Error Resume Next“

Nech mě to vysvětlit!

Níže uvedený kód by vybral všechny prázdné buňky ve výběru.

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

Pokud by ve vybraných buňkách nebyly žádné prázdné buňky, ukázalo by to chybu.

Abyste se vyhnuli zobrazení chyby, můžete použít On Error Resume next ’

Nyní také zobrazí jakoukoli chybu při spuštění níže uvedeného kódu:

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

Zatím je vše dobré!

Problém nastává, když je část kódu, kde může dojít k chybě, a protože používáte „On Error Resume Next“, kód by jej jednoduše ignoroval a přesunul se na další řádek.

Například v níže uvedeném kódu by nebyla žádná chybová výzva:

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

Ve výše uvedeném kódu existují dvě místa, kde může dojít k chybě. První místo je místo, kde vybíráme všechny prázdné buňky (pomocí Selection.SpecialCells) a druhé je ve zbývajícím kódu.

Očekává se první chyba, ale jakákoli chyba poté není.

To je místo, kde při chybě přejděte na záchranu 0.

Když ho použijete, obnovíte výchozí nastavení chyb, kde začne zobrazovat chyby, když na něj narazí.

Například v níže uvedeném kódu by nebyla žádná chyba v případě, že nejsou žádné prázdné buňky, ale došlo by k chybě kvůli '10/0 '

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

Při chybě Přejít [Štítek]

Výše uvedené dvě metody - „On Error Resume Next“ a „On Error Goto 0“ - nám nedovolují chybu skutečně zpracovat. Jeden způsobí, že kód chybu ignoruje, a druhý obnoví kontrolu chyb.

On Error Go [Label] je způsob, pomocí kterého můžete určit, co chcete dělat v případě, že váš kód obsahuje chybu.

Níže je struktura kódu, která používá tento obslužný program chyb:

Dílčí test () Při chybě GoTo Label: X = 10 /0 'tento řádek způsobí chybu' …. Váš zbývající kód jde sem Exit Sub Label: 'kód pro zpracování chyby End Sub

Všimněte si toho, že před zpracováním chyb „Štítek“ je dílčí výstup. Tím je zajištěno, že v případě, že nedojde k žádným chybám, bude dílčí ukončen a kód „Label“ nebude proveden. V případě, že nepoužíváte Exit Sub, vždy spustí kód „Label“.

V níže uvedeném příkladu kódu, když dojde k chybě, kód skočí a spustí kód v sekci obslužné rutiny (a zobrazí okno se zprávou).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 0 Z = 30 Exit Sub ErrMsg: MsgBox "Zdá se, že došlo k chybě" & vbCrLf & Err.Popis Konec Sub

Všimněte si, že když dojde k chybě, kód již byl spuštěn a spuštěn řádky před řádkem způsobujícím chybu. Ve výše uvedeném příkladu kód nastaví hodnotu X jako 12, ale protože k chybě dojde v dalším řádku, nenastaví hodnoty pro Y a Z.

Jakmile kód přeskočí na kód obslužné rutiny chyb (v tomto případě ErrMsg), bude pokračovat ve spouštění všech řádků v kódu obslužného programu chyb a pod ním a ukončení dílčího programu.

Při chybě Přejít na -1

Toto je trochu komplikované a ve většině případů to pravděpodobně nebudete používat.

Ale budu to stále pokrývat, protože jsem se setkal se situací, kdy to bylo potřeba (klidně ignorujte a přeskočte na další část, pokud hledáte pouze základy).

Než se pustím do mechaniky, zkusím vysvětlit, kde to může být užitečné.

Předpokládejme, že máte kód, kde došlo k chybě. Ale vše je v pořádku, protože máte jeden obslužný program chyb. Ale co se stane, když je v kódu obsluhy chyb jiná chyba (jo … něco jako úvodní film).

V takovém případě nemůžete použít druhý ovladač, protože první chyba nebyla odstraněna. I když jste zvládli první chybu, v paměti VBA stále existuje. A paměť VBA má místo pouze pro jednu chybu - ne pro dvě nebo více.

V tomto scénáři můžete použít On Error Goto -1.

Vymaže chybu a uvolní paměť VBA pro zpracování další chyby.

Dost řečí!

Pojďme to nyní vysvětlit pomocí příkladů.

Předpokládejme, že mám níže uvedený kód. To způsobí chybu, protože tam je dělení nulou.

Sub Errorhandler () X = 12 Y = 20/0 Z = 30 End Sub

Abych to zvládl, používám kód obsluhy chyb (s názvem ErrMsg), jak je uvedeno níže:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 0 Z = 30 Exit Sub ErrMsg: MsgBox "Zdá se, že došlo k chybě" & vbCrLf & Err.Popis Konec Sub

Nyní je vše opět v pořádku. Jakmile dojde k chybě, použije se obslužný program chyb a zobrazí se okno se zprávou, jak je uvedeno níže.

Nyní rozbalím kód, abych měl více kódu v obsluze chyb nebo po ní.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Zdá se, že došlo k chybě" & vbCrLf & Err.Popis A = 10 /2 B = 35 /0 Konec Sub

Protože první chyba byla zpracována, ale druhá nebyla, znovu vidím chybu, jak je uvedeno níže.

Stále vše dobré. Kód se chová tak, jak jsme očekávali.

Abych zvládl druhou chybu, používám jiný obslužný program chyb (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Zdá se, že došlo k chybě" & vbCrLf & Err.Popis při chybě GoTo ErrMsg2 A = 10/2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Zdá se, že je opět chyba" & vbCrLf & Err.Popis Konec Sub

A tady to je nefunguje podle očekávání.

Pokud spustíte výše uvedený kód, stále vám to způsobí chybu běhu, a to i poté, co bude na místě druhý obslužný program chyb.

K tomu dochází, protože jsme nevymazali první chybu z paměti VBA.

Ano, zvládli jsme to! Ale stále zůstává v paměti.

A když VBA narazí na další chybu, stále se zasekne s první chybou, a proto není použit druhý obslužný program chyb. Kód se zastaví na řádku, který způsobil chybu, a zobrazí výzvu k chybě.

Chcete -li vymazat paměť VBA a vymazat předchozí chybu, musíte použít „On Error Goto -1“.

Pokud tedy přidáte tento řádek do níže uvedeného kódu a spustíte jej, bude fungovat podle očekávání.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Ukončit Sub ErrMsg: MsgBox "Zdá se, že došlo k chybě" & vbCrLf & Err. Popis On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Exit Sub ErrMsg2: MsgBox "Zdá se, že je opět chyba" & vbCrLf & Err.Popis Konec Sub
Poznámka: Chyba skončí automaticky, když podprogram skončí.„On Error Goto -1“ může být užitečné, když ve stejném podprogramu získáte dvě nebo více než dvě chyby.

Objekt Err

Kdykoli u kódu dojde k chybě, je to objekt Err, který slouží k získání podrobností o chybě (například číslo chyby nebo popis).

Chybné vlastnosti objektu

Objekt Err má následující vlastnosti:

Vlastnictví Popis
Číslo Číslo, které představuje typ chyby. Pokud nedojde k žádné chybě, je tato hodnota 0
Popis Krátký popis chyby
Zdroj Název projektu, ve kterém došlo k chybě
HelpContext ID kontextu nápovědy pro chybu v souboru nápovědy
Soubor nápovědy Řetězec, který představuje umístění složky a název souboru souboru nápovědy

Zatímco ve většině případů nepotřebujete použít objekt Err, někdy může být užitečné při zpracování chyb v aplikaci Excel.

Předpokládejme například, že máte datovou sadu, jak je uvedeno níže, a pro každé číslo ve výběru chcete vypočítat druhou odmocninu v sousední buňce.

Níže uvedený kód to dokáže, ale protože v buňce A5 je textový řetězec, zobrazí chybu, jakmile k tomu dojde.

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 typem chybové zprávy spočívá v tom, že vám neposkytne nic o tom, co se pokazilo a kde k problému došlo.

Objekt Err můžete použít k tomu, aby tyto chybové zprávy byly smysluplnější.

Pokud například nyní použiji níže uvedený kód VBA, zastaví kód, jakmile dojde k chybě, a zobrazí okno se zprávou s adresou buňky buňky, 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 v:" & cell.Address End Sub

Výše uvedený kód by vám poskytl mnohem více informací než jednoduché „Neshoda typu“, zejména adresu buňky, abyste věděli, kde došlo k chybě.

Tento kód můžete dále upřesnit, abyste se ujistili, že váš kód běží až do konce (místo toho, aby se lámal při každé chybě), a poté vám poskytne seznam adres buněk, kde k chybě dochází.

Následující kód by to udělal:

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

Výše uvedený kód běží až do konce a dává druhou odmocninu všech buněk, které obsahují čísla (v sousedním sloupci). Poté se zobrazí zpráva se seznamem všech buněk, kde došlo k chybě (jak je uvedeno níže):

Metody chybného objektu

Zatímco vlastnosti Err jsou užitečné k zobrazení užitečných informací o chybách, existují také dvě metody Err, které vám mohou pomoci při zpracování chyb.

Metoda Popis
Průhledná Vymaže všechna nastavení vlastností objektu Err
Vyzdvihnout Generuje chybu za běhu

Pojďme se rychle naučit, co to je a jak/proč je používat s VBA v Excelu.

Err Clear Method

Předpokládejme, že máte datovou sadu, jak je uvedeno níže, a chcete získat odmocninu všech těchto čísel v sousedním sloupci.

Následující kód získá odmocniny všech čísel v sousedním sloupci a zobrazí zprávu, že došlo k chybě pro buňku A5 a A9 (protože tyto 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 následujících buňkách" & ErrorCells End Sub

Všimněte si, že jsem použil metodu Err.Clear v příkazu If Then.

Jakmile dojde k chybě a je zachycena podmínkou If, metoda Err.Clear resetuje číslo chyby zpět na 0. Tím je zajištěno, že podmínka IF zachytí chyby pouze u buněk, kde je vyvolána.

Kdybych nepoužil metodu Err.Clear, jakmile dojde k chybě, vždy by to platilo za podmínky IF a číslo chyby nebylo resetováno.

Dalším způsobem, jak tuto práci provést, je použití funkce On Error Goto -1, která chybu zcela resetuje.

Poznámka: Err.Clear se liší od On Error Goto -1. Err.Clear vymaže pouze popis chyby a číslo chyby. úplně to neresetuje. To znamená, že pokud ve stejném kódu existuje další instance chyby, nebudete ji moci zvládnout před resetováním (což lze provést pomocí „On Error Goto -1“ a nikoli pomocí „Err.Clear“).

Metoda Err Raise

Metoda Err.Raise vám umožňuje vyvolat chybu za běhu.

Níže je syntaxe použití metody Err.Raise:

Err.Raise [číslo], [zdroj], [popis], [soubor nápovědy], [kontext nápovědy]

Všechny tyto argumenty jsou volitelné a můžete je použít, aby vaše chybová zpráva měla smysl.

Proč byste ale někdy chtěli sami vyvolat chybu?

Dobrá otázka!

Tuto metodu můžete použít, když dojde k instanci chyby (což znamená, že stejně dojde k chybě) a poté tuto metodu použijete k informování uživatele o chybě (namísto méně užitečné chybové zprávy, kterou zobrazuje VBA ve výchozím stavu).

Předpokládejme například, že máte datovou sadu, jak je uvedeno níže, a chcete, aby všechny buňky měly pouze čí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 "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Výše uvedený kód by zobrazoval chybovou zprávu, která má zadaný popis a kontextový soubor.

Osobně jsem nikdy nepoužil Err.Raise, protože většinou pracuji pouze s aplikací Excel. Ale pro někoho, kdo používá VBA pro práci s Excelem spolu s dalšími aplikacemi, jako je Outlook, Word nebo PowerPoint, to může být užitečné.

Zde je podrobný článek o metodě Err.Raise pro případ, že se chcete dozvědět více.

Osvědčené postupy při zpracování chyb VBA

Bez ohledu na to, jak zruční jste při psaní kódu VBA, chyby budou vždy součástí. Nejlepší kodéři jsou ti, kteří mají schopnosti tyto chyby správně zpracovat.

Zde je několik doporučených postupů, které můžete použít při zpracování chyb v aplikaci Excel VBA.

  1. Na začátku kódu použijte „On Error Go [Label]“. Tím zajistíte, že budou zpracovány všechny chyby, které se odtud mohou stát.
  2. „Pokračovat dále při chybě“ použijte POUZE tehdy, když jste si jisti chybami, které mohou nastat. Použijte jej pouze s očekávanou chybou. V případě, že ho použijete s neočekávanými chybami, jednoduše ho bude ignorovat a pohne se vpřed. Pokud chcete ignorovat určitý typ chyby a zachytit zbytek, můžete použít „On Error Resume Next“ s „Err.Raise“.
  3. Při používání obslužných rutin chyb se ujistěte, že před obslužnými rutinami používáte Exit Sub. Tím zajistíte, že kód obsluhy chyb bude spuštěn pouze v případě chyby (jinak bude spuštěn vždy).
  4. K zachycení různých druhů chyb použijte více obslužných rutin chyb. Díky obsluze více chyb zajistíte, že bude chyba správně vyřešena. Například byste chtěli zpracovat chybu „neshoda typu“ jinak než chyba při běhu „dělení 0“.

Doufám, že jste našli tento článek aplikace Excel užitečný!

Zde je několik dalších výukových programů Excel VBA, které by se vám mohly líbit:

  • Datové typy aplikace Excel VBA - kompletní průvodce
  • Smyčky Excel VBA - Pro další, Do while, Do Do, pro každou
  • Události aplikace Excel VBA - snadný (a kompletní) průvodce
  • Excel Visual Basic Editor - jak jej otevřít a používat v Excelu

Vám pomůže rozvoji místa, sdílet stránku s přáteli

wave wave wave wave wave