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. NostaKatso 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 |