VBA On Error - Virheiden käsittely parhaita käytäntöjä

VBA -virheiden huijausarkki

Virheet

KuvausVBA -koodiOn Error - Pysäytyskoodi ja näyttövirheVirhe Siirry 0On Error - Ohita virhe ja jatka käyttöäVirhe Jatka seuraavaksiVirheessä - Siirry koodiriville [Label]Virhe Siirry [Label]Poistaa (nollaa) virheenVirhe GoTo -1Näytä virheen numeroMsgBox -virhenumeroNäytä virheen kuvausMsgBox -virhe KuvausToiminto tuottaa oman virheenErr. Nosta

Katso lisää VBA -huijausarkkeja ja ilmaisia ​​PDF -latauksia

VBA -virheiden käsittely

VBA -virheiden käsittely viittaa VBA -ajonaikaisten virheiden ennakoimiseen, havaitsemiseen ja ratkaisemiseen. VBA -virheiden käsittelyprosessi tapahtuu koodia kirjoitettaessa ennen virheiden ilmenemistä.

VBA ajonaikaiset virheet ovat virheitä, jotka tapahtuvat koodin suorittamisen aikana. Esimerkkejä ajonaikaisista virheistä ovat:

  • Viittaus olemattomaan työkirjaan, laskentataulukkoon tai muuhun objektiin
  • Virheelliset tiedot, esim. viittaus Excel -soluun, joka sisältää virheen
  • Yritetään jakaa nollalla

VBA virheilmoituksessa

Suurin osa VBA -virheiden käsittelystä tehdään Virheilmoituksesta. On Error -lauseke kertoo VBA: lle, mitä tehdä, jos se havaitsee virheen. On kolme Virheilmoituksista:

  • Virhe GoTo 0
  • Virhe Jatka seuraavaksi
  • Virhe GoTo Linja

Virhe GoTo 0

Virhe GoTo 0 on VBA: n oletusasetus. Voit palauttaa tämän oletusasetuksen lisäämällä seuraavan koodirivin:

1 Virhe GoTo 0

Kun tapahtuu virhe Virhe GoTo 0, VBA lopettaa koodin suorittamisen ja näyttää vakiovirheilmoitusruudun.

Usein lisäät Virhe GoTo 0 lisäyksen jälkeen Virhe Jatka seuraavaksi virheiden käsittely (seuraava osa):

123456789 AlivirheGoTo0 ()Virhe Jatka seuraavaksiActiveSheet.Shapes ("Start_Button"). PoistaVirhe GoTo 0'Suorita lisää koodiaEnd Sub

Virhe Jatka seuraavaksi

Virhe Jatka seuraavaksi kehottaa VBA: ta ohittamaan virheitä sisältävät koodirivit ja siirtymään seuraavalle riville.

1 Virhe Jatka seuraavaksi

Huomautus: Virhe Jatka seuraavaksi ei korjaa virusta tai korjaa sitä muuten. Se yksinkertaisesti kehottaa VBA: ta jatkamaan ikään kuin virheen sisältävää koodiriviä ei olisi olemassa. Väärä käyttö Virhe Jatka seuraavaksi voi johtaa tahattomiin seurauksiin.

Erinomainen aika käyttää Virhe Jatka seuraavaksi on, kun työskentelet esineiden kanssa, joita voi olla tai ei ole. Haluat esimerkiksi kirjoittaa jonkin koodin, joka poistaa muodon, mutta jos suoritat koodin, kun muoto on jo poistettu, VBA antaa virheen. Sen sijaan voit käyttää Virhe Jatka seuraavaksi kertoa VBA: lle poistaa muoto, jos se on olemassa.

123 Virhe Jatka seuraavaksiActiveSheet.Shapes ("Start_Button"). PoistaVirhe GoTo 0

Huomaa, että lisäsimme Virhe GoTo 0 mahdollisen virheen sisältävän koodirivin jälkeen. Tämä nollaa virheiden käsittelyn.

Seuraavassa osassa näytämme, kuinka voit testata, tapahtuiko virhe käytössä Virhe numero, antaa sinulle kehittyneempiä virheiden käsittelyvaihtoehtoja …

Err.Number, Err.Clear ja sieppausvirheet

Sen sijaan, että vain ohittaisimme virheen sisältävän rivin, voimme havaita virheen käyttämällä Virhe Jatka seuraavaksi ja Virhe numero.

Virhe numero palauttaa havaitun virheen tyyppiä vastaavan virhenumeron. Jos vikaa ei ole, Virhe numero = 0.

Tämä menettely palauttaa esimerkiksi arvon 11, koska esiintyvä virhe on Ajonaikainen virhe '11'.

1234567 AlavirheNumero_ex ()Virhe Jatka seuraavaksiActiveCell.Value = 2 /0MsgBox -virhenumeroEnd Sub

Virhe käsittelyssä Err.Number kanssa

Todellinen voima Virhe numero kyky havaita, tapahtuiko virhe (Virhe numero 0). Alla olevassa esimerkissä olemme luoneet toiminnon, joka testaa, onko arkki olemassa, käyttämällä Err.Number.

12345678910111213141516171819 AlatestiWS ()MsgBox Onko WSExist ("testi")End SubToiminto Onko WSExist (wsName As String) Boolen muodossaDim ws laskentataulukkonaVirhe Jatka seuraavaksiAseta ws = Sheets (wsName)'Jos virhe WS ei ole olemassaJos Er.Numero 0 SittenOnkoWSExist = FalseMuuOnkoWSExist = TottaLoppu JosVirhe GoTo -1Lopeta toiminto

Huomautus: Olemme lisänneet a Virhe GoTo -1 loppuun, joka nollaa Err.Numeron 0: ksi (katso kaksi osaa alaspäin).

Kanssa Virhe Jatka seuraavaksi ja Virhe numero, voit toistaa "Yritä saada kiinni" muiden ohjelmointikielien toiminnallisuus.

Virhe GoTo Linja

Virhe GoTo Linja kehottaa VBA: ta "menemään" merkitylle koodiriville virheen sattuessa. Ilmoitat Siirry -lausunnon näin (jossa errHandler on rivin etiketti, johon mennä):

1 Virhe GoTo errHandler

ja luo seuraavanlainen rivitarra:

1 errHandler:

Huomautus: Tämä on sama tarra, jota käyttäisit tavallisen VBA GoTo -lausekkeen kanssa.

Alla esittelemme käytön Virhe GoTo Linja poistua menettelystä.

Virhe Poistu aliosasta

Voit käyttää On Error GoTo Line -painiketta poistuaksesi aliosasta virheen sattuessa.

Voit tehdä tämän asettamalla virheenkäsittelijän rivitarran toimenpiteen loppuun:

12345678 Sub ErrGoToEnd ()Virhe GoTo endProc'Joku koodiendProc:End Sub

tai käyttämällä Exit Sub -komentoa:

123456789101112131415 Sub ErrGoToEnd ()Virhe GoTo endProc'Joku koodiGoTo skipExitendProc:Lopeta SubskipExit:'Muutama koodiEnd Sub

Err.Clear, On Error GoTo -1 ja Reset Err.Number

Kun virhe on käsitelty, sinun on yleensä poistettava virhe, jotta vältytään tulevilta virheiden käsittelyongelmilta.

Virheen ilmetessä, molemmat Virhe Selvä ja Virhe GoTo -1 voidaan nollata Virhe numero 0. Mutta on yksi erittäin tärkeä ero: Virhe Selvä ei nollaa varsinaista virhettä, se vain nollaa Virhe numero.

Mitä tuo tarkoittaa? KäyttämälläVirhe Selvä, et voi muuttaa virheenkäsittelyasetusta. Jos haluat nähdä eron, kokeile tätä koodia ja vaihda se Virhe GoTo -1 kanssa Virhe Selvä:

123456789101112131415161718192021 Alivirheesimerkit ()Virhe GoTo errHandler:"Sovelluksen määrittämä" -virheVirhe (13)Lopeta SuberrHandler:'Tyhjennä virheVirhe GoTo -1Virhe GoTo errHandler2:"Tyyppivirhe" -virheVirhe (1034)Lopeta SuberrHandler2:Virheenkorjaus Tulostusvirhe KuvausEnd Sub

Yleensä suosittelen aina käyttöä Virhe GoTo -1, ellei sinulla ole hyvää syytä käyttää Virhe Selvä sen sijaan.

VBA Virhe MsgBox

Saatat myös haluta näyttää viestiruudun virheestä. Tässä esimerkissä näytetään erilaisia ​​viestiruutuja sen mukaan, missä virhe ilmenee:

12345678910111213141516171819202122232425262728 AlavirheMessageEx ()Dim errMsg merkkijononaVirhe GoTo errHandler'Vaihe 1errMsg = "Kopioi ja liitä vaiheessa tapahtui virhe."'Err.Raise (11)'Vaihe 2errMsg = "Tietojen validointivaiheessa tapahtui virhe."'Err.Raise (11)'Vaihe 3errMsg = "P & L-rakennus- ja kopiointivaiheessa tapahtui virhe."Err.Raise (11)'Vaihe 4errMsg = "Virhe yritettäessä kirjata tuontia asetussivulle"'Err.Raise (11)Siirry loppuunProcerrHandler:MsgBox -virheendProc:End Sub

Täällä voit korvata Err.Raise (11) todellisella koodillasi.

VBA IsError

Toinen tapa käsitellä virheitä on testata ne VBA IsError -toiminnolla. IsError -toiminto testaa lausekkeen virheiden varalta ja palauttaa arvon TOSI tai EPÄTOSI, jos virhe ilmenee.

123 Osa IsErrorEx ()MsgBox IsError (alue ("a7"). Arvo)End Sub

Jos virhe VBA

Voit myös käsitellä virheitä VBA: ssa Excel IfError -toiminnon avulla. IfError -toimintoon on päästävä käyttämällä Tehtäväluokka: Toimintoluokka:

1234567 Sub IfErrorEx ()Dim n yhtä pitkän = WorksheetFunction.IfError (Alue ("a10"). Arvo, 0)MsgBox nEnd Sub

Tämä antaa alueen A10 arvon, jos arvo on virhe, se antaa sen sijaan 0.

VBA -virhetyypit

Suorituksenaikaiset virheet

Kuten yllä mainittiin:

VBA ajonaikaiset virheet ovat virheitä, jotka tapahtuvat koodin suorittamisen aikana. Esimerkkejä ajonaikaisista virheistä ovat:

  • Viittaus olemattomaan työkirjaan, laskentataulukkoon tai muuhun objektiin
  • Virheelliset tiedot, esim. viittaus Excel -soluun, joka sisältää virheen
  • Yritetään jakaa nollalla

Voit "käsitellä" ajonaikaisia ​​virheitä yllä kuvattujen menetelmien avulla.

Syntaksivirheet

VBA -syntaksivirheet ovat virheitä koodin kirjoittamisessa. Esimerkkejä syntaksivirheistä ovat:

  • Kirjoitusvirhe
  • Välimerkit puuttuvat tai ovat virheellisiä

VBA Editor tunnistaa monet syntaksivirheet punaisella korostuksella:

VBA -editorissa on myös vaihtoehto "Automaattinen syntaksin tarkistus":

Kun tämä on valittuna, VBA Editor luo viestiruudun, joka varoittaa syntaksivirheistä koodirivin kirjoittamisen jälkeen:

Pidän tätä henkilökohtaisesti erittäin ärsyttävänä ja poistan ominaisuuden käytöstä.

Käännä virheet

Ennen toimenpiteen suorittamista VBA "kääntää" menettelyn. Kääntäminen muuttaa ohjelman lähdekoodista (jonka näet) suoritettavaksi muotoksi (et näe).

VBA -kääntämisvirheet ovat virheitä, jotka estävät koodin kääntämisen.

Hyvä esimerkki kääntämisvirheestä on puuttuva muuttujan ilmoitus:

Muita esimerkkejä ovat:

  • Varten ilman Seuraava
  • Valitse ilman Lopeta Valitse
  • Jos ilman Loppu Jos
  • Soittaminen a menettelyä Sitä ei ole olemassa

Syntaksivirheet (edellinen osa) ovat kääntämisvirheiden osajoukko.

Debug> Käännä

Kääntämisvirheet tulevat näkyviin, kun yrität suorittaa toimenpiteen. Ihannetapauksessa voit tunnistaa käännösvirheet ennen toimenpiteen suorittamista.

Voit tehdä tämän kokoamalla projektin etukäteen. Voit tehdä sen siirtymällä osoitteeseen Debug> Käännä VBA -projekti.

Kääntäjä "siirtyy" ensimmäiseen virheeseen. Kun olet korjannut virheen, käännä projekti uudelleen. Toista, kunnes kaikki virheet on korjattu.

Voit kertoa, että kaikki virheet on korjattu, koska Käännä VBA -projekti näkyy harmaana:

Ylivuotovirhe

The VBA OverFlow -virhe tapahtuu, kun yrität lisätä arvon liian suureen muuttujaan. Esimerkiksi, Kokonaislukumuuttujat voi sisältää vain arvoja välillä -32 768 -32 768. Jos syötät suuremman arvon, saat ylivuotovirheen:

Sen sijaan sinun pitäisi käyttää Pitkä muuttuja suuremman numeron tallentamiseksi.

Muut VBA -virheilmoitukset

VBA -saalisvirhe

Toisin kuin muut ohjelmointikielet, VBA: ssa ei ole Saalisilmoitus. Voit kuitenkin toistaa saalisilmoituksen käyttämällä Virhe Jatka seuraavaksi ja Jos Er.Numero 0 Sitten. Tämä on kuvattu yllä kohdassa Virheiden käsittely virheenumerolla.

VBA Ohita virhe

Jos haluat ohittaa VBA: n virheet, käytä yksinkertaisesti Virhe Jatka seuraavaksi lausunto:

1 Virhe Jatka seuraavaksi

Kuitenkin, kuten edellä mainittiin, sinun on oltava varovainen käyttäessäsi tätä lauseketta, koska se ei korjaa virhettä, vaan yksinkertaisesti jättää huomiotta virheen sisältävän koodirivin.

VBA -heittovirhe / virhe

Voit käyttää VBA: n virheitä käyttämällä Err. Nosta menetelmä.

Tämä koodirivi lisää ajonaikaista virhettä '13': Tyyppivirhe:

1 Err.Raise (13)

VBA -virheilmoitus

VBA -virheilmoitus on vain toinen termi VBA -virheiden käsittelylle.

VBA -virheilmoitus

A VBA -virheilmoitus näyttää tältä:

Kun napsautat "Debug", näet koodirivin, joka aiheuttaa virheen:

VBA -virheen käsittely silmukassa

Paras tapa hoitaa virheen käsittely silmukassa on käyttämällä Virhe Jatka seuraavaksi kera Virhe numero havaitaksesi, onko tapahtunut virhe (muista käyttää Virhe Selvä virheen poistamiseksi jokaisen tapahtuman jälkeen).

Alla oleva esimerkki jakaa kaksi numeroa (sarake A sarakkeella B) ja antaa tuloksen sarakkeeseen C. Jos on virhe, tulos on 0.

12345678910111213141516 Alatesti ()Himmennä solu alueenaVirhe Jatka seuraavaksiJokaiselle alueen solulle ("a1: a10")'Aseta solun arvocell.Offset (0, 2) .Arvo = solu.Arvo / solu.Siirto (0, 1) .Arvo'Jos Cell.Value on virhe, oletusarvo on 0Jos Er.Numero 0 Sittensolu. Siirto (0, 2). Arvo = 0Virhe SelväLoppu JosSeuraavaEnd Sub

VBA -virheen käsittely Accessissa

Kaikki yllä olevat esimerkit toimivat täsmälleen samalla tavalla Access VBA: ssa kuin Excel VBA: ssa.

123456789101112131415161718 Toiminto DelRecord (frm As Form)'tätä toimintoa käytetään taulukon tietueen poistamiseen lomakkeestaVirhe GoTo päättyyFrm: n kanssaJos .UusiTallenna Sitten.KumoaLopeta toimintoLoppu JosLopetaFrm.RecordsetClone kanssa.Kirjain = frm.Kirjanmerkki.Poistaafrm. kyselyLopetaLopeta toimintoloppu:LoppuLopeta toiminto

Tulet auttaa kehittämään sivuston jakaminen sivu ystävillesi

wave wave wave wave wave