Přeskočit na obsah

Řešení chybVBA

Vrací nebo nastavuje číslo chyby, která byla zachycena objektem Err.

Výstupem bude číslo, které udává danou chybu ve VBA kódu. Těchto čísel je několik desítek. Funkce se hodí v případě, kdy je počítáno s určitou chybou v kódu nebo je nutné pro jistotu ošetřit případ, kdy by chyba v kódu mohla nastat. Err.Number nemůže stát v kódu samostatně, často se používá např. s přeskočením chyby a pokračováním na dalším řádku kódu objektem On error Resume Next nebo On Error Go To.

Err.Number

Příkaz nemá žádné argumenty.

Následující příklad vyhodí error z důvodu, že 0 nelze dělit. Číslo tohoto erroru je 11. Aby VBA nevyhodilo dialogové okno erroru a kód pokračoval v dalších řádcích, je nutné nastavit pokračování kódu pomocí On Error Resume next. Následně je proveden řádek s dělením nulou a do funkce Msgbox bude vráceno číslo erroru 11 a popis daného erroru pomocí Err.Description.

On Error Resume Next

x = 5 / 0

MsgBox „Chybové číslo: “ & Err.Number “ a text chyby: “ & Err.Description

Pokud by nastal error, má se jít na určitou jinou část kódu. Zde bude opět error dělení nulou, kdy na řádku s výpočtem a dosazením do funkce „x“ z důvodu erroru se kód přesune na pojmenovanou část ErrorNumber díky kódu On Error GoTo. Kód s proměnnou „y“ tak nebude vůbec proveden a rovnou se ukáže MsgBox s číslem chyby.

On Error GoTo ErrorNumber

x = 5 / 0

y = 4 / x

ErrorNumber:

MsgBox „Chybové číslo: “ & Err.Number

Vrací textový popis poslední chyby.

Výstupem bude text definující o jakou chybu se jedná. Těchto vysvětlení je několik desítek. Funkce se hodí v případě, kdy je počítáno s určitou chybou v kódu nebo je nutné pro jistotu ošetřit případ, kdy by chyba v kódu mohla nastat a zároveň dá uživateli vědět, o jakou chybu se jednalo. Err.Description nemůže stát v kódu samostatně, často se používá např. s přeskočením chyby a pokračováním na dalším řádku kódu objektem On error Resume Next nebo On Error Go To.

Err.Description

Příkaz nemá žádné argumenty.

Následující příklad vyhodí error z důvodu, že nelze dělit nulou. Aby VBA nevyhodilo dialogové okno erroru a kód pokračoval v dalších řádcích, je nutné nastavit pokračování kódu pomocí On Error Resume next. Následně je proveden řádek s dělením nulou a do funkce Msgbox bude vráceno číslo erroru 11objektem Err.Number a popis daného erroru.

On Error Resume Next

x = 5 / 0

MsgBox „Chybové číslo: “ & Err.Number “ a text chyby: “ & Err.Description

Pokud by nastal error, má se jít na určitou jinou část kódu. Zde bude opět error dělení nulou, kdy na řádku s výpočtem a dosazením do funkce „x“ z důvodu erroru se kód přesune na pojmenovanou část ErrorText díky kódu On Error GoTo. Kód s proměnnou „y“ tak nebude vůbec proveden a rovnou se ukáže MsgBox s popisem chyby.

On Error GoTo ErrorText

x = 5 / 0

y = 4 / x

ErrorText:

MsgBox „Chyba: “ & Err.Description

Vymaže informace o chybě v objektu Err.

Pokud se v kódu objeví určitá chyba, uloží se do objektu Err, který je následně vypsat např. pomocí Err.Number nebo Err.Description. Po vypsání nebo práci s errorem je následně možné tento error z objektu Err vymazat tímto příkazem a pokračovat s další částí kódu.

Err.Clear

Příkaz nemá žádné argumenty.

V následujícím příkladu bude vypsáno číslo chyby pomocí Err.Number, kdy je nutné nejprve kódu říct, že má pokračovat s dalšími řádky kódu v případě chyby pomocí On Error Resume Next. Následně je chybové číslo vypsáno pomocí funkce MsgBox. Error je vymazán a v další funkci MsgBox již bude vypsána 0 jako žádný error kvůli jeho vymazání.

On Error Resume Next

x = 5 / 0

MsgBox „Chybové číslo před vymazáním: “ & Err.Number

Err.Clear

MsgBox „Chybové číslo po vymazání: “ & Err.Number

Přeskočí chybu a pokračuje na dalším řádku kódu.

Tento objekt nemá žádný výstup. Pouze v případě, kdy bude v kódu jakýkoliv error, tak nebude zobrazen v dialogovém okně ale bude se dále pokračovat s dalšími řádky kódu i v případě chyby. Příkaz se hodí ve chvíli, kdy je v určité části kódu očekáván error a tím pádem nevyskočí chyba, ale bude se pokračovat. Je možné využít např. v cyklech nebo podmínkách popř. vypsáním daného erroru pro uživatele. Více praktické je však používání práce s errory pomocí On Error GoTo.

On Error Resume Next

Příkaz nemá žádné argumenty.

V příkladu je ošetřena situace, kdy daný list v sešitu neexistuje a tak by nemohl být vymazán, proto bude kód přeskočen. Pokud list se stejným názvem v sešitu existuje, byl by vymazán.

On Error Resume Next

ThisWorkbook.Sheets(„NovyList“).Delete

V příkladu je zkoumáno, zdali list v sešitu existuje. Pokud existuje, do proměnné „WorksheetExists“ se propíše True. Pokud ale neexistuje, bude proměnná prázdná a pomocí MsgBox bude vypsáno číslo chyby a popis chyby pomocí Err.Number a Err.Description. Pokud by zde nebyl příkaz „On Error Resume Next“ a list neexistoval, řádek s proměnnou „WorksheetExists“ by nebyl proveden a zobrazilo by se okno s chybou a další řádky by nebyly provedeny.

On Error Resume Next

WorksheetExists = Not ThisWorkbook.Sheets(„NovyList“) Is Nothing

If Err.Number <> 0 Then

MsgBox Err.Number & “ “ & Err.Description

Else

MsgBox (WorksheetExists)

End If

Přesměruje proces kódu na vlastní obsluhu chyb v případě chyby.

Ve VBA můžou nastat chyby jako neexistující list, nenalezení hodnoty, nemožnost použití funkce na datech a další možné chyby. Pokud lze předvídat, že daná chyba nastane, je možné použít jiný blok kódu díky přesměrování exekuce kódu na specifikovanou část díky tohoto příkazu. Pokud tedy chyba nastane v určitém řádku kódu, veškeré další řádky kódu pod chybou budou přeskočeny a půjde se na specifikovanou část, kde je možné buďto provést jinou část kódu nebo dát uživateli vědět, že nastala chyba. Pokud nemá být přesměrovaný kód ale má být pouze ukázána chyba, je možné za příkaz zadat 0, čímž při jakékoliv chybě bude zobrazeno okno s danou chybou a je možné proces ukončit nebo zapnout debugger mód. Možnost 0 by však neměla být používána, jelikož kód nijak neproběhne a vyskočí okno s chybou, což nemusí být žádoucí.

On Error GoTo [label]

Label – Vlastní název řádku, kam má kód přeskočit.

V případě, kde nebude nalezen list podle jeho názvu, nebude ukázán error ale půjde se na řádek, kde je specifikován label „Chyba“. Následně se do proměnné „worksheetExists“ propíše list na základě indexu, tedy první list. Pokud by list s daným názvem existoval, za pomocí MsgBox by byl vypsán do dialogového okna.

Dim worksheetExists As Worksheet

On Error GoTo Chyba

Set worksheetExists = ThisWorkbook.Sheets(„NovyList“)

MsgBox (worksheetExists.Name)

Chyba:

Set worksheetExists = ThisWorkbook.Sheets(1)

… Další proces kódu

Pokud nebude nalezen list dle názvu, má vyskočit okno s chybou, jelikož je nastaveno na výchozí hodnotu 0.

Dim worksheetExists As Worksheet

On Error GoTo 0

Set worksheetExists = ThisWorkbook.Sheets(„NovyList“)

MsgBox (worksheetExists)

Určuje, zda hodnota představuje chybu.

Funkce lze použít v podmínce If. Pokud by např. byl v dané proměnné nebo výrazu error, může být proveden jiný blok kódu než v případě, kdy by chyba nenastala. Pokud skutečně ale error nastal, bude vyhodnocena funkce jako error a vyskočí okno s errorem, pokud nemá být uměle vyvolán error např. pomocí příkazu CVErr. Pokud nemá být okno s errorem zobrazeno, je nutné příkaz kombinovat např. s On Error GoTo nebo On Error Resume Next.

IsError(expression)

Expression – výraz, který se testuje.

IsError(1/0) – Vyskočí okno s chybou, že nelze dělit nulou.

Použití s ostatními funkcemi

Sekce “Použití s ostatními funkcemi”

V následujícím příkladu se má pokračovat v provedení kódu pomocí On Error Resume Next v případě chyby. Pokud nebude list v sešitu existovat, podmínka se vyhodnotí jako pravdivá a bude vypsána daná chyba pomocí Err.Description.

On Error Resume Next

If IsError(ThisWorkbook.Sheets(„Název“)) Then

MsgBox („Vyskytl se error: “ & Err.Description)

End If

Vytvoří vlastní chybu.

Lze zvolit, jaká chyba se má vytvořit a často slouží spíše k testování vlastních chyb, které v kódu mohou nastat. Příkaz je nutné uložit do proměnné.

CVErr(errorNumber)

errorNumber – číslo chyby, která má být vytvořena.

CVErr(11) – Vytvoří chybu dělení nulou.

Použití s ostatními funkcemi

Sekce “Použití s ostatními funkcemi”

Tvorba chyby a následně zjištění, zdali se skutečně jedná o chybu pomocí funkce IsError.

result = CVErr(11) ‚ Vytvoří chybu

MsgBox „Je chyba? “ & IsError(result)

Vrací textový popis chyby na základě čísla chyby.

Jedná se zejména o funkci testování možnosti chyb v kódu popř. zjištění, o jakou chybu se jedná, pokud je zobrazeno okno s chybou a není jasné, o jakou chybu se jedná. Stačí vypsat číslo chyby do funkce a zobrazí se text dané chyby.

Error(errorNumber)

errorNumber – číslo chyby.

result = Error(11) – Vrátí popis chyby dělení nulou.

result = Error(200) – Vrátí popis chyby objektově nebo aplikačně definovaného erroru.

Použití s ostatními funkcemi

Sekce “Použití s ostatními funkcemi”

Tvorba chyby a následně zjištění, zdali se skutečně jedná o chybu pomocí funkce IsError.

result = Error(110)

MsgBox „Je chyba? “ & IsError(result)

Vyvolá vlastní chybu.

Většina obecných chyb, které můžou nastat v datech resp. kódu je již zabudována ve VBA. Pokud je nutné vytvořit určitou svou vlastní chybu pro vlastní proces, je možné využít příkazu raise, kde je možné specifikovat text a číslo vlastní chyby. Často se příkaz používá s funkcemi.

Err.Raise errorNumber, [source], [description]

errorNumber (povinný) – Číslo chyby. Číslo mezi 0 – 512 je rezervováno pro systémové chyby. Od 513 do 65 535 je možné využít jedno z čísel pro vlastní error.

source (volitelný) – Vlastní název modulu/funkce.

description (volitelný) – Vlastní popis chyby.

Err.Raise 515, „zkouska“, „Nesprávná hodnota“ – Definice čísla erroru, modulu a popisu.

Err.Raise 515,, „Nesprávná hodnota“ – Definice čísla erroru a popisu

Slouží k ověřování podmínek během debuggingu.

Příkaz se používá za funkcí Debug. Následně je nutné zadat podmínku, která je pravdivá, jinak se kód zastaví.

Debug.Assert condition

Condition – výraz, který by měl být pravdivý.

Debug.Assert 10 > 5 – Podmínka platí, tedy kód bude pokračovat.

Debug.Assert 4 > 5 – Podmínka neplatí a exekuce kódu se zastaví na tomto řádku.

© 2026 Excelland