Když se potřebujete vypořádat s chybami v Excel VBA, můžete použít příkaz OnError. Nejprve však musíte vědět několik věcí. Příkaz On Error můžete použít třemi způsoby.
Syntax |
Co to dělá |
Na štítku Error GoTo |
Po provedení tohoto příkazu VBA obnoví provádění na
příkazu následujícím za zadaným štítkem.
Za štítkem musíte vložit dvojtečku , aby jej VBA rozpoznal jako štítek. |
Při chybě GoTo 0 |
Po provedení tohoto příkazu VBA obnoví své normální
chování při kontrole chyb. Tento příkaz použijte po použití jednoho z
dalších příkazů On Error nebo když chcete
ve své proceduře odstranit zpracování chyb . |
Při chybě pokračovat dále |
Po provedení tohoto příkazu VBA jednoduše ignoruje všechny chyby
a obnoví provádění dalším příkazem. |
Obnovení po chybě
V některých případech jednoduše chcete, aby rutina skončila elegantně, když dojde k chybě. Můžete například zobrazit zprávu popisující chybu a poté ukončit postup. (Tuto techniku používá výše uvedený příklad EnterSquareRoot5.) V ostatních případech se chcete po chybě zotavit, pokud je to možné.
Chcete-li se zotavit z chyby, musíte použít příkaz Resume. Tím se vymaže chybový stav a umožní vám pokračovat v provádění na určitém místě. Příkaz Resume můžete použít třemi způsoby.
Syntax |
Co to dělá |
Životopis |
Provádění bude pokračovat s příkazem, který způsobil chybu. Použijte
to, pokud váš kód pro zpracování chyb problém opraví a
můžete pokračovat. |
Pokračovat dále |
Provádění se obnoví s příkazem bezprostředně následujícím po
příkazu, který způsobil chybu. Tím se
chyba v podstatě ignoruje . |
Obnovit štítek |
Provádění bude pokračovat na štítku, který určíte. |
Následující příklad používá příkaz Resume poté, co dojde k chybě:
Sub EnterSquareRoot6()
Dim Num jako varianta
Dim Msg As String
Dim Ans As Integer
Zkus to znovu:
' Nastavte zpracování chyb
Při chybě GoTo BadEntry
' Dotázat se na hodnotu
Num = InputBox(“Zadejte hodnotu”)
If Num = „“ Pak Exit Sub
' Vložte druhou odmocninu
ActiveCell.Value = Sqr (Num)
Exit Sub
BadEntry:
Msg = Err.Number & “: “ & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & „Ujistěte se, že je vybrán rozsah,“
Msg = Msg & „list není chráněn,“
Msg = Msg & "a zadáte nezápornou hodnotu."
Msg = Msg & vbNewLine & vbNewLine & "Zkusit znovu?"
Ans = MsgBox(Msg, vbYesNo + vbCritical)
Pokud Ans = vbYes, pak pokračujte v pokusu znovu
End Sub
Tento postup má další označení: TryAgain. Pokud dojde k chybě, provádění pokračuje na štítku BadEntry a kód zobrazí zprávu níže. Pokud uživatel odpoví kliknutím na Ano, spustí se příkaz Resume a provedení skočí zpět na štítek TryAgain. Pokud uživatel klepne na Ne, postup se ukončí.
Pokud dojde k chybě, uživatel se může rozhodnout, zda to zkusí znovu.
Všimněte si, že chybová zpráva obsahuje také číslo chyby spolu s „oficiálním“ popisem chyby.
Před pokračováním příkaz Resume vymaže chybový stav. Chcete-li to vidět, zkuste nahradit předposlední příkaz v předchozím příkladu následujícím příkazem:
If Ans = vbYes Then GoTo TryAgain
Kód nefunguje správně, pokud místo Resume používáte GoTo. Pro demonstraci zadejte záporné číslo. Zobrazí se chybová zpráva. Klepnutím na Ano to zkuste znovu a poté zadejte další záporné číslo. Tato druhá chyba není zachycena, protože původní chybový stav nebyl vymazán.
Ošetření chyb ve zkratce
Abychom vám pomohli udržet všechny tyto záležitosti týkající se odstraňování chyb v pořádku, uvádíme rychlé a špinavé shrnutí. Blok kódu pro zpracování chyb má následující vlastnosti:
-
Začíná bezprostředně po štítku zadaném v příkazu On Error.
-
Makro by ho mělo dosáhnout pouze v případě, že dojde k chybě. To znamená, že musíte bezprostředně před štítkem použít příkaz jako Exit Sub nebo Exit Function.
-
Může vyžadovat prohlášení Resume. Pokud se rozhodnete nepřerušit proceduru, když dojde k chybě, musíte před návratem k hlavnímu kódu provést příkaz Resume.
Vědět, kdy chyby ignorovat
V některých případech je naprosto v pořádku chyby ignorovat. Tehdy přichází na řadu příkaz On Error Resume Next.
Následující příklad prochází každou buňku ve vybraném rozsahu a převádí hodnotu na druhou odmocninu. Tento postup vygeneruje chybovou zprávu, pokud některá buňka ve výběru obsahuje záporné číslo nebo text:
Sub SelectionSqrt()
Ztlumit buňku jako rozsah
Pokud TypeName(Selection) <> “Range” pak Exit Sub
Pro každou buňku ve výběru
cell.Value = Sqr(cell.Value)
Další buňka
End Sub
V tomto případě možná budete chtít jednoduše přeskočit libovolnou buňku obsahující hodnotu, kterou nelze převést na druhou odmocninu. Pomocí struktur If-Then můžete vytvořit nejrůznější možnosti kontroly chyb, ale můžete navrhnout lepší (a jednodušší) řešení tím, že budete chyby, ke kterým dochází, jednoduše ignorovat.
Následující rutina toho dosáhne pomocí příkazu On Error Resume Next:
Sub SelectionSqrt()
Ztlumit buňku jako rozsah
Pokud TypeName(Selection) <> “Range” pak Exit Sub
Při chybě pokračovat dále
Pro každou buňku ve výběru
cell.Value = Sqr(cell.Value)
Další buňka
End Sub
Obecně můžete použít příkaz On Error Resume Next, pokud považujete chyby za neškodné nebo nedůležité pro váš úkol.