Riippumatta siitä, kuinka kokenut olet VBA -koodauksessa, virheet ovat aina osa sitä.
Ero aloittelijan ja asiantuntija -VBA -ohjelmoijan välillä on se, että asiantuntija -ohjelmoijat tietävät, miten käsitellä ja käyttää virheitä tehokkaasti.
Tässä opetusohjelmassa näytän sinulle erilaisia tapoja, joilla voit käsitellä virheitä tehokkaasti Excel VBA: ssa.
Ennen kuin aloitamme VBA -virheiden käsittelyn, ymmärrämme ensin erilaiset virheet, joita todennäköisesti kohtaat ohjelmoidessasi Excel VBA: ssa.
VBA -virheiden tyypit Excelissä
Excel VBA: ssa on neljän tyyppisiä virheitä:
- Syntaksivirheet
- Kokoamisvirheet
- Suorituksenaikaiset virheet
- Loogiset virheet
Ymmärrämme nopeasti, mitä nämä virheet ovat ja milloin todennäköisesti kohtaat niitä.
Syntaksivirhe
Syntaksivirhe, kuten nimestä voi päätellä, ilmenee, kun VBA löytää jotain vikaa koodin syntaksissa.
Jos esimerkiksi unohdat osan tarvittavasta lausekkeesta/syntaksista, näet kääntämisvirheen.
Alla olevassa koodissa, heti kun painan Enter -näppäintä toisen rivin jälkeen, näen käännösvirheen. Tämä johtuu siitä, että IF -lausunto tarvitsee olla "Sitten'-Komento, joka puuttuu alla olevasta koodista.
Varmistaaksesi, että näet syntaksivirheen aina, kun jotain puuttuu, sinun on varmistettava, että Autosyntax -tarkistus on käytössä. Voit tehdä tämän napsauttamalla "Työkalut" ja sitten "Asetukset". Varmista Asetukset -valintaikkunassa, että Automaattinen syntaksin tarkistus -vaihtoehto on käytössä.
Jos Automaattinen syntaksin tarkistus -vaihtoehto on poistettu käytöstä, VBA korostaa edelleen syntaksivirheellä varustetun rivin punaisella, mutta se ei näytä virhevalintaikkunaa.
Kääntämisvirhe
Kääntämisvirheet tapahtuvat, kun jotain puuttuu, jota tarvitaan koodin suorittamiseen.
Esimerkiksi alla olevassa koodissa, heti kun yritän suorittaa koodin, se näyttää seuraavan virheen. Tämä tapahtuu, kun olen käyttänyt IF Sitten -lausetta sulkematta sitä pakollisella "Lopeta jos" -kohdalla.
VBA tarkistaa jokaisen rivin kirjoittaessasi koodia ja korostaa syntaksivirheen heti, kun rivi on väärä ja painat enter. Kääntämisvirheet tunnistetaan vasta sitten, kun VBA analysoi koko koodin.
Seuraavassa on joitain tilanteita, joissa saat käännösvirheen:
- IF -lausekkeen käyttäminen ilman IF -loppua
- For -lauseen käyttäminen Nextin kanssa
- Select -lauseen käyttäminen ilman lopetusvalintaa
- Ei ilmoita muuttujaa (tämä toimii vain, kun Option Explicit on käytössä)
- Soittaminen ali/toiminnolle, jota ei ole (tai joilla on väärät parametrit)
Suoritusajan virheet
Suorituksenaikaiset virheet tapahtuvat, kun koodi on käynnissä.
Suoritusaikavirheet tapahtuvat vain, kun kaikki syntaksi- ja kääntämisvirheet hoidetaan.
Jos esimerkiksi käytät koodia, jonka pitäisi avata Excel -työkirja, mutta kyseinen työkirja ei ole käytettävissä (joko poistettu tai nimi muutettu), koodi antaa sinulle ajonaikaisen virheen.
Kun ajonaikainen virhe ilmenee, se pysäyttää koodin ja näyttää virhevalintaikkunan.
Suoritusajan virhe -valintaikkunan viesti on hieman hyödyllisempi. Se yrittää selittää ongelman, joka voi auttaa sinua korjaamaan sen.
Jos napsautat Debug -painiketta, se korostaa koodin osan, joka johtaa virheeseen.
Jos olet korjannut virheen, voit napsauttaa työkalupalkin Suorita -painiketta (tai paina F5) jatkaaksesi koodin suorittamista siitä, mihin se jäi.
Tai voit myös napsauttaa Lopeta -painiketta poistuaksesi koodista.
Tärkeä: Jos napsautat valintaikkunan Lopeta -painiketta, se pysäyttää koodin sillä rivillä, jolla se on. Kaikki sitä edeltäneet koodirivit olisi kuitenkin suoritettu.Loogiset virheet
Loogiset virheet eivät estä koodiasi, mutta voivat johtaa vääriin tuloksiin. Nämä voivat myös olla vaikeimpia vianmääritystyyppejä.
Kääntäjä ei korosta näitä virheitä, ja ne on korjattava manuaalisesti.
Yksi esimerkki loogisista virheistä (joihin usein joudun jumissa) on loputon silmukka.
Toinen esimerkki voisi olla, kun se antaa väärän tuloksen. Voit esimerkiksi käyttää koodissa väärää muuttujaa tai lisätä kaksi muuttujaa, jos toinen on väärä.
Käytän loogisia virheitä useilla tavoilla:
- Lisää viestilaatikko johonkin kohtaan koodissa ja korosta arvot/tiedot, jotka voivat auttaa ymmärtämään, että kaikki menee odotetusti.
- Sen sijaan, että ajaisit koodia kerralla, käy jokainen rivi läpi yksitellen. Voit tehdä tämän napsauttamalla mitä tahansa koodin kohtaa ja painamalla F8. huomaat, että joka kerta kun painat F8, yksi rivi suoritetaan. Tämän avulla voit käydä koodin läpi rivi kerrallaan ja tunnistaa loogiset virheet.
Debugin käyttäminen kääntämis-/syntaksivirheiden löytämiseen
Kun olet saanut koodin valmiiksi, on hyvä koota se ensin ennen käynnistämistä.
Voit koota koodin napsauttamalla työkalupalkin Debug -vaihtoehtoa ja napsauttamalla Compile VBAProject.
Kun käännät VBA -projektin, se käy läpi koodin ja tunnistaa mahdolliset virheet.
Jos se löytää virheen, se näyttää virhevalintaikkunan. Se löytää virheet yksi kerrallaan. Joten jos se löytää virheen ja olet korjannut sen, sinun on suoritettava kääntäminen uudelleen löytääksesi muita virheitä (jos niitä on).
Kun koodisi ei sisällä virheitä, Compile VBAProject -vaihtoehto näkyy harmaana.
Huomaa, että kääntäminen löytää vain syntaksi- ja kääntämisvirheet. Se EI löydä ajonaikaisia virheitä.
Kun kirjoitat VBA -koodia, et halua virheiden nousevan esiin. Tämän välttämiseksi voit käyttää monia virheiden käsittelymenetelmiä.
Tämän artikkelin seuraavissa osissa käsittelen menetelmiä, joita voit käyttää VBA -virheiden käsittelyyn Excelissä.
Virheasetusten määrittäminen (käsiteltyjä käsittelemättömiä virheitä)
Ennen kuin aloitat koodin käsittelyn, sinun on tarkistettava yksi asetus Excel VBA: ssa.
Siirry VBA -työkaluriville ja valitse Työkalut ja sitten Asetukset.
Napsauta Asetukset -valintaikkunassa Yleiset -välilehteä ja varmista, että "Virheiden sieppaaminen" -ryhmässä "Tauko käsittelemättömissä virheissä" on valittu.
Selitän kolme vaihtoehtoa:
- Tauko kaikista virheistä: Tämä pysäyttää koodisi kaikentyyppisissä virheissä, vaikka olisit käyttänyt tekniikoita näiden virheiden käsittelyyn.
- Tauko luokan moduulissa: Tämä pysäyttää koodisi kaikissa käsittelemättömissä virheissä, ja samalla, jos käytät objekteja, kuten Userforms, se rikkoutuu myös näiden objektien sisällä ja korostaa tarkan rivin, joka aiheuttaa virheen.
- Tauko käsittelemättömistä virheistä: Tämä pysäyttää koodisi vain niiden virheiden vuoksi, joita ei käsitellä. Tämä on oletusasetus, koska se varmistaa, että kaikki käsittelemättömät virheet ilmoitetaan. Jos käytät objekteja, kuten Userforms, tämä ei korosta objektin virheen aiheuttavaa viivaa, vaan korostaa vain viivaa, joka viittaa kyseiseen objektiin.
Lyhyesti sanottuna - jos olet vasta aloittamassa Excel VBA: ta, varmista, että 'Break on Unhandled Errors' on valittuna.
VBA -virheiden käsittely 'Virheilmoituksilla'
Kun koodisi havaitsee virheen, voit tehdä seuraavat toimet:
- Ohita virhe ja anna koodin jatkaa
- Pidä virheenkäsittelykoodi paikallaan ja suorita se virheen ilmetessä
Molemmat näistä virheiden käsittelymenetelmistä varmistavat, että loppukäyttäjä ei näe virhettä.
On olemassa muutamia virheilmoituksia, joiden avulla voit tehdä nämä.
Virhe Jatka seuraavaksi
Kun käytät koodissa "On Error Resume Next", virhe havaitaan ja koodi jatkuu.
Tätä virheiden käsittelymenetelmää käytetään melko usein, mutta sinun on oltava varovainen sitä käytettäessä. Koska se jättää täysin huomiotta kaikki mahdolliset virheet, et ehkä pysty tunnistamaan korjattavia virheitä.
Jos esimerkiksi alla oleva koodi suoritetaan, se palauttaa virheen.
Sub AssignValues () x = 20 /4 y = 30/0 End Sub
Tämä johtuu siitä, että et voi jakaa lukua nollalla.
Mutta jos käytän "On Error Resume Next" -lausetta tässä koodissa (kuten alla), se jättää virheen huomiotta, enkä tiedä, että ongelma on korjattava.
Sub AssignValues () Päällä Virhe Jatka Seuraava x = 20 /4 y = 30/0 Lopeta osa
On Error Resume Next -toimintoa tulee käyttää vain, kun tiedät selvästi, millaisia virheitä VBA -koodisi odotetaan heittävän, ja on hyvä jättää se huomiotta.
Esimerkiksi alla on VBA -tapahtumakoodi, joka lisää välittömästi päivämäärän ja kellonajan arvon vasta lisätyn taulukon soluun A1 (tämä koodi lisätään laskentataulukkoon eikä moduuliin).
Yksityinen alityökirja_Uusi arkki (ByVal Sh objektina) Sh.Range ("A1") = Muoto (Nyt, "pp-kk-vvvv hh: mm: ss") Loppuosa
Vaikka tämä toimii useimmissa tapauksissa hyvin, se näyttäisi virheen, jos lisäisin kaavioarkin laskentataulukon sijasta. Koska kaavioarkissa ei ole soluja, koodi heittää virheen.
Joten jos käytän tämän koodin "On Error Resume Next" -lausetta, se toimii odotetusti laskentataulukoiden kanssa eikä tee mitään kaavioarkkeilla.
Yksityinen osa Työkirja_Uusi-arkki (ByVal Sh objektina) Virheessä Jatka Seuraava Sh.Range ("A1") = Muoto (Nyt, "pp-kk-vvvv tt: mm: ss") Loppuosa
Huomautus: Virheessä Jatka seuraavaa lausumaa on parasta käyttää, kun tiedät millaisia virheitä todennäköisesti kohtaat. Ja jos luulet, että on turvallista jättää nämä virheet huomiotta, voit käyttää sitä.
Voit viedä tämän koodin seuraavalle tasolle analysoimalla, tapahtuiko virhe, ja näyttämällä siihen liittyvän viestin.
Alla oleva koodi näyttää viestiruudun, joka ilmoittaa käyttäjälle, että laskentataulukkoa ei ole lisätty.
Private Sub Workbook_NewSheet (ByVal Sh as Object) On Error Jatka Seuraava Sh.Range ("A1") = Format (Nyt, "dd-mmm-yyyy hh: mm: ss") Jos Err.Number 0 Sitten MsgBox "Näyttää sinulta lisäsi kaavioarkin "& vbCrLf &" Virhe - "& Err.Kuvaus Loppu Jos loppuosa
'Err.Number' -toimintoa käytetään virhenumeron saamiseen ja 'Err.Description' -toimintoa käytetään virheen kuvauksen saamiseen. Näitä käsitellään myöhemmin tässä opetusohjelmassa.
Virhe GoTo 0
'On Error GoTo 0' pysäyttää virheen aiheuttavan rivin koodin ja näyttää virheilmoituksen.
Yksinkertaisesti sanottuna se mahdollistaa virheiden oletustarkistuskäyttäytymisen ja näyttää oletusvirhesanoman.
Miksi sitten edes käyttää sitä?
Normaalisti sinun ei tarvitse käyttää 'On Error Goto 0' -toimintoa, mutta siitä voi olla hyötyä, kun käytät sitä yhdessä 'On Error Resume Next' -toiminnon kanssa
Anna minun selittää!
Alla oleva koodi valitsee kaikki valinnan tyhjät solut.
Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Valitse End Sub
Mutta se näyttäisi virheen, kun valituissa soluissa ei ole tyhjiä soluja.
Joten välttääksesi virheen näyttämisen, voit käyttää On Error Resume next '
Nyt se näyttää myös virheen, kun suoritat alla olevan koodin:
Sub SelectFormulaCells () On Error Jatka seuraavaan valintaan. SpecialCells (xlCellTypeBlanks) Valitse End Sub
Toistaiseksi niin hyvä!
Ongelma syntyy, kun koodin jossain osassa voi ilmetä virheitä, ja koska käytät "On Error Resume Next" -kohtaa, koodi yksinkertaisesti jättää sen huomiotta ja siirtyy seuraavalle riville.
Esimerkiksi alla olevassa koodissa ei olisi virheilmoitusta:
Sub SelectFormulaCells () Virheessä Jatka seuraava valinta.SpecialCells (xlCellTypeBlanks) .Valitse '… lisää koodia, joka voi sisältää virheen End Sub
Yllä olevassa koodissa on kaksi paikkaa, joissa voi tapahtua virhe. Ensimmäisessä paikassa valitaan kaikki tyhjät solut (käyttämällä Selection.SpecialCells) ja toinen on jäljellä olevassa koodissa.
Vaikka ensimmäinen virhe on odotettavissa, kaikki virheet sen jälkeen eivät ole.
Tässä On Error Goto 0 tulee pelastamaan.
Kun käytät sitä, palautat virheasetuksen oletusarvoon, jossa se alkaa näyttää virheitä, kun se kohtaa sen.
Esimerkiksi alla olevassa koodissa ei olisi virhettä, jos tyhjiä soluja ei ole, mutta virheilmoitus tulee '10/0 '
Sub SelectFormulaCells () On Error Jatka seuraavaan valintaan.SpecialCells (xlCellTypeBlanks) .Valitse On Error GoTo 0 '… lisää koodia, joka voi sisältää virheen End Sub
Virhe Goto [Label]
Yllä olevat kaksi menetelmää - "Virhe jatka seuraavaksi" ja "Virhe Goto 0" - eivät salli meidän todella käsitellä virhettä. Toinen saa koodin jättämään virheen huomiotta ja toinen jatkaa virheiden tarkistusta.
On Error Go [Label] on tapa, jolla voit määrittää, mitä haluat tehdä, jos koodissasi on virhe.
Alla on koodirakenne, joka käyttää tätä virhekäsittelijää:
Alitesti () Virheessä GoTo Label: X = 10 /0 'tämä rivi aiheuttaa virheen'…. Jäljellä oleva koodisi menee tänne Poistu alitunnisteesta:
Huomaa, että ennen virheen "Label" käsittelyssä on Exit Sub. Tämä varmistaa, että jos virheitä ei ole, aliosa poistuu eikä Label -koodia suoriteta. Jos et käytä Exit Subia, se suorittaa aina Label -koodin.
Alla olevassa esimerkkikoodissa, kun tapahtuu virhe, koodi hyppää ja suorittaa koodin käsittelijäosassa (ja näyttää viestiruudun).
Alivirheenkäsittelijä () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Näyttää olevan virhe" & vbCrLf & Err.Kuvaus Loppuosa
Huomaa, että kun tapahtuu virhe, koodi on jo suoritettu ja suorittanut rivit ennen virheen aiheuttavaa riviä. Yllä olevassa esimerkissä koodi asettaa X: n arvoksi 12, mutta koska virhe ilmenee seuraavalla rivillä, se ei aseta arvoja Y: lle ja Z: lle.
Kun koodi hyppää virheenkäsittelijän koodiin (tässä esimerkissä ErrMsg), se jatkaa kaikkien rivien suorittamista virhekäsittelijän koodissa ja sen alapuolella sekä poistuu aliosasta.
Virhe Goto -1
Tämä on hieman monimutkainen, ja useimmissa tapauksissa et todennäköisesti käytä tätä.
Mutta käsittelen silti tätä, koska olen kohdannut tilanteen, jossa sitä tarvittiin (voit jättää huomiotta ja siirtyä seuraavaan osioon, jos etsit vain perusasioita).
Ennen kuin pääsen sen mekaniikkaan, haluan yrittää selittää, missä se voi olla hyödyllistä.
Oletetaan, että sinulla on koodi, jossa tapahtuu virhe. Mutta kaikki on hyvin, koska sinulla on yksi virhekäsittelijä paikallaan. Mutta mitä tapahtuu, kun virheenkäsittelijän koodissa on toinen virhe (joo … hieman kuten alkuelokuva).
Tässä tapauksessa et voi käyttää toista käsittelijää, koska ensimmäistä virhettä ei ole poistettu. Joten kun olet käsitellyt ensimmäisen virheen, VBA: n muistissa se on edelleen olemassa. Ja VBA -muistissa on vain yksi virhe - ei kahta tai enemmän.
Tässä skenaariossa voit käyttää On Error Goto -1.
Se poistaa virheen ja vapauttaa VBA -muistin seuraavan virheen käsittelemiseksi.
Puhetta riittää!
Selitän nyt esimerkkien avulla.
Oletetaan, että minulla on alla oleva koodi. Tämä aiheuttaa virheen, koska jako on nolla.
Alivirheenkäsittelijä () X = 12 Y = 20/0 Z = 30 Loppuosa
Joten käsittelen sitä käyttämällä virhekäsittelijän koodia (nimellä ErrMsg), kuten alla on esitetty:
Alivirheenkäsittelijä () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Näyttää olevan virhe" & vbCrLf & Err.Kuvaus Loppuosa
Kaikki on nyt taas hyvin. Heti kun virhe ilmenee, käytetään virheenkäsittelijää, joka näyttää viestiruudun alla olevan kuvan mukaisesti.
Nyt laajennan koodia niin, että minulla on enemmän koodia virhekäsittelijässä tai sen jälkeen.
Alivirheenkäsittelijä () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Näyttää olevan virhe" & vbCrLf & Err.Kuvaus A = 10/2 B = 35/0 Loppuosa
Koska ensimmäinen virhe on käsitelty, mutta toinen ei, näen jälleen virheen, kuten alla.
Edelleen kaikki hyvin. Koodi toimii odotetulla tavalla.
Joten toisen virheen käsittelemiseksi käytän toista virhekäsittelijää (ErrMsg2).
Alivirheenkäsittelijä () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Näyttää olevan virhe" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Poistu alivirheestä ErrMsg2: MsgBox "Taas on virhe" & vbCrLf & Err.Kuvaus Loppuosa
Ja tässä se on ei toimi odotetusti.
Jos suoritat yllä olevan koodin, se antaa sinulle silti ajonaikaisen virheen, vaikka toinen virhekäsittelijä olisi paikallaan.
Tämä tapahtuu, koska emme poistaneet ensimmäistä virhettä VBA: n muistista.
Kyllä me hoidimme asian! Mutta se jää silti muistiin.
Ja kun VBA kohtaa toisen virheen, se on edelleen jumissa ensimmäisen virheen kanssa, joten toista virhekäsittelijää ei käytetä. Koodi pysähtyy virheen aiheuttaneelle riville ja näyttää virhekehotteen.
Jos haluat tyhjentää VBA: n muistin ja poistaa edellisen virheen, sinun on käytettävä virhettä Goto -1.
Joten jos lisäät tämän rivin alla olevaan koodiin ja suoritat sen, se toimii odotetusti.
Alivirheenkäsittelijä () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Näyttää olevan virhe" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Poistu alivirheestä ErrMsg2: MsgBox "Taas on virhe" & vbCrLf & Err.Kuvaus Loppuosamerkintä: Virhe poistuu automaattisesti aliohjelman päätyttyä.Joten "Virhe Goto -1" voi olla hyödyllinen, kun saat kaksi tai enemmän virheitä samaan aliohjelmaan.
Err -objekti
Aina kun koodissa ilmenee virhe, se on Err -objekti, jota käytetään virheen tietojen (kuten virheen numeron tai kuvauksen) saamiseen.
Virhe Objektin ominaisuudet
Err -objektilla on seuraavat ominaisuudet:
Omaisuus | Kuvaus |
Määrä | Numero, joka edustaa virheen tyyppiä. Jos virheitä ei ole, tämä arvo on 0 |
Kuvaus | Lyhyt kuvaus virheestä |
Lähde | Projektin nimi, jossa virhe tapahtui |
HelpContext | Ohjetiedoston virheen ohjeen kontekstitunnus |
HelpFile | Merkkijono, joka edustaa kansion sijaintia ja ohjetiedoston tiedostonimeä |
Vaikka useimmissa tapauksissa sinun ei tarvitse käyttää Err -objektia, siitä voi joskus olla hyötyä Excelin virheiden käsittelyssä.
Oletetaan esimerkiksi, että sinulla on alla esitetyn kaltainen tietojoukko ja jokaisen numeron kohdalla haluat laskea neliöjuuren viereisessä solussa.
Alla oleva koodi voi tehdä sen, mutta koska solussa A5 on tekstijono, se näyttää virheen heti, kun tämä tapahtuu.
Sub FindSqrRoot () Dim rng as Range Set rng = Valinta jokaiselle solulle rng -solussa. Offset (0, 1). Value = Sqr (cell.Value) Seuraava solu End Sub
Tämän tyyppisen virheilmoituksen ongelma on, että se ei kerro mitään siitä, mikä on mennyt pieleen ja missä ongelma esiintyi.
Err -objektin avulla voit tehdä näistä virheilmoituksista mielekkäämpiä.
Jos esimerkiksi käytän nyt alla olevaa VBA -koodia, se pysäyttää koodin heti, kun virhe ilmenee, ja näyttää viestiruudun, jossa on sen solun osoite, jossa on ongelma.
Sub FindSqrRoot () Dim rng as Range Set rng = Valinta jokaiselle solulle In rng On Error GoTo ErrHandler cell.Oset (0, 1) .Value = Sqr (cell.Value) Seuraava solu ErrHandler: MsgBox "Virheen numero:" & Err .Number & vbCrLf & _ "Virheen kuvaus:" & Err.Description & vbCrLf & _ "Virhe osoitteessa:" & cell.Address End Sub
Yllä oleva koodi antaisi sinulle paljon enemmän tietoa kuin yksinkertainen "Tyyppivirhe", erityisesti soluosoite, jotta tiedät missä virhe tapahtui.
Voit tarkentaa tätä koodia edelleen varmistaaksesi, että koodisi toimii loppuun asti (sen sijaan, että se rikkoutuisi jokaisen virheen yhteydessä), ja antaa sitten luettelon soluosoitteista, joissa virhe ilmenee.
Alla oleva koodi toimisi näin:
Sub FindSqrRoot2 () Dim ErrorCells merkkijonona Dim rng alueena Virhe Jatka seuraavaksi Aseta rng = Valinta jokaiselle solulle rng -solussa. Offset (0, 1) .Arvo = Sqr (cell.Value) Jos Err.Number 0 Sitten ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Virhe seuraavissa soluissa" & ErrorCells Poistu alipäästä
Yllä oleva koodi kulkee loppuun asti ja antaa neliöjuuren kaikista soluista, joissa on numeroita (viereisessä sarakkeessa). Sitten se näyttää viestin, jossa luetellaan kaikki solut, joissa oli virhe (kuten alla):
Err Object Methods
Vaikka Err -ominaisuudet ovat hyödyllisiä näyttämään hyödyllistä tietoa virheistä, on myös kaksi Err -menetelmää, jotka voivat auttaa sinua virheiden käsittelyssä.
Menetelmä | Kuvaus |
Asia selvä | Poistaa kaikki Err -objektin ominaisuusasetukset |
Nostaa | Luo ajonaikaisen virheen |
Opetellaan nopeasti, mitä nämä ovat ja miten/miksi niitä käytetään VBA: n kanssa Excelissä.
Virhe Selkeä menetelmä
Oletetaan, että sinulla on alla esitetyn kaltainen tietojoukko ja haluat saada kaikkien näiden numeroiden neliöjuuren viereiseen sarakkeeseen.
Seuraava koodi hakee viereisen sarakkeen kaikkien numeroiden neliöjuuret ja näyttää viestin, että soluissa A5 ja A9 tapahtui virhe (koska niissä on tekstiä).
Sub FindSqrRoot2 () Dim ErrorCells merkkijonona Dim rng alueena Virhe Jatka seuraavaksi Aseta rng = Valinta jokaiselle solulle rng -solussa. Offset (0, 1) .Arvo = Sqr (cell.Value) Jos Err.Number 0 Sitten ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Virhe seuraavissa soluissa" & ErrorCells End Sub
Huomaa, että olen käyttänyt Err.Clear -menetelmää If If -lausekkeessa.
Kun virhe on tapahtunut ja jos If -ehto on jäänyt kiinni, Err.Clear -menetelmä palauttaa virheen numeron takaisin arvoon 0. Tämä varmistaa, että IF -ehto sieppaa virheet vain soluille, joissa se on nostettu.
Jos en olisi käyttänyt Err.Clear -menetelmää, virheen ilmetessä se olisi aina totta IF -tilassa, eikä virheen numeroa ole nollattu.
Toinen tapa tehdä tämä työ on käyttää virhettä Goto -1, joka nollaa virheen kokonaan.
merkintä: Err.Clear on eri kuin On Error Goto -1. ErrClear tyhjentää vain virheen kuvauksen ja virheen numeron. se ei nollaa sitä kokonaan. Tämä tarkoittaa sitä, että jos samassa koodissa on toinen virheilmoitus, et voi käsitellä sitä ennen sen nollaamista (mikä voidaan tehdä käyttämällä On Ongelma Goto -1 eikä Err.Clear).Err Korotusmenetelmä
Err.Raise-menetelmän avulla voit nostaa ajonaikaisen virheen.
Alla on Err.Raise -menetelmän käytön syntaksi:
Err.Raise [numero], [lähde], [kuvaus], [helpfile], [helpcontext]
Kaikki nämä argumentit ovat valinnaisia, ja voit käyttää niitä virheilmoituksen mielekkyyden lisäämiseen.
Mutta miksi haluat koskaan tehdä virheen itse?
Hyvä kysymys!
Voit käyttää tätä menetelmää, kun esiintyy virhe (mikä tarkoittaa, että virhe tapahtuu joka tapauksessa), ja sitten käytät tätä tapaa kertoa käyttäjälle enemmän virheestä (VBA: n näyttämän vähemmän hyödyllisen virheilmoituksen sijaan) oletuksena).
Oletetaan esimerkiksi, että sinulla on alla esitetyn kaltainen tietojoukko ja haluat, että kaikilla soluilla on vain numeerisia arvoja.
Sub RaiseError () Dim rng as Range Set rng = Valinta Virhe GoTo ErrHandler jokaiselle solulle rng Jos ei (IsNumeric (Cell.Value)) Sitten Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Lopeta, jos seuraava soluvirhe
Yllä oleva koodi näyttää virheilmoituksen, jossa on määritetty kuvaus ja kontekstitiedosto.
Henkilökohtaisesti en ole koskaan käyttänyt Err.Raisia, koska työskentelen enimmäkseen vain Excelin kanssa. Mutta jos joku käyttää VBA: ta Excelin kanssa muiden sovellusten, kuten Outlookin, Wordin tai PowerPointin kanssa, tämä voi olla hyödyllistä.
Tässä on yksityiskohtainen artikkeli Err.Raise -menetelmästä, jos haluat oppia lisää.
VBA -virheiden käsittelyn parhaat käytännöt
Riippumatta siitä, kuinka taitava saat VBA -koodin kirjoittamisen, virheet ovat aina osa sitä. Parhaat kooderit ovat niitä, joilla on taidot käsitellä nämä virheet oikein.
Tässä on joitain parhaita käytäntöjä, joita voit käyttää Excel VBA: n virheiden käsittelyssä.
- Käytä "On Error Go [Label]" koodin alussa. Tämä varmistaa, että kaikki mahdolliset virheet käsitellään sieltä.
- Käytä Jatka virhettä -painiketta VAIN, kun olet varma mahdollisista virheistä. Käytä sitä vain odotetun virheen kanssa. Jos käytät sitä odottamattomien virheiden kanssa, se yksinkertaisesti jättää sen huomiotta ja siirtyy eteenpäin. Voit käyttää 'On Error Resume Next' -toimintoa 'Err.Raise' -toiminnon kanssa, jos haluat ohittaa tietyn tyyppisen virheen ja saada loput.
- Kun käytät virheenkäsittelijöitä, varmista, että käytät Exit Subia ennen käsittelijöitä. Näin varmistetaan, että virhekäsittelijän koodi suoritetaan vain virheen sattuessa (muuten se suoritetaan aina).
- Käytä useita virheenkäsittelijöitä erilaisten virheiden sieppaamiseen. Useiden virheiden käsittelijä varmistaa, että virhe korjataan oikein. Haluat esimerkiksi käsitellä "tyyppivirhe" -virhettä eri tavalla kuin "Jaa 0: lla" ajonaikaista virhettä.
Toivottavasti tämä Excel -artikkeli oli hyödyllinen!
Tässä on joitain muita Excel VBA -opetusohjelmia, joista saatat pitää:
- Excel VBA -tyypit - Täydellinen opas
- Excel VBA -silmukat - seuraavaksi, tee aikaa, tee kunnes, jokaiselle
- Excel VBA -tapahtumat - helppo (ja täydellinen) opas
- Excel Visual Basic Editor - Kuinka avata ja käyttää sitä Excelissä