Nem számít, mennyire tapasztalt a VBA kódolásban, a hibák mindig részei lesznek.
A különbség a kezdő és a szakértő VBA programozó között az, hogy a szakértő programozók tudják, hogyan kell hatékonyan kezelni és használni a hibákat.
Ebben az oktatóanyagban különböző módszereket mutatok be, amelyekkel hatékonyan kezelheti a hibákat az Excel VBA -ban.
Mielőtt belekezdenénk a VBA hibakezelésbe, először is értsük meg a különböző típusú hibákat, amelyekkel valószínűleg találkozni fog az Excel VBA programozásakor.
A VBA hibák típusai az Excelben
Az Excel VBA négyféle hibát tartalmaz:
- Szintaktikai hibák
- Összeállítási hibák
- Futásidejű hibák
- Logikai hibák
Gyorsan megértsük, melyek ezek a hibák, és mikor találkozhat ezekkel.
Szintaktikai hiba
A szintaktikai hiba, amint a neve is sugallja, akkor fordul elő, amikor a VBA hibát talál a kód szintaxisában.
Például, ha elfelejti az utasítás/szintaxis szükséges részét, akkor látni fogja a fordítási hibát.
Az alábbi kódban, amint megnyomom az enter billentyűt a második sor után, fordítási hibát látok. Ez azért van, mert a IF nyilatkozat rendelkeznie kell a "Azután'Parancs, amely hiányzik az alábbi kódból.
Annak érdekében, hogy a szintaktikai hiba mindig látható legyen, ha valami hiányzik, győződjön meg arról, hogy az Autosyntax ellenőrzés engedélyezve van. Ehhez kattintson az "Eszközök", majd a "Beállítások" gombra. A beállítások párbeszédpanelen győződjön meg arról, hogy az „Automatikus szintaxis -ellenőrzés” lehetőség engedélyezve van.
Ha az „Automatikus szintaxis -ellenőrzés” opció le van tiltva, a VBA továbbra is pirossal emeli ki a szintaktikai hibát tartalmazó sort, de nem jeleníti meg a hiba párbeszédpanelt.
Fordítási hiba
Fordítási hibák akkor fordulnak elő, ha hiányzik valami, ami szükséges a kód futtatásához.
Például az alábbi kódban, amint megpróbálom futtatni a kódot, a következő hiba jelenik meg. Ez akkor történik, amikor az IF Majd utasítást használtam, anélkül, hogy a kötelező „End If” -vel lezártam volna.
A VBA ellenőrzi az egyes sorokat, amikor begépeli a kódot, és kiemeli a szintaktikai hibát, amint a sor helytelen, és megnyomja az enter billentyűt. A fordítási hibákat viszont csak akkor azonosítják, ha a VBA elemzi a teljes kódot.
Az alábbiakban néhány forgatókönyvet talál, amelyekben fordítási hiba lép fel:
- IF utasítás használata IF vége nélkül
- A For utasítás használata a Next gombbal
- A Kiválasztás használata a Kiválasztás használata nélkül
- Nem deklarálja a változót (ez csak akkor működik, ha az Option Explicit engedélyezve van)
- Nem létező (vagy rossz paraméterekkel rendelkező) al/funkció hívása
Futási idő hibák
Futásidejű hibák azok, amelyek a kód futtatásakor jelentkeznek.
A futási idő hibái csak akkor fordulnak elő, ha az összes szintaktikai és fordítási hibáról gondoskodnak.
Például, ha olyan kódot futtat, amely állítólag megnyit egy Excel -munkafüzetet, de az a munkafüzet nem érhető el (vagy törölték, vagy megváltoztatta a nevét), akkor a kód futási hibát fog okozni.
Futásidejű hiba esetén leállítja a kódot, és megjeleníti a hiba párbeszédpanelt.
A Run-time error párbeszédpanelen megjelenő üzenet egy kicsit hasznosabb. Megpróbálja elmagyarázni a problémát, amely segíthet a kijavításában.
Ha a Hibakeresés gombra kattint, az kiemeli a kód azon részét, amely a hibához vezet.
Ha kijavította a hibát, akkor kattintson az eszköztár Futtatás gombjára (vagy nyomja meg az F5 billentyűt) a kód futtatásának folytatásához onnan, ahol abbahagyta.
Vagy a Vége gombra kattintva kiléphet a kódból.
Fontos: Ha a Vége gombra kattint a párbeszédpanelen, akkor leállítja a kódot azon a soron, amelyen találkozik. Mindazonáltal az összes kódsor végrehajtásra került volna.Logikai hibák
A logikai hibák nem állítják le a kódot, de rossz eredményekhez vezethetnek. Ezek lehetnek a legnehezebb hibaelhárítási típusok is.
Ezeket a hibákat a fordító nem emeli ki, és kézzel kell kezelni.
A logikai hibák egyik példája (amellyel gyakran elakadok) végtelen ciklusba fut.
Egy másik példa lehet az, amikor rossz eredményt ad. Előfordulhat például, hogy rossz kódot használ a kódban, vagy két változót ad hozzá, ha az egyik helytelen.
A logikai hibák kiküszöbölésére néhány módszert használok:
- Helyezze be az Üzenetdobozt a kód valamelyik helyére, és jelölje ki azokat az értékeket/adatokat, amelyek segíthetnek megérteni, hogy minden a várt módon megy -e.
- Ahelyett, hogy a kódot egyszerre futtatná, menjen végig minden egyes soron egyenként. Ehhez kattintson a kód bármely pontjára, és nyomja meg az F8 billentyűt. észreveheti, hogy minden alkalommal, amikor megnyomja az F8 billentyűt, egy sor kerül végrehajtásra. Ez lehetővé teszi, hogy soronként végigmenjen a kódon, és azonosítsa a logikai hibákat.
A hibakeresés használata fordítási/szintaktikai hibák kereséséhez
Miután végzett a kóddal, jó gyakorlat, ha futás előtt először lefordítja.
Kód összeállításához kattintson az eszköztár Hibakeresés opciójára, majd kattintson a VBAProject fordítása gombra.
Amikor összeállít egy VBA -projektet, átmegy a kódon, és azonosítja a hibákat (ha vannak).
Ha hibát talál, megjelenik egy párbeszédpanel a hibával. Sorra talál hibákat. Tehát ha hibát talál, és kijavította, akkor újra futtatnia kell a fordítást, hogy megtalálja a többi hibát (ha vannak).
Ha a kód hibamentes, a VBAProject fordítása opció szürkén jelenik meg.
Ne feledje, hogy a fordítás csak a „szintaktikai” és a „fordítási” hibákat találja. NEM fogja megtalálni a futásidejű hibákat.
Amikor VBA kódot ír, nem szeretné, hogy a hibák megjelenjenek. Ennek elkerülése érdekében számos hibakezelési módszer használható.
A cikk következő néhány szakaszában bemutatom azokat a módszereket, amelyeket az Excel VBA hibakezelésére használhat.
Hibabeállítások konfigurálása (kezelt vs nem kezelt hibák)
Mielőtt elkezdené dolgozni a kódjával, ellenőriznie kell az Excel VBA egyik beállítását.
Lépjen a VBA eszköztárra, kattintson az Eszközök, majd a Beállítások lehetőségre.
A Beállítások párbeszédpanelen kattintson az Általános fülre, és győződjön meg arról, hogy a „Hibaelragadás” csoporton belül a „Törés a kezeletlen hibákon” be van jelölve.
Hadd magyarázzam meg a három lehetőséget:
- Szakítson minden hibával: Ez leállítja a kódot minden típusú hibánál, még akkor is, ha ezeket a technikákat használta a hibák kezelésére.
- Szünet az osztálymodulban: Ez leállítja a kódot minden kezeletlen hiba esetén, és ugyanakkor, ha olyan objektumokat használ, mint a Userforms, akkor az azokon belül is megtörik, és kiemeli a hibát okozó pontos sort.
- Szünet a kezeletlen hibákon: Ez csak a nem kezelt hibák miatt állítja le a kódot. Ez az alapértelmezett beállítás, mivel biztosítja, hogy minden kezeletlen hiba értesüljön. Ha olyan objektumokat használ, mint a Userforms, akkor ez nem a hibát okozó sort fogja kiemelni az objektumban, hanem csak azt a sort, amely az adott objektumra utal.
Tehát dióhéjban - ha csak most kezdi az Excel VBA -t, győződjön meg arról, hogy a „Break on Unhandled Errors” be van jelölve.
VBA hibakezelés „On Error” nyilatkozatokkal
Ha a kód hibát észlel, akkor néhány dolgot megtehet:
- Hagyja figyelmen kívül a hibát, és hagyja, hogy a kód folytatódjon
- Helyezzen be egy hibakezelési kódot, és futtassa azt hiba esetén
Mindkét hibakezelési módszer biztosítja, hogy a végfelhasználó ne lásson hibát.
Van néhány „On Error” kijelentés, amellyel ezeket elvégezheti.
Hiba esetén Folytassa a következőt
Ha a „Hiba folytatása a következőben” lehetőséget használja a kódban, akkor a felmerült hibákat figyelmen kívül hagyja, és a kód tovább fut.
Ezt a hibakezelési módszert gyakran használják, de óvatosnak kell lennie a használatakor. Mivel teljesen figyelmen kívül hagyja az esetlegesen előforduló hibákat, előfordulhat, hogy nem tudja azonosítani azokat a hibákat, amelyeket ki kell javítani.
Például, ha az alábbi kódot futtatja, akkor hibát ad vissza.
Sub AssignValues () x = 20 /4 y = 30 /0 Sub
Ez azért történik, mert nem lehet osztani egy számot nullával.
De ha ebben a kódban az „On Error Resume Next” (On Error Resume Next) utasítást használom (az alábbiakban látható módon), akkor figyelmen kívül hagyja a hibát, és nem fogom tudni, hogy van olyan probléma, amelyet ki kell javítani.
Sub AssignValues () On Hiba Folytatás Következő x = 20 /4 y = 30 /0 Sub
A Hibaelhárítás következő lépésben csak akkor használható, ha egyértelműen tudja, hogy a VBA -kód milyen hibákat fog okozni, és nem szabad figyelmen kívül hagyni.
Például az alábbiakban látható a VBA eseménykód, amely azonnal hozzáadja a dátumot és az időt az újonnan beszúrt lap A1 cellájához (ez a kód a munkalapon kerül hozzáadásra, és nem egy modulban).
Privát almunkafüzet_NewSheet (ByVal Sh mint objektum) Sh.Range ("A1") = Formátum (Most, "dd-mmm-yyyy hh: mm: ss")
Bár ez a legtöbb esetben remekül működik, hibaüzenetet jelenítene meg, ha diagramlapot adok hozzá munkalap helyett. Mivel a diagramlap nem tartalmaz cellákat, a kód hibát vet fel.
Tehát, ha ebben a kódban az „On Error Resume Next” kijelentést használom, akkor a várt módon fog működni a munkalapokkal, és semmit sem tesz a diagramlapokkal.
Private Sub Workbook_NewSheet (ByVal Sh as Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Megjegyzés: A Hibaelhárítás folytatása Következő nyilatkozat akkor a legjobb, ha tudja, hogy milyen hibákkal találkozhat. És ha úgy gondolja, hogy biztonságos figyelmen kívül hagyni ezeket a hibákat, akkor használhatja.
Ezt a kódot a következő szintre emelheti, ha elemzi, hogy történt -e hiba, és megjelenít egy erre vonatkozó üzenetet.
Az alábbi kód egy üzenetdobozt jelenít meg, amely tájékoztatja a felhasználót arról, hogy a munkalap nincs beillesztve.
Privát almunkafüzet_NewSheet (ByVal Sh mint objektum) Hiba esetén Folytatás Következő Sh.Range ("A1") = Formátum (Most, "dd-mmm-yyyy hh: mm: ss") Ha Err.Number 0 then MsgBox "Úgy néz ki, mint te beszúrt egy diagramlapot "& vbCrLf &" Error - "& Err.Description End If End Sub
Az „Err.Number” a hibaszám lekérésére, az „Err.Description” pedig a hiba leírására szolgál. Ezekről később lesz szó ebben az oktatóanyagban.
GoTo 0 hiba esetén
Az „On Error GoTo 0” leállítja a kódot azon a soron, amely a hibát okozza, és megjelenik egy üzenetdoboz, amely leírja a hibát.
Leegyszerűsítve lehetővé teszi az alapértelmezett hibakeresési viselkedést, és megjeleníti az alapértelmezett hibaüzenetet.
Akkor miért kell egyáltalán használni?
Általában nem kell használni az „On Error Goto 0” funkciót, de hasznos lehet, ha a „On Error Resume Next” funkcióval együtt használja.
Hadd magyarázzam!
Az alábbi kód kiválasztja a kiválasztás összes üres celláját.
Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Válassza az End Sub lehetőséget
De hibát mutatna, ha a kiválasztott cellákban nincsenek üres cellák.
Tehát a hiba megjelenítésének elkerülése érdekében használhatja az On Error Resume next ”lehetőséget
Most az alábbi kód futtatásakor minden hiba megjelenik:
Sub SelectFormulaCells () On Error Folytassa a következő kijelölést. SpecialCells (xlCellTypeBlanks). Válassza a End Sub lehetőséget
Eddig jó!
A probléma akkor merül fel, ha a kód egy részén hiba léphet fel, és mivel a „Hiba folytatása a következő” beállítást használja, a kód egyszerűen figyelmen kívül hagyja, és a következő sorra lép.
Például az alábbi kódban nem jelenik meg hibaüzenet:
Sub SelectFormulaCells () Hiba esetén Folytassa a következő kiválasztást. SpecialCells (xlCellTypeBlanks). Válassza a "… további kódot, amely hibát tartalmazhat
A fenti kódban két helyen fordulhat elő hiba. Az első helyen az összes üres cellát választjuk ki (a Selection.SpecialCells segítségével), a második pedig a fennmaradó kódban.
Bár az első hiba várható, az ezt követő hiba nem.
Itt jön az On Error Goto 0 a segítségére.
Használatakor visszaállítja a hibabeállítást az alapértelmezettre, ahol a hiba észlelésekor megjelenik.
Például az alábbi kódban nem lenne hiba, ha nincsenek üres cellák, de hibaüzenet jelenik meg a ’10/0 ′ miatt
Sub SelectFormulaCells () On Error Folytassa a következő Selection.SpecialCells (xlCellTypeBlanks) elemet. Válassza az On Error GoTo 0 '… további kódot, amely hibát tartalmazhat
Hiba a hiba miatt [címke]
A fenti két módszer - „On Error Resume Next” és „On Error Goto 0” - nem teszi lehetővé, hogy valóban kezeljük a hibát. Az egyik arra kényszeríti a kódot, hogy figyelmen kívül hagyja a hibát, a másik pedig folytatja a hibakeresést.
On Error Go [Címke] egy módszer, amellyel megadhatja, hogy mit szeretne tenni, ha a kód hibás.
Az alábbi kódszerkezet ezt a hibakezelőt használja:
Sub Test () On GoTo Label hiba: X = 10 /0 'ez a sor hibát okoz' …. A fennmaradó kódja ide megy Kilépés az alcímkéből: 'kód a hiba kezelésére End Sub
Ne feledje, hogy a „Címke” kezelési hiba előtt van egy Kilépés al. Ez biztosítja, hogy ha nincsenek hibák, az alprogram kilép, és a „Címke” kód nem kerül végrehajtásra. Abban az esetben, ha nem használja az Exit Sub alkalmazást, az mindig végrehajtja a „Label” kódot.
Az alábbi példakódban hiba esetén a kód ugrik, és végrehajtja a kódot a kezelő részben (és megjelenít egy üzenetdobozt).
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Úgy tűnik, hogy hiba van" & vbCrLf & Err.Description End Sub
Vegye figyelembe, hogy hiba esetén a kód már futott, és végrehajtotta a hibát okozó sor előtti sorokat. A fenti példában a kód X értékét 12 -re állítja be, de mivel a hiba a következő sorban következik be, nem állítja be Y és Z értékét.
Miután a kód a hibakezelő kódjához ugrik (ebben a példában ErrMsg), továbbra is végrehajtja az összes sort a hibakezelői kódban és az alatta, és kilép az alrészből.
Goto -1 hiba esetén
Ez egy kicsit bonyolult, és a legtöbb esetben nem valószínű, hogy ezt használja.
De továbbra is kitérek erre, mivel szembesültem egy olyan helyzettel, amikor erre szükség volt (nyugodtan hagyja figyelmen kívül, és ugorjon a következő szakaszra, ha csak az alapokat keresi).
Mielőtt belekezdenék a mechanikájába, hadd próbáljam meg elmagyarázni, hol lehet hasznos.
Tegyük fel, hogy van egy kódja, ahol hiba lépett fel. De minden rendben van, mivel van egy hibakezelő a helyén. De mi történik, ha egy másik hiba van a hibakezelő kódjában (igen… némileg olyan, mint a kezdeti film).
Ebben az esetben nem használhatja a második kezelőt, mivel az első hiba nem szűnt meg. Tehát amíg kezelte az első hibát, a VBA memóriájában még mindig létezik. És a VBA memóriának csak egy hibája van - nem kettő vagy ennél több.
Ebben az esetben a Goto -1 hibát használhatja.
Törli a hibát, és felszabadítja a VBA memóriát a következő hiba kezelésére.
Elég a beszédből!
Most magyarázzuk el példákkal.
Tegyük fel, hogy megvan az alábbi kód. Ez hibát fog okozni, mivel nullával van osztva.
Alhiba -kezelő () X = 12 Y = 20 /0 Z = 30 End Sub
Tehát a kezeléshez hibakezelő kódot használok (ErrMsg névvel), az alábbiak szerint:
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Úgy tűnik, hogy hiba van" & vbCrLf & Err.Description End Sub
Most megint minden jó. Amint a hiba bekövetkezik, a rendszer a hibakezelőt használja, és az alább látható üzenetmezőt jeleníti meg.
Most kibővítem a kódot, hogy több kód legyen a hibakezelőben vagy utána.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Úgy tűnik, hogy hiba van" & vbCrLf & Err.Description A = 10 /2 B = 35 /0 Sub Sub
Mivel az első hibát sikerült kezelni, de a másodikat nem, ismét az alábbi ábrán látható hibát látom.
Még mindig minden jó. A kód úgy viselkedik, ahogy vártuk.
Tehát a második hiba kezelésére egy másik hibakezelőt (ErrMsg2) használok.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Úgy tűnik, hogy hiba van" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Kilépés al ErrMsg2: MsgBox "Úgy tűnik, hogy ismét hiba történt" & vbCrLf & Err.Description End Sub
És ez itt van nem a várt módon működik.
Ha futtatja a fenti kódot, akkor is futási hibát ad, még akkor is, ha a második hibakezelő a helyén van.
Ez történik, mivel nem töröltük az első hibát a VBA memóriájából.
Igen, megoldottuk! De még mindig az emlékezetben marad.
És amikor a VBA újabb hibát észlel, akkor is megragadt az első hibánál, és ezért a második hibakezelőt nem használja. A kód megáll a hibát okozó sorban, és megjeleníti a hibaüzenetet.
A VBA memóriájának törléséhez és az előző hiba törléséhez az „On Error Goto -1” -t kell használni.
Tehát ha hozzáadja ezt a sort az alábbi kódhoz, és futtatja, akkor a várt módon fog működni.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Úgy tűnik, hogy hiba van" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Kilépés al ErrMsg2: MsgBox "Úgy tűnik, hogy ismét hiba történt" & vbCrLf & Err.Description End SubJegyzet: A hiba automatikusan törlődik, ha egy alprogram befejeződik.Tehát az „On Error Goto -1” akkor lehet hasznos, ha két vagy több hibát kap ugyanabban az alprogramban.
Az Err objektum
Amikor hiba történik a kóddal, az Err objektumot használják a hiba részleteinek (például a hibaszám vagy a leírás) lekérésére.
Hiba az objektum tulajdonságaiban
Az Err objektum a következő tulajdonságokkal rendelkezik:
Ingatlan | Leírás |
Szám | A hiba típusát jelző szám. Ha nincs hiba, ez az érték 0 |
Leírás | A hiba rövid leírása |
Forrás | A projekt neve, amelyben a hiba történt |
HelpContext | A súgó környezeti azonosítója a súgófájl hibájához |
HelpFile | Karakterlánc, amely a mappa helyét és a súgófájl fájlnevét képviseli |
Bár a legtöbb esetben nem kell az Err objektumot használni, néha hasznos lehet az Excel hibáinak kezelése során.
Tegyük fel például, hogy van egy adathalmaza, amint az alább látható, és minden egyes számnál a kijelölésben ki kell számítani a négyzetgyököt a szomszédos cellában.
Az alábbi kód megteheti, de mivel az A5 cellában szöveges karakterlánc található, hiba jelenik meg, amint ez megtörténik.
Sub FindSqrRoot () Dim rng as Range Set
Az ilyen típusú hibaüzenetekkel az a probléma, hogy nem ad semmit arról, hogy mi történt rosszul és hol történt a probléma.
Az Err objektum használatával érthetőbbé teheti ezeket a hibaüzeneteket.
Például, ha most az alábbi VBA -kódot használom, akkor leállítja a kódot, amint a hiba bekövetkezik, és megjelenik egy üzenetdoboz a cella cellacímével, ahol probléma van.
Sub FindSqrRoot () Dim rng as Range Set rng = Kiválasztás minden cellára In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Következő cella ErrHandler: MsgBox "Hiba száma:" & Err .Number & vbCrLf & _ "Hiba leírása:" & Err.Description & vbCrLf & _ "Hiba:" & cell.Address End Sub
A fenti kód sokkal több információt adna, mint az egyszerű „Típus -eltérés”, különösen a cellacím, így tudja, hol történt a hiba.
Tovább finomíthatja ezt a kódot, hogy megbizonyosodjon arról, hogy a kód a végéig fut (ahelyett, hogy minden hiba esetén megszakadna), majd megadja a cellacím listáját, ahol a hiba előfordul.
Az alábbi kód ezt tenné:
Sub FindSqrRoot2 () Dim ErrorCells mint karakterlánc Dim rng tartományként On Error Folytatás Következő 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 "Hiba a következő cellákban" & ErrorCells Kilépés az alvég alból
A fenti kód a végéig fut, és megadja az összes cella négyzetgyökét, amelyek számokkal vannak ellátva (a szomszédos oszlopban). Ezután megjelenik egy üzenet, amely felsorolja az összes cellát, ahol hiba történt (az alábbiak szerint):
Err Object Methods
Bár az Err tulajdonságok hasznosak a hibákról szóló hasznos információk megjelenítéséhez, két hibamód is létezik, amelyek segíthetnek a hibakezelésben.
Módszer | Leírás |
Egyértelmű | Törli az Err objektum összes tulajdonságbeállítását |
Emel | Futásidejű hibát generál |
Gyorsan megtanuljuk, melyek ezek, és hogyan/miért kell ezeket használni a VBA -val az Excelben.
Err Clear Method
Tegyük fel, hogy rendelkezik egy adathalmazzal az alábbi ábrán látható módon, és meg szeretné kapni ezeknek a számoknak a négyzetgyökét a szomszédos oszlopban.
A következő kód megkapja a szomszédos oszlopban lévő összes szám négyzetgyökét, és üzenetet jelenít meg arról, hogy hiba történt az A5 és A9 cellában (mivel ezekben szöveg van).
Sub FindSqrRoot2 () Dim ErrorCells mint karakterlánc Dim rng tartományként On Error Folytatás Következő 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 "Hiba a következő cellákban" & ErrorCells End Sub
Ne feledje, hogy az Err.Clear módszert használtam a Ha akkor utasításban.
Ha hiba történt, és az If feltétel csapdába esett, az Err.Clear metódus visszaállítja a hibaszámot 0 -ra. Ez biztosítja, hogy az IF feltétel csak azokban a cellákban rögzítse a hibákat, ahol felmerült.
Ha nem használtam volna az Err.Clear módszert, a hiba bekövetkezése után mindig igaz lenne HA állapotban, és a hibaszám nem lett visszaállítva.
A munka másik módja az On Error Goto -1 használata, amely teljesen visszaállítja a hibát.
Jegyzet: Az Err.Clear eltér a Goto -1 hibától. Az Err.Clear csak a hibaleírást és a hibaszámot törli. nem állítja vissza teljesen. Ez azt jelenti, hogy ha ugyanabban a kódban egy másik hiba is előfordul, akkor nem fogja tudni kezelni a visszaállítás előtt (ezt megteheti az „On Error Goto -1”, és nem az „Err.Clear” segítségével).Err Emelési módszer
Az Err.Raise módszer lehetővé teszi futási hiba felvetését.
Az alábbiakban az Err.Raise módszer szintaxisa látható:
Err.Raise [szám], [forrás], [leírás], [helpfile], [helpcontext]
Mindezek az érvek opcionálisak, és ezekkel érthetőbbé teheti a hibaüzenetet.
De miért akarja valaha is hibát felvetni?
Jó kérdés!
Ezt a módszert akkor is használhatja, ha hiba van (ami azt jelenti, hogy hiba lesz) alapértelmezés szerint).
Tegyük fel például, hogy rendelkezik az alább látható adatkészlettel, és azt szeretné, hogy az összes cella csak numerikus értékekkel rendelkezzen.
Sub RaiseError () Dim rng as Range Set rng = Selection On Error GoTo ErrHandler For each cell In rng If Not (IsNumeric (Cell.Value)) Akkor Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
A fenti kód hibaüzenetet jelenít meg, amely tartalmazza a megadott leírást és a környezeti fájlt.
Személy szerint soha nem használtam az Err.Raise -t, mivel többnyire csak Excel -sel dolgozom. De azoknak, akik a VBA -t használják az Excel és más alkalmazások, például az Outlook, a Word vagy a PowerPoint együttműködésére, ez hasznos lehet.
Itt van egy részletes cikk az Err.Raise módszerről, ha többet szeretne megtudni.
VBA hibakezelési legjobb gyakorlatok
Függetlenül attól, hogy milyen készséggel rendelkezik VBA kód írásával, a hibák mindig részei lesznek. A legjobb kódolók azok, akik rendelkeznek a készségekkel, hogy megfelelően kezeljék ezeket a hibákat.
Íme néhány bevált gyakorlat, amelyeket használhat az Excel VBA hibakezelésében.
- Használja az „On Error Go [Label]” parancsot a kód elején. Ez biztosítja, hogy az esetlegesen előforduló hibákat kezeljük.
- CSAK az „On Error Resume Next” (Hibaelhárítás folytatása) funkciót használja, ha biztos az előforduló hibákban. Csak a várt hibával használja. Ha váratlan hibákkal használja, egyszerűen figyelmen kívül hagyja, és továbblép. Használhatja az „On Error Resume Next” (Error Resume Next) lehetőséget az „Err.Raise” („Err.Raise”) használatával, ha figyelmen kívül kíván hagyni egy bizonyos típusú hibát, és elkapja a többit.
- Hibakezelők használatakor győződjön meg arról, hogy az Exit Sub programot használja a kezelők előtt. Ez biztosítja, hogy a hibakezelő kód csak hiba esetén kerül végrehajtásra (különben mindig végrehajtásra kerül).
- Használjon több hibakezelőt a különböző típusú hibák elfogására. A több hibakezelő biztosítja a hiba megfelelő kezelését. Például a „típus-eltérés” hibát másként szeretné kezelni, mint a „0-val osztás” futási idejű hibát.
Remélem, hasznosnak találta ezt az Excel -cikket!
Íme néhány további Excel VBA oktatóanyag, amelyek tetszhetnek:
- Excel VBA adattípusok - Teljes útmutató
- Excel VBA hurkok - Következő, csináld addig, amíg nem, mindegyikhez
- Excel VBA események - Egyszerű (és teljes) útmutató
- Excel Visual Basic Editor - Hogyan lehet megnyitni és használni az Excelben