VBA On Error - Hiba a legjobb gyakorlatok kezelésében

VBA hibák csalólap

Hibák

LeírásVBA kódOn Error - Stop kód és megjelenítési hibaHiba: Goto 0On Error - Kihagyja a hibát, és folytatja a futástHiba esetén Folytassa a következőtHiba esetén - Ugrás a kód sorára [Címke]Hiba a hiba miatt [címke]Törli (visszaállítja) a hibátGoTo -1 hiba eseténHiba szám megjelenítéseMsgBox hibaszámHiba leírásának megjelenítéseMsgBox Err. LeírásFunkció saját hiba generálásáraErr. Emelje fel

További VBA „Családlapok” és ingyenes PDF letöltések

VBA hibakezelés

VBA hibakezelés a VBA futásidejű hibák előrejelzésére, észlelésére és megoldására utal. A VBA hibakezelési folyamat a kód írásakor történik, mielőtt bármilyen hiba bekövetkezik.

VBA futásidejű hibák a kód végrehajtása során előforduló hibák. Példák a futásidejű hibákra:

  • Nem létező munkafüzetre, munkalapra vagy más objektumra való hivatkozás
  • Érvénytelen adatok, pl. hibát tartalmazó Excel cellára hivatkozni
  • Kísérlet a nullával való osztásra

VBA Hibajelentés

A legtöbb VBA hibakezelést a A hibajelentésről. Az On Error utasítás megmondja a VBA -nak, hogy mit kell tennie, ha hibát észlel. Itt három van A hibajelentésekről:

  • GoTo 0 hiba esetén
  • Hiba esetén Folytassa a következőt
  • GoTo hiba esetén Vonal

GoTo 0 hiba esetén

GoTo 0 hiba esetén a VBA alapértelmezett beállítása. Ezt az alapértelmezett beállítást a következő kódsor hozzáadásával állíthatja vissza:

1 GoTo 0 hiba esetén

Amikor hiba történik a GoTo 0 hiba esetén, A VBA leállítja a kódfuttatást, és megjeleníti a szokásos hibaüzenet -mezőt.

Gyakran hozzáad egy GoTo 0 hiba esetén hozzáadása után Hiba esetén Folytassa a következőt hibakezelés (következő rész):

123456789 Sub ErrorGoTo0 ()Hiba esetén Folytassa a következőtActiveSheet.Shapes ("Start_Button"). TörlésGoTo 0 hiba esetén'Futtasson több kódotEnd Sub

Hiba esetén Folytassa a következőt

Hiba esetén Folytassa a következőt utasítja a VBA -t, hogy hagyja ki a hibákat tartalmazó kódsorokat, és folytassa a következő sorral.

1 Hiba esetén Folytassa a következőt

Jegyzet: Hiba esetén Folytassa a következőt nem javítja a hibát, vagy más módon nem oldja meg. Egyszerűen azt mondja a VBA -nak, hogy úgy járjon el, mintha a hibát tartalmazó kódsor nem létezne. Helytelen használata Hiba esetén Folytassa a következőt nem kívánt következményekhez vezethet.

Remek alkalom a használatra Hiba esetén Folytassa a következőt akkor, ha olyan objektumokkal dolgozik, amelyek léteznek vagy nem léteznek. Például szeretne olyan kódot írni, amely törli az alakzatot, de ha futtatja a kódot, amikor az alakzat már törlődik, a VBA hibát jelez. Ehelyett használhatja Hiba esetén Folytassa a következőt utasítani a VBA -t, hogy törölje az alakzatot, ha létezik.

123 Hiba esetén Folytassa a következőtActiveSheet.Shapes ("Start_Button"). TörlésGoTo 0 hiba esetén

Figyeljük meg, hogy hozzáadtuk GoTo 0 hiba esetén a lehetséges hibát tartalmazó kódsor után. Ez visszaállítja a hibakezelést.

A következő részben megmutatjuk, hogyan tesztelheti, hogy hiba történt -e a használattal Hibás szám, fejlettebb hibakezelési lehetőségeket kínál…

Err.Number, Err.Clear és elkapó hibák

Ahelyett, hogy egyszerűen átugranánk egy hibát tartalmazó sort, a hibát a használatával érhetjük el Hiba esetén Folytassa a következőt és Hibás szám.

Hibás szám az észlelt hiba típusának megfelelő hibaszámot ad vissza. Ha nincs hiba, Hibás szám = 0.

Például ez az eljárás visszaadja a „11” értéket, mert az előforduló hiba az Futásidejű hiba '11'.

1234567 AlhibaNumber_ex ()Hiba esetén Folytassa a következőtActiveCell.Value = 2 /0MsgBox hibaszámEnd Sub

Hiba kezelése az Err.Number használatával

Az igazi ereje Hibás szám abban rejlik, hogy képes észlelni, ha hiba történt (Hibás szám 0). Az alábbi példában létrehoztunk egy függvényt, amely az Err.Number használatával teszteli, hogy létezik -e lap.

12345678910111213141516171819 Rész tesztWS ()Az MsgBox létezikWSExist ("teszt")End SubA függvény WSExist (wsName As String) BooleanDim ws munkalapkéntHiba esetén Folytassa a következőtSet ws = Sheets (wsName)'Ha a WS hiba nem létezikHa Err.Number 0 AkkorDoesWSExist = HamisMásDoesWSExist = IgazVége HaGoTo -1 hiba eseténVége funkció

Megjegyzés: Hozzáadtuk a GoTo -1 hiba esetén a végére, amely visszaállítja az Err.Number értékét 0 -ra (lásd két részt lefelé).

Val vel Hiba esetén Folytassa a következőt és Hibás szám, megismételheti a „Próbáld ki” és „Fogd meg” más programozási nyelvek funkcionalitása.

GoTo hiba esetén Vonal

GoTo hiba esetén Vonal utasítja a VBA -t, hogy hiba esetén „menjen” egy címkés kódsorba. A Go To utasítást így deklarálja (ahol az errHandler a sorcímke)

1 On Error GoTo errHandler

és hozzon létre egy ilyen sorcímkét:

1 errHandler:

Megjegyzés: Ugyanaz a címke, amelyet a szokásos VBA GoTo kimutatással használna.

Az alábbiakban bemutatjuk a használatát GoTo hiba esetén Vonal kilépni egy eljárásból.

Hiba esetén lépjen ki az almenüből

Az On Error GoTo Line használatával kiléphet az albázisból hiba esetén.

Ezt úgy teheti meg, hogy az eljárás végén elhelyezi a hibakezelő sor címkéjét:

12345678 Sub ErrGoToEnd ()On GoTo endProc hiba- Valami kódendProc:End Sub

vagy az Exit Sub parancs használatával:

123456789101112131415 Sub ErrGoToEnd ()On GoTo endProc hiba- Valami kódGoTo skipEitendProc:Kilépés a Subbólkihagyás:- Még néhány kódEnd Sub

Err.Clear, On Error GoTo -1, és Reset Err.Number

A hiba kezelése után általában törölnie kell a hibát, hogy megelőzze a hibakezeléssel kapcsolatos további problémákat.

Hiba bekövetkezése után, mindkét Hiba. Világos és GoTo -1 hiba esetén visszaállítható Hibás szám de van egy nagyon fontos különbség: Hiba. Világos magát a tényleges hibát nem állítja vissza, csak a Hibás szám.

Az mit jelent? HasználataHiba. Világos, nem tudja módosítani a hibakezelési beállítást. A különbség megtekintéséhez próbálja ki ezt a kódot, és cserélje ki GoTo -1 hiba esetén val vel Hiba. Világos:

123456789101112131415161718192021 Sub ErrPéldák ()Hiba esetén GoTo errHandler:"" Alkalmazás által meghatározott "hibaHiba (13)Kilépés a SubbólerrHandler:'Hiba törléseGoTo -1 hiba eseténA GoTo errHandler2 hiba esetén:"Típus -eltérés" hibaHiba (1034)Kilépés a SubbólerrHandler2:Hibakeresés. Nyomtatási hiba. LeírásEnd Sub

Általában azt javaslom, hogy mindig használja GoTo -1 hiba esetén, hacsak nincs jó oka a használatára Hiba. Világos helyette.

VBA az MsgBox hibán

Lehet, hogy hibaüzenet üzenetdobozt is szeretne megjeleníteni. Ez a példa különböző üzenetmezőket jelenít meg a hiba előfordulási helyétől függően:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg karakterlánckéntOn Error GoTo errHandler'1. szakaszerrMsg = "Hiba történt a Másolás és beillesztés szakaszban."„Err. Raise (11)'2. szakaszerrMsg = "Hiba történt az adatellenőrzési szakaszban."„Err. Raise (11)'3. szakaszerrMsg = "Hiba történt a P & L-Building és Copy-Over szakaszban."Err. Emelés (11)'4. szakaszerrMsg = "Hiba történt az importálás naplózásakor a telepítő oldalon"„Err. Raise (11)GoTo endProcerrHandler:MsgBox hibaMsgendProc:End Sub

Itt lecserélné az Err.Raise (11) kódot a tényleges kódjára.

VBA IsError

A hibák kezelésének másik módja a VBA IsError funkcióval történő tesztelés. Az IsError függvény tesztel egy kifejezést hibákra, és IGAZ vagy HAMIS értéket ad vissza hiba esetén.

123 Sub IsErrorEx ()MsgBox IsError (tartomány ("a7"). Érték)End Sub

Ha hiba VBA

A hibákat a VBA -ban is kezelheti az Excel IfError függvénnyel. Az IfError függvényt a Funkció osztály:

1234567 IfErrorEx ()Dim n Olyan hosszún = WorksheetFunction.IfError (Tartomány ("a10"). Érték, 0)MsgBox nEnd Sub

Ez az A10 tartomány értékét adja ki, ha az érték hiba, akkor 0 -t ad ki.

VBA hibatípusok

Futásidejű hibák

Ahogy a fentiekben írják:

VBA futásidejű hibák a kód végrehajtása során előforduló hibák. Példák a futásidejű hibákra:

  • Nem létező munkafüzetre, munkalapra vagy más objektumra való hivatkozás
  • Érvénytelen adatok, pl. hibát tartalmazó Excel cellára hivatkozni
  • Kísérlet nullával osztani

A futásidejű hibákat „hibakezelésre” használhatja a fent ismertetett módszerekkel.

Szintaktikai hibák

VBA szintaktikai hibák hibák vannak a kódírással. Példák a szintaktikai hibákra:

  • Hibás írás
  • Hiányzó vagy helytelen írásjelek

A VBA szerkesztő számos szintaktikai hibát azonosít piros kiemeléssel:

A VBA szerkesztőben lehetőség van az „Automatikus szintaxis ellenőrzés” lehetőségre is:

Ha ez be van jelölve, a VBA szerkesztő egy üzenetdobozt generál, amely figyelmeztet a szintaktikai hibákra, miután beírt egy kódsort:

Én személy szerint rendkívül idegesítőnek tartom, és letiltom a funkciót.

Fordítási hibák

Az eljárás futtatása előtt a VBA „lefordítja” az eljárást. A fordítás a programot a forráskódból (amit láthat) végrehajtható formává alakítja át (nem láthatja).

VBA fordítási hibák olyan hibák, amelyek megakadályozzák a kód fordítását.

A fordítási hiba jó példája a hiányzó változó deklaráció:

További példák:

  • For nélkül Következő
  • Válassza a lehetőséget nélkül Vége Kiválasztás
  • Ha nélkül Vége Ha
  • Hívás a eljárás hogy nem létezik

A szintaktikai hibák (előző rész) a fordítási hibák részhalmaza.

Hibakeresés> Fordítás

Fordítási hibák jelennek meg, amikor egy eljárást próbál futtatni. Ideális esetben azonban a fordítási hibákat az eljárás futtatása előtt azonosítja.

Ezt úgy teheti meg, hogy idő előtt összeállítja a projektet. Ehhez lépjen a következőre: Hibakeresés> VBA projekt összeállítása.

A fordító „elmegy” az első hibához. Miután kijavította ezt a hibát, fordítsa újra a projektet. Ismételje meg mindaddig, amíg minden hiba kijavításra kerül.

Azt mondhatja, hogy minden hiba kijavítva, mert VBA projekt összeállítása szürkén jelenik meg:

OverFlow hiba

Az VBA OverFlow hiba akkor fordul elő, amikor egy értéket próbál beilleszteni egy túl nagy változóba. Például, Egész változók csak -32 768 és 32 768 közötti értékeket tartalmazhat. Ha nagyobb értéket ad meg, túlcsordulási hibaüzenetet kap:

Ehelyett a Hosszú változó a nagyobb szám tárolására.

Egyéb VBA hibakifejezések

VBA elkapási hiba

Más programozási nyelvekkel ellentétben a VBA -ban nincs Fogási nyilatkozat. Azonban a használatával megismételheti a fogási kimutatást Hiba esetén Folytassa a következőt és Ha Err.Number 0 Akkor. Ez a fentiekben található, a Hibakezelés az Err.Number segítségével.

VBA Hiba figyelmen kívül hagyása

A VBA hibáinak figyelmen kívül hagyásához egyszerűen használja a Hiba esetén Folytassa a következőt nyilatkozat:

1 Hiba esetén Folytassa a következőt

Azonban, mint fentebb említettük, óvatosan kell használni ezt az utasítást, mivel nem javítja a hibát, csak egyszerűen figyelmen kívül hagyja a hibát tartalmazó kód sort.

VBA dobási hiba / Err. Emelés

A VBA hiba elhárításához használja a Err. Emelje fel módszer.

Ez a kódsor növeli a „13” futásidejű hibát: A típus nem egyezik:

1 Err. Emelés (13)

VBA hibaelhárítás

VBA hibaelhárítás ez csak egy másik kifejezés a VBA hibakezelésre.

VBA hibaüzenet

A VBA hibaüzenet így néz ki:

A „Hibakeresés” gombra kattintva megjelenik a hibát kiváltó kódsor:

VBA hiba kezelése hurokban

A hurkokon belüli hibakezelés legjobb módja a használata Hiba esetén Folytassa a következőt együtt Hibás szám hiba észleléséhez (ne felejtse el használni Hiba. Világos hogy minden hiba után törölje a hibát).

Az alábbi példa két számot oszt el (A oszlop a B oszloppal), és az eredményt a C oszlopba adja ki. Ha hiba történik, az eredmény 0 lesz.

12345678910111213141516 Rész teszt ()Homályos cella mint tartományHiba esetén Folytassa a következőtA tartomány minden cellájához ("a1: a10")'Állítsa be a cellaértéketcell.Offset (0, 2). Value = cell.Value / cell.Offset (0, 1). Value'Ha a Cell.Value hiba, akkor alapértelmezett értéke 0Ha Err.Number 0 Akkorcella. Eltolás (0, 2). Érték = 0Hiba. VilágosVége HaKövetkezőEnd Sub

VBA hibakezelés az Access -ben

A fenti példák mindegyike pontosan ugyanúgy működik az Access VBA -ban, mint az Excel VBA -ban.

123456789101112131415161718 Funkció DelRecord (frm As Form)'ez a funkció egy rekord törlésére szolgál egy táblázatban az űrlaprólOn Hiba GoTo endFrm -elHa .NewRecord Then.VisszaKilépés funkcióVége HaVége ezzelFrm.RecordsetClone segítségével.Könyvjelző = frm.Könyvjelző.Törölfrm.KérdezésVége ezzelKilépés funkcióbefejező:VégeVége funkció

Segít a fejlesztés a helyszínen, megosztva az oldalt a barátaiddal

wave wave wave wave wave