Exceli VBA vigade käsitlemine - kõik, mida peate teadma!

Olenemata sellest, kui kogenud olete VBA kodeerimisega, on vead alati selle osa.

Erinevus algaja ja asjatundliku VBA programmeerija vahel on see, et asjatundlikud programmeerijad teavad, kuidas vigu tõhusalt käsitseda ja kasutada.

Selles õpetuses näitan teile erinevaid viise, kuidas Excelis VBA vigu tõhusalt käsitseda.

Enne kui asume VBA veakäsitlusse, mõistame esmalt eri tüüpi vigu, mida Excel VBA programmeerimisel tõenäoliselt ette tuleb.

VBA vigade tüübid Excelis

Excel VBA -s on nelja tüüpi vigu:

  1. Süntaksi vead
  2. Kompileerimisvead
  3. Käitusaja vead
  4. Loogilised vead

Mõistame kiiresti, mis need vead on ja millal need tõenäoliselt kokku puutuvad.

Süntaksi viga

Süntaksiviga, nagu nimigi ütleb, ilmneb siis, kui VBA leiab koodis süntaksist midagi valesti.

Näiteks kui unustate vajaliku lause/süntaksi osa, näete kompileerimisviga.

Allolevas koodis näen niipea, kui pärast teist rida sisestusklahvi vajutan, kompileerimisviga. Seda seetõttu, et IF avaldus peab omama 'Siis'Käsk, mis puudub allpool olevast koodist.

Märge: Kui sisestate Excel VBA -s koodi, kontrollib see iga lause kohta kohe, kui vajutate sisestusklahvi. Kui VBA leiab, et süntaksis on midagi puudu, näitab see koheselt sõnumit koos tekstiga, mis aitab teil puuduvast osast aru saada.

Veendumaks, et näete süntaksi viga alati, kui midagi on puudu, peate veenduma, et automaatse süntaksi kontroll on lubatud. Selleks klõpsake "Tööriistad" ja seejärel "Valikud". Veenduge dialoogiboksis Suvandid, et valik „Automaatne süntaksi kontroll” on lubatud.

Kui suvand „Automaatne süntaksi kontroll” on keelatud, tõstab VBA esile punase süntaksivigaga joone, kuid ei näita vea dialoogiboksi.

Kompileerimisviga

Kompileerimisvead ilmnevad siis, kui midagi on puudu, mis on koodi käitamiseks vajalik.

Näiteks allolevas koodis kuvatakse kohe, kui proovin koodi käivitada, järgmine tõrge. See juhtub nii, nagu olen kasutanud avaldust IF Siis, ilma et see oleks suletud kohustusliku sõnaga „Lõpeta kui”.

Süntaksiviga on ka kompileerimisviga. Süntaksiviga ilmneb kohe, kui vajutate sisestusklahvi ja VBA tuvastab, et midagi on puudu. Kompileerimisviga võib ilmneda ka siis, kui VBA ei leia koodi tippimisel midagi puudu, kuid see juhtub koodi koostamisel või käivitamisel.

VBA kontrollib koodi sisestades iga rida ja tõstab esile süntaksivea kohe, kui rida on vale ja vajutate sisestusklahvi. Kompileerimisvead seevastu tuvastatakse alles siis, kui VBA analüüsib kogu koodi.

Allpool on toodud mõned stsenaariumid, kus ilmneb kompileerimisviga:

  1. IF -avalduse kasutamine ilma IF -lõputa
  2. Kasutades lauset Järgmine
  3. Lause Select kasutamine ilma lõppvaliku kasutamiseta
  4. Muutujat ei deklareerita (see töötab ainult siis, kui suvand Explicit on lubatud)
  5. Alam/funktsiooni kutsumine, mida pole olemas (või valede parameetritega)
Märkus suvandi Explicit kohta: Kui lisate „Option Explicit”, peate enne koodi käivitamist deklareerima kõik muutujad. Kui mõni muutuja on deklareerimata, kuvab VBA vea. See on hea tava, kuna näitab viga, kui teil on valesti kirjutatud muutuja. Lisateavet Option Explicit kohta saate lugeda siit.

Käitusaja vead

Käitusaja vead ilmnevad siis, kui kood töötab.

Käitusaja vead ilmnevad ainult siis, kui hoolitsetakse kõigi süntaksi- ja kompileerimisvigade eest.

Näiteks kui käivitate koodi, mis peaks avama Exceli töövihiku, kuid see töövihik pole saadaval (kas kustutatud või nimi muudetud), annab kood teile käitusaja vea.

Käitusaja vea ilmnemisel peatab see koodi ja näitab vea dialoogiboksi.

Teade dialoogiboksis Käivitusaeg on veidi rohkem abiks. See püüab selgitada probleemi, mis aitab teil seda parandada.

Kui klõpsate silumisnupul, tõstab see esile selle osa koodist, mis viib veani.

Kui olete vea parandanud, võite klõpsata tööriistariba nupul Käivita (või vajutada klahvi F5), et jätkata koodi käivitamist sealt, kust see lahkus.

Või võite koodist väljumiseks klõpsata ka nuppu Lõpeta.

Oluline: Kui klõpsate dialoogiboksis nuppu Lõpeta, peatab kood koodi sellel real, kus see ilmneb. Kõik koodiridad enne seda oleks aga täidetud.

Loogilised vead

Loogilised vead ei peataks teie koodi, kuid võivad põhjustada valesid tulemusi. Need võivad olla ka tõrkeotsingu kõige raskemad veatüübid.

Koostaja ei tõsta neid vigu esile ja need tuleb käsitsi lahendada.

Üks näide loogikavigast (millega ma tihti end ummikusse satun) on lõputu silmus.

Teine näide võib olla see, kui see annab vale tulemuse. Näiteks võite koodis kasutada vale muutujat või lisada kaks muutujat, kui üks on vale.

Loogikavigade kõrvaldamiseks kasutan mõningaid viise.

  1. Sisestage sõnumikasti koodi mõnda kohta ja tõstke esile väärtused/andmed, mis aitavad mõista, kas kõik läheb ootuspäraselt.
  2. Selle asemel, et koodi korraga käivitada, minge iga rida ükshaaval läbi. Selleks klõpsake koodi suvalises kohas ja vajutage klahvi F8. märkate, et iga kord, kui vajutate klahvi F8, täidetakse üks rida. See võimaldab teil koodi läbi käia üks rida korraga ja tuvastada loogilised vead.

Silumise kasutamine kompileerimis-/süntaksivigade leidmiseks

Kui olete koodiga lõpetanud, on hea tava see enne käivitamist kõigepealt kompileerida.

Koodi koostamiseks klõpsake tööriistaribal valikut Silumine ja seejärel käsku Kompileeri VBAProject.

VBA projekti koostamisel läbib see koodi ja tuvastab vead (kui neid on).

Kui see leiab vea, kuvab see veaga dialoogiboksi. See leiab vigu ükshaaval. Nii et kui see leiab vea ja olete selle parandanud, peate muude vigade leidmiseks (kui neid on) uuesti käivitama kompileerimise.

Kui teie koodil pole vigu, on suvand Kompileeri VBAProjekt hall.

Pange tähele, et kompileerimine leiab ainult süntaksi- ja kompileerimisvigu. See EI leia käitusaja vigu.

Kui kirjutate VBA -koodi, ei soovi te, et vead ilmuvad. Selle vältimiseks saate kasutada mitmeid veakäsitlusmeetodeid.

Selle artikli järgmistes osades käsitlen meetodeid, mida saate Excelis VBA vigade käsitlemiseks kasutada.

Vigaseadete konfigureerimine (käsitletud vs töötlemata vead)

Enne koodiga töötamise alustamist peate Excel VBA -s kontrollima üht seadet.

Minge VBA tööriistaribale, klõpsake nuppu Tööriistad ja seejärel suvandit Valikud.

Klõpsake dialoogiboksis Suvandid vahekaarti Üldine ja veenduge, et rühmas „Vigade püüdmine” oleks märgitud „Puudutus töötlemata vigade korral”.

Lubage mul selgitada kolme võimalust:

  1. Parandage kõiki vigu: See peatab teie koodi igat tüüpi vigade korral, isegi kui olete nende vigade käsitlemiseks tehnikaid kasutanud.
  2. Vaheaeg klassimoodulis: See peatab teie koodi kõigi töötlemata vigade korral ja samal ajal, kui kasutate selliseid objekte nagu Userforms, puruneb see ka nende objektide sees ja tõstab esile tõrke põhjustanud rea.
  3. Parandage käsitlemata vigu: See peatab teie koodi ainult nende vigade korral, mida ei käsitleta. See on vaikeseade, kuna see tagab, et teie käsutusse antakse kõik käsitlemata vead. Kui kasutate selliseid objekte nagu Userforms, ei tõsta see esile objekti tõrke põhjustavat joont, vaid toob esile ainult selle objekti viitava rea.
Märge: Kui töötate selliste objektidega nagu Userforms, saate selle sätte muuta „Break on Class Modules”. Erinevus #2 ja #3 vahel on see, et kui kasutate Break in Class Module'i, viib see teid tõrke põhjustanud objekti konkreetsele reale. Võite valida ka selle käsu „Murda töötlemata vigadele” asemel.

Lühidalt - kui alles alustate Exceli VBA -ga, veenduge, et märge „Käsitsemata vigade purunemine” on märgitud.

VBA vigade käsitlemine avaldustega „On Error”

Kui teie koodis ilmneb tõrge, saate teha järgmist.

  1. Ignoreerige viga ja laske koodil jätkata
  2. Pange paika veakäsitluskood ja käivitage see vea ilmnemisel

Mõlemad veatöötlusmeetodid tagavad, et lõppkasutaja ei näe viga.

Nende tegemiseks saate kasutada mõningaid tõrkeid.

Vea korral Jätka järgmist

Kui kasutate oma koodis nuppu „On Error Resume Next”, jätetakse ilmnenud tõrketeade tähelepanuta ja kood töötab edasi.

Seda vigade käsitlemise meetodit kasutatakse üsna sageli, kuid selle kasutamisel peate olema ettevaatlik. Kuna see ignoreerib täielikult kõiki võimalikke vigu, ei pruugi teil olla võimalik tuvastada parandamist vajavaid vigu.

Näiteks kui käivitatakse allolev kood, tagastab see vea.

Sub AssignValues ​​() x = 20 /4 y = 30 /0 Sub Sub

See juhtub seetõttu, et te ei saa numbrit nulliga jagada.

Aga kui ma kasutan selles koodis avaldust „On Error Resume Next” (Viga jätkub järgmisena) (nagu allpool näidatud), ignoreerib see viga ja ma ei tea, et on probleem, mis tuleb parandada.

Sub AssignValues ​​() Sees Tõrge Jätka Järgmine x = 20 /4 y = 30 /0 Lõpu alam

Vea korral jätkake järgmist tuleks kasutada ainult siis, kui teate selgelt, milliseid vigu teie VBA -kood eeldatavasti tekitab, ja on hea seda ignoreerida.

Näiteks allpool on VBA sündmuse kood, mis lisaks koheselt kuupäeva ja kellaaja väärtuse äsja sisestatud lehe lahtrisse A1 (see kood lisatakse töölehele, mitte moodulisse).

Privaatne alamtöövihiku_uusileht (ByVal Sh kui objekt) Sh.Range ("A1") = Vorming (nüüd, "pp-kk-aaaa hh: mm: ss") Lõpu alam

Kuigi see töötab enamikul juhtudel suurepäraselt, näitaks see viga, kui lisan töölehe asemel diagrammilehe. Kuna diagrammilehel pole lahtreid, annab kood vea.

Niisiis, kui kasutan selles koodis avaldust „On Error Resume Next”, töötab see töölehtedega ootuspäraselt ja ei tee diagrammilehtedega midagi.

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

Märkus. Vea kohta Jätka järgmist avaldust on kõige parem kasutada siis, kui teate, milliste vigadega tõenäoliselt kokku puutute. Ja kui arvate, et neid vigu on ohutu ignoreerida, saate seda kasutada.

Saate selle koodi järgmisele tasemele viia, analüüsides tõrke esinemist ja kuvades selle jaoks asjakohase teate.

Allpool olev kood näitaks sõnumikast, mis teavitaks kasutajat, et töölehte pole sisestatud.

Private Sub Workbook_NewSheet (ByVal Sh as Object) Vea korral Jätka Järgmine Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") Kui Err.Number 0 Siis MsgBox "Paistab nagu sina sisestas diagrammilehe "& vbCrLf &" Viga - "& Err.Kirjeldus Lõpp kui lõpp Alam

„Err.Number” kasutatakse veanumbri saamiseks ja „Err.Description” veakirjelduse saamiseks. Neid käsitletakse selles õpetuses hiljem.

Viga GoTo 0

„On Error GoTo 0” peatab vea põhjustanud rea koodi ja kuvab veateate.

Lihtsamalt öeldes võimaldab see vaikimisi veakontrolli ja kuvab vaikimisi veateate.

Miks siis seda isegi kasutada?

Tavaliselt ei pea te funktsiooni „On Error Goto 0” kasutama, kuid see võib olla kasulik, kui kasutate seda koos „On Error Resume Next”

Las ma selgitan!

Allolev kood valiks kõik valiku tühjad lahtrid.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Valige End Sub

Kuid see näitaks viga, kui valitud lahtrites pole tühje lahtreid.

Nii et vea kuvamise vältimiseks võite kasutada funktsiooni On Error Resume next ”

Nüüd näitab see ka viga, kui käivitate alloleva koodi:

AlamvalikFormulaCells () Tõrke korral jätkake järgmise valikuga. SpecialCells (xlCellTypeBlanks). Valige Lõpeta alam

Siiamaani on kõik korras!

Probleem tekib siis, kui koodil on mõni osa, kus võib ilmneda tõrge, ja kuna kasutate nuppu „On Error Resume Next”, jätke kood seda lihtsalt tähelepanuta ja liigub järgmisele reale.

Näiteks allolevas koodis poleks tõrketeadet:

Alam SelectFormulaCells () Viga Jätka järgmist valikut. SpecialCells (xlCellTypeBlanks). Valige '… rohkem koodi, mis võib sisaldada viga End Sub

Ülaltoodud koodis on kaks kohta, kus võib ilmneda tõrge. Esimene koht on see, kus me valime kõik tühjad lahtrid (kasutades valikut Selection.SpecialCells) ja teine ​​on ülejäänud koodis.

Kuigi esimene viga on oodatud, ei ole pärast seda ühtegi viga.

Siin tuleb appi On Error Goto 0.

Kui kasutate seda, lähtestate veaseade vaikeseadeks, kus see hakkab ilmnedes tõrkeid näitama.

Näiteks allolevas koodis poleks viga, kui pole tühje lahtreid, kuid veateade ilmneb '10/0 'tõttu.

Alam SelectFormulaCells () vea korral Jätka järgmist valikut. SpecialCells (xlCellTypeBlanks). Valige On Go Goo 0 '… rohkem koodi, mis võib sisaldada viga End Sub

Tõrke korral läks [silt]

Ülaltoodud kaks meetodit - „Jätkake vea jätkamist” ja „Viga Goto 0” - ei võimalda meil tõrget tõeliselt käsitleda. Üks paneb koodi viga ignoreerima ja teine ​​jätkab veakontrolli.

On Error Go [Label] on viis, mille abil saate määrata, mida soovite teha, kui teie koodil on viga.

Allpool on koodistruktuur, mis kasutab seda veakäitlejat:

Alamkatse () On GoTo Label: X = 10 /0 'see rida põhjustab vea' … teie ülejäänud kood läheb siia Exit Sub Label: 'kood vea käsitlemiseks End Sub

Pange tähele, et enne vea „Silt” käsitsemisel on olemas väljumise alam. See tagab, et vigade puudumisel väljutakse alamosast ja koodi „Label” ei täideta. Kui te Exit Subi ei kasuta, käivitab see alati koodi "Label".

Allolevas näidiskoodis tõrke korral hüppab kood ja käivitab käitleja jaotises oleva koodi (ja kuvab teadete kasti).

Alamveahaldur () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Tundub olevat viga" & vbCrLf & Err.Description End Sub

Pange tähele, et vea ilmnemisel on kood juba käivitatud ja täitnud vead, mis on enne tõrke põhjustanud rida. Ülaltoodud näites määrab kood X väärtuseks 12, kuid kuna viga ilmneb järgmisel real, ei määra see Y ja Z väärtusi.

Kui kood hüppab veakäitleja koodile (selles näites ErrMsg), jätkab see kõigi veakäitleja koodis ja selle all olevate ridade täitmist ning väljub alamosast.

Viga Goto -1

See on natuke keeruline ja enamikul juhtudel ei kasuta te seda tõenäoliselt.

Kuid ma katan selle siiski, kuna olen silmitsi olukorraga, kus seda oli vaja (ignoreerige ja jätkake järgmise jaotisega, kui otsite ainult põhitõdesid).

Enne selle mehaanikaga tutvumist proovin selgitada, kus see võib olla kasulik.

Oletame, et teil on kood, kus ilmneb tõrge. Kuid kõik on hea, kuna teil on üks veahaldur paigas. Aga mis juhtub siis, kui veakäitleja koodis on veel üks viga (jah … mõnevõrra nagu algusfilmis).

Sellisel juhul ei saa te teist käitlejat kasutada, kuna esimest viga pole kustutatud. Nii et kui olete esimese veaga hakkama saanud, on see VBA mälus endiselt olemas. Ja VBA -mälus on koht ainult üheks veaks - mitte kaheks või enamaks.

Selle stsenaariumi korral saate kasutada tõrget Goto -1.

See kustutab vea ja vabastab VBA mälu järgmise vea käsitlemiseks.

Aitab jutust!

Selgitan nüüd näiteid kasutades.

Oletame, et mul on järgmine kood. See annab vea, kuna jagub nulliga.

Alamveahaldur () X = 12 Y = 20 /0 Z = 30 Lõpuosa

Sellega tegelemiseks kasutan veakäitleja koodi (nimega ErrMsg), nagu allpool näidatud:

Alamveahaldur () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Tundub olevat viga" & vbCrLf & Err.Description End Sub

Nüüd on kõik jälle hästi. Niipea kui tõrge ilmneb, kasutatakse veahaldurit ja kuvatakse sõnumikast, nagu allpool näidatud.

Nüüd laiendan koodi nii, et mul oleks veakäitlejas või pärast seda rohkem koodi.

Alamveahaldur () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Tundub olevat viga" & vbCrLf & Err.Kirjeldus A = 10/2 B = 35 /0 End Sub

Kuna esimene viga on lahendatud, kuid teine ​​mitte, näen jälle viga, nagu allpool näidatud.

Ikka kõik hästi. Kood käitub nii, nagu me ootasime.

Nii et teise vea käsitlemiseks kasutan teist veahaldurit (ErrMsg2).

Alamveahaldur () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Tundub olevat viga" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Välju alamveast ErrMsg2: MsgBox "Tundub, et viga on jälle" & vbCrLf & Err.Kirjelduse lõppalam

Ja siin see on ei tööta ootuspäraselt.

Kui käivitate ülaltoodud koodi, annab see ikkagi käitusaja vea, isegi kui teine ​​veahaldur on paigas.

See juhtub, kuna me ei kustutanud esimest viga VBA mälust.

Jah, saime hakkama! Kuid see jääb ikkagi mällu.

Ja kui VBA -l tekib mõni muu viga, jääb see ikkagi esimese vea juurde ja seega teist veahaldurit ei kasutata. Kood peatub vea põhjustanud real ja kuvab veateate.

VBA mälu kustutamiseks ja eelmise vea kustutamiseks peate kasutama nuppu „On Error Goto -1”.

Nii et kui lisate selle rea allolevasse koodi ja käivitate selle, töötab see ootuspäraselt.

Alamveahaldur () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Tundub olevat viga" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Välju alamveast ErrMsg2: MsgBox "Tundub, et viga on jälle" & vbCrLf & Err.Kirjeldus Lõpu alam
Märge: Alamprogrammi lõppedes kõrvaldatakse tõrge automaatselt.Seega võib „On Error Goto -1” olla kasulik, kui saate samas alamprogrammis kaks või enam viga.

Err objekt

Kui koodiga tekib tõrge, kasutatakse vea üksikasjade (nt veanumbri või kirjelduse) saamiseks objekti Err.

Viga objekti omadustes

Objektil Err on järgmised omadused:

Kinnisvara Kirjeldus
Number Arv, mis tähistab vea tüüpi. Kui viga pole, on see väärtus 0
Kirjeldus Vea lühikirjeldus
Allikas Projekti nimi, milles tõrge ilmnes
HelpContext Abifaili vea abikonteksti ID
HelpFile String, mis tähistab kausta asukohta ja abifaili failinime

Kuigi enamikul juhtudel ei pea te Err -objekti kasutama, võib see mõnikord olla kasulik Excelis vigade käsitlemisel.

Oletame näiteks, et teil on andmestik, nagu allpool näidatud, ja iga valiku puhul soovite arvutada külgneva lahtri ruutjuure.

Allolev kood võib seda teha, kuid kuna lahtris A5 on tekstistring, näitab see kohe selle ilmnemisel viga.

Alam FindSqrRoot () Dim rng kui vahemik Määra rng = Valik iga lahtri jaoks rng lahtris. Nihke (0, 1) .Väärtus = Sqr (lahter.Väärtus) Järgmine lahter Lõpu alam

Seda tüüpi veateate probleem on see, et see ei anna teile midagi selle kohta, mis on valesti läinud ja kus probleem ilmnes.

Nende veateadete sisukamaks muutmiseks saate kasutada objekti Err.

Näiteks kui kasutan nüüd allolevat VBA -koodi, peatab see koodi niipea, kui tõrge ilmneb, ja kuvab sõnumikasti koos selle lahtri lahtri aadressiga, kus probleem on.

Alam FindSqrRoot () Dim rng kui vahemik Määra rng = Valik iga lahtri jaoks rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Järgmine lahter ErrHandler: MsgBox "Vea number:" & Err .Number & vbCrLf & _ "Vea kirjeldus:" & Err.Description & vbCrLf & _ "Viga:" & cell.Address End Sub

Ülaltoodud kood annaks teile palju rohkem teavet kui lihtne „tüübi mittevastavus”, eriti lahtri aadress, et saaksite teada, kus viga tekkis.

Saate seda koodi veelgi täpsustada, veendumaks, et teie kood töötab lõpuni (selle asemel, et iga vea korral puruneda), ja seejärel annab teile loendi lahtri aadressist, kus viga ilmneb.

Allolev kood teeks seda:

Sub FindSqrRoot2 () Dim ErrorCells nagu string Dim rng kui vahemik vea korral Jätkake järgmiseks Määra rng = Valik iga lahtri jaoks rng lahtris. Offset (0, 1) .Value = Sqr (cell.Value) Kui Err.Number 0 Siis ErrorCells = ErrorCells & vbCrLf & cell.Add On On GoTo -1 End If Next cell MsgBox "Viga järgmistes lahtrites" & ErrorCells Exit Sub end Sub

Ülaltoodud kood kestab lõpuni ja annab ruutjuure kõikidest lahtritest, millel on numbrid (kõrvalolevas veerus). Seejärel kuvatakse teade, mis loetleb kõik lahtrid, kus oli tõrge (nagu allpool näidatud):

Viga objekti meetodites

Kuigi vead Atribuudid on kasulikud vigade kohta kasuliku teabe kuvamiseks, on vigade käsitlemisel abi ka kahest Err -meetodist.

Meetod Kirjeldus
Selge Kustutab kõik Err -objekti atribuutide seaded
Tõsta Tekitab käitusaja vea

Õpime kiiresti selgeks, mis need on ja kuidas/miks neid Excelis VBA -ga kasutada.

Viga selge meetod

Oletame, et teil on allpool näidatud andmekogum ja soovite saada kõigi nende numbrite ruutjuure külgnevas veerus.

Järgmine kood võtab külgneva veeru kõigi numbrite ruutjuured ja kuvab teate, et lahtrite A5 ja A9 puhul ilmnes tõrge (kuna neil on tekst).

Sub FindSqrRoot2 () Dim ErrorCells nagu string Dim rng kui vahemik vea korral Jätkake järgmiseks Määra rng = Valik iga lahtri jaoks rng lahtris. Offset (0, 1) .Value = Sqr (cell.Value) Kui Err.Number 0 Siis ErrorCells = ErrorCells & vbCrLf & cell.Add Err.Clear End If Next cell MsgBox "Viga järgmistes lahtrites" & ErrorCells End Sub

Pange tähele, et olen kasutanud Err.Clear meetodit avalduses If Siis.

Kui viga on ilmnenud ja Ifi tingimuse lõksus, lähtestab Err.Clear meetod veanumbri tagasi väärtusele 0. See tagab, et IF tingimus püüab vead kinni ainult nendes lahtrites, kus see on tõstatatud.

Kui ma poleks Err.Clear meetodit kasutanud, oleks see pärast tõrke ilmnemist IF tingimustes alati tõene ja veanumbrit pole lähtestatud.

Teine viis selle töö tegemiseks on kasutada viga On Goto -1, mis nullib vea täielikult.

Märge: Err.Clear erineb veast Goto -1. Err.Clear kustutab ainult veakirjelduse ja veanumbri. see ei lähtesta seda täielikult. See tähendab, et kui samas koodis on veel üks veajuhtum, ei saa te seda enne lähtestamist käsitseda (seda saab teha käsuga „On Error Goto -1”, mitte „Err.Clear”).

Viga tõstmise meetod

Err.Raise meetod võimaldab tõsta käitusaja viga.

Allpool on Err.Raise meetodi kasutamise süntaks:

Err.Raise [number], [allikas], [kirjeldus], [abifail], [abikontekst]

Kõik need argumendid on valikulised ja saate neid kasutada oma veateate sisukamaks muutmiseks.

Aga miks sa tahad kunagi ise viga teha?

Hea küsimus!

Seda meetodit saate kasutada vea esinemisel (mis tähendab, et tõrge läheb niikuinii) ja seejärel kasutate seda meetodit, et kasutajale veast rohkem teada anda (mitte vähem kasuliku veateate asemel, mida VBA näitab) algselt).

Oletame näiteks, et teil on allpool näidatud andmekogum ja soovite, et kõikidel lahtritel oleks ainult numbrilised väärtused.

Sub RaiseError () Dim rng kui vahemik Määra rng = Valik vea korral GoTo ErrHandler iga lahtri jaoks rng Kui ei (IsNumeric (Cell.Value)) Siis Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Lõpeta, kui järgmine lahter ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Ülaltoodud kood näitaks veateadet, millel on määratud kirjeldus ja kontekstifail.

Isiklikult pole ma kunagi kasutanud Err.Raise'i, kuna töötan enamasti ainult Exceli abil. Kuid kellelegi, kes kasutab VBA -d Exceli kasutamiseks koos teiste rakendustega, nagu Outlook, Word või PowerPoint, võib see olla kasulik.

Siin on üksikasjalik artikkel Err.Raise'i meetodi kohta juhuks, kui soovite rohkem teada saada.

VBA vigade käsitlemise head tavad

Olenemata sellest, kui oskuslikult VBA -koodi kirjutate, on vead alati selle osa. Parimad kodeerijad on need, kellel on oskused nende vigadega korralikult hakkama saada.

Siin on mõned head tavad, mida saate kasutada Excel VBA vigade käsitlemisel.

  1. Kasutage koodi alguses nuppu „On Error Go [Label]”. See tagab, et kõik sealt ilmnevad vead käsitletakse.
  2. Kasutage nuppu „On Error Resume Next” AINULT siis, kui olete kindel võimalike vigade osas. Kasutage seda ainult eeldatava veaga. Kui kasutate seda ootamatute vigadega, ignoreerib see seda lihtsalt ja liigub edasi. Kui soovite teatud tüüpi vigu ignoreerida ja ülejäänud püüda, võite kasutada nuppu „On Error Resume Next” koos „Err.Raise”.
  3. Veatöötlejate kasutamisel veenduge, et kasutate enne käitlejaid Exit Subi. See tagab, et veakäitleja kood käivitatakse ainult tõrke korral (muidu täidetakse see alati).
  4. Kasutage erinevat tüüpi vigade püüdmiseks mitut veatöötlejat. Mitme veahalduri olemasolu tagab vea õige lahendamise. Näiteks soovite „tüübi mittevastavuse” veaga hakkama saada erinevalt kui käitusajaviga „jagamine 0-ga”.

Loodetavasti leidsite sellest Exceli artiklist kasu!

Siin on veel mõned Exceli VBA õpetused, mis võivad teile meeldida:

  • Exceli VBA andmetüübid - täielik juhend
  • Exceli VBA silmused - järgmiseks tehke aega, tehke kuni, igaühe jaoks
  • Exceli VBA sündmused - lihtne (ja täielik) juhend
  • Excel Visual Basic Editor - kuidas seda Excelis avada ja kasutada

Te aitate arengu ala, jagades leht oma sõpradega

wave wave wave wave wave