Ha az Excel VBA hibáit kell kezelnie, használhatja az OnError utasítást. Van azonban néhány dolog, amit először tudnod kell. Az On Error utasítást háromféleképpen használhatja.
| Szintaxis |
Mit csinál |
| Error GoTo címkén |
Az utasítás végrehajtása után a VBA
a megadott címkét követő utasítással folytatja a végrehajtást . A
címke után kettőspontot kell megadnia , hogy a VBA címkeként ismerje fel. |
| Error GoTo 0 |
Az utasítás végrehajtása után a VBA folytatja a normál
hibaellenőrzési viselkedést. Használja ezt az utasítást a
többi On Error utasítás valamelyikének használata után, vagy ha el szeretné távolítani a hibakezelést
az eljárásból. |
| Hiba esetén Folytatás a következőre |
Az utasítás végrehajtása után a VBA egyszerűen figyelmen kívül hagy minden hibát,
és a végrehajtást a következő utasítással folytatja. |
Folytatás hiba után
Bizonyos esetekben egyszerűen azt szeretné, hogy a rutin kecsesen fejeződjön be, amikor hiba történik. Például megjeleníthet egy üzenetet, amely leírja a hibát, majd kilép az eljárásból. (A korábban bemutatott EnterSquareRoot5 példa ezt a technikát használja.) Más esetekben, ha lehetséges, szeretne helyreállítani a hibát.
A hiba utáni helyreállításhoz Folytatás utasítást kell használnia. Ez törli a hibaállapotot, és lehetővé teszi a végrehajtás folytatását egy bizonyos helyen. Az önéletrajzi nyilatkozatot háromféleképpen használhatja.
| Szintaxis |
Mit csinál |
| Önéletrajz |
A végrehajtás a hibát okozó utasítással folytatódik. Használja
ezt, ha a hibakezelő kód kijavítja a problémát, és
rendben van a folytatás. |
| Folytatás Tovább |
A végrehajtás közvetlenül
a hibát okozó utasítás utáni utasítással folytatódik . Ez lényegében figyelmen kívül hagyja a
hibát. |
| Önéletrajz címke |
A végrehajtás a megadott címkénél folytatódik . |
A következő példa egy Resume utasítást használ hiba fellépése után:
Sub EnterSquareRoot6()
Dim Num As Variant
Dim Msg As String
Dim Ans As Integer
Próbáld újra:
' Állítsa be a hibakezelést
Hiba esetén GoTo BadEntry
' Érték kérése
Num = InputBox ("Adjon meg egy értéket")
Ha Num = "" Akkor lépjen ki a Sub
' Illessze be a négyzetgyököt
ActiveCell.Value = Sqr(szám)
Exit Sub
BadEntry:
Msg = Err.Number & ": " & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Üzenet & "Győződjön meg arról, hogy egy tartomány van kiválasztva, "
Msg = Üzenet & "a lap nem védett, "
Msg = Msg & "és megad egy nemnegatív értéket."
Msg = Msg & vbNewLine & vbNewLine & "Próbáld újra?"
Ans = MsgBox (Msg, vbYesNo + vbCritical)
Ha Ans = vbYes, akkor folytassa a TryAgain parancsot
Vége Sub
Ennek az eljárásnak egy másik címkéje is van: TryAgain. Ha hiba történik, a végrehajtás a BadEntry címkén folytatódik, és a kód az alábbi üzenetet jeleníti meg. Ha a felhasználó az Igen gombra kattintva válaszol, a Resume utasítás elindul, és a végrehajtás visszaugrik a TryAgain címkére. Ha a felhasználó a Nem gombra kattint, az eljárás véget ér.

Ha hiba történik, a felhasználó eldöntheti, hogy megpróbálja-e újra.
Vegye figyelembe, hogy a hibaüzenet a hibaszámot is tartalmazza a „hivatalos” hibaleírás mellett.
A folytatás előtt a Resume utasítás törli a hibaállapotot. Ennek megtekintéséhez próbálja meg a következő utasítással helyettesíteni az előző példában szereplő, másodiktól az utolsóig terjedő utasítást:
Ha Ans = vbYes, akkor menjen a TryAgain-hez
A kód nem működik megfelelően, ha a Folytatás helyett a GoTo-t használja. A bemutatáshoz írjon be egy negatív számot. Megjelenik a hibaüzenet. Kattintson az Igen gombra az újrapróbálkozáshoz, majd írjon be egy másik negatív számot. Ez a második hiba nincs bezárva, mert az eredeti hibafeltételt nem törölték.
Hibakezelés dióhéjban
Annak érdekében, hogy a hibakezeléssel kapcsolatos ügyeket rendben tartsa, íme egy gyors összefoglaló. A hibakezelő kód blokkja a következő jellemzőkkel rendelkezik:
-
Közvetlenül az On Error utasításban megadott címke után kezdődik.
-
A makró csak akkor érheti el, ha hiba történik. Ez azt jelenti, hogy közvetlenül a címke előtt kell használnia egy utasítást, például Exit Sub vagy Exit Function.
-
Szükség lehet önéletrajzi nyilatkozatra. Ha úgy dönt, hogy hiba esetén nem szakítja meg az eljárást, akkor a fő kódhoz való visszatérés előtt végre kell hajtania egy Resume utasítást.
Tudni, mikor kell figyelmen kívül hagyni a hibákat
Egyes esetekben teljesen rendben van a hibák figyelmen kívül hagyása. Ekkor lép életbe az On Error Resume Next utasítás.
A következő példa végigfut a kiválasztott tartomány minden celláján, és az értéket négyzetgyökké alakítja. Ez az eljárás hibaüzenetet generál, ha a kijelölés bármely cellája negatív számot vagy szöveget tartalmaz:
Sub SelectionSqrt()
Dim cell As Range
Ha Típusnév(Kijelölés) <> „Tartomány”, akkor lépjen ki a Sub
Minden egyes kiválasztott cellához
cella.Érték = Sqr(cella.Érték)
Következő cella
Vége Sub
Ebben az esetben érdemes egyszerűen kihagyni minden olyan cellát, amely olyan értéket tartalmaz, amelyet nem lehet négyzetgyökké alakítani. Az If-Then struktúrák használatával mindenféle hibaellenőrző képességet létrehozhat, de jobb (és egyszerűbb) megoldást is kitalálhat, ha egyszerűen figyelmen kívül hagyja a felmerülő hibákat.
A következő rutin ezt az On Error Resume Next utasítás használatával éri el:
Sub SelectionSqrt()
Dim cell As Range
Ha Típusnév(Kijelölés) <> „Tartomány”, akkor lépjen ki a Sub
Hiba esetén Folytatás a következőre
Minden egyes kiválasztott cellához
cella.Érték = Sqr(cella.Érték)
Következő cella
Vége Sub
Általában használhatja az On Error Resume Next utasítást, ha úgy véli, hogy a hibák ártalmatlanok vagy nem következetesek a feladat szempontjából.