Virheenkäsittelijöiden avulla voit määrittää, mitä tapahtuu, kun Excel-makrokoodin suorittamisen aikana tapahtuu virhe. Virhekäsittelijät ovat rivejä, jotka ovat samankaltaisia kuin seuraavat:
On Error GoTo MyError
Ilman virheenkäsittelijöitä kaikki koodissasi ilmenevät virheet kehottavat Exceliä aktivoimaan vähemmän hyödyllisen virhesanoman, joka ei yleensä kerro tapahtuneesta selkeästi. Virheenkäsittelijöiden avulla voit kuitenkin jättää virheen huomioimatta tai poistua koodista kauniisti omalla viestilläsi käyttäjälle.
On olemassa kolmenlaisia On Error -lauseita:
-
On Error GoTo SomeLabel: Koodi hyppää määritettyyn tarraan.
-
Virheestä Jatka seuraavaksi: Virhe ohitetaan ja koodi jatkuu.
-
Virhe GoTo 0: VBA palaa normaaliin virheentarkistustoimintaan.
On Error GoTo SomeLabel
Joskus koodin virhe tarkoittaa, että sinun on poistuttava toimenpiteestä sulavasti ja annettava käyttäjille selkeä viesti. Näissä tilanteissa voit käyttää On Error GoTo -käskyä käskeäksesi Exceliä siirtymään tietylle koodiriville.
Esimerkiksi seuraavassa pienessä koodinpätkässä kehotat Exceliä jakamaan solun A1 arvon solun A2 arvolla ja sijoittamaan sitten vastauksen soluun A3. Helppo. Mikä voisi mennä pieleen?
Alamakro1()
Alue("A3").Arvo = Alue("A1").Arvo / Alue("A2").Arvo
Lopeta ala
Kuten käy ilmi, kaksi suurta asiaa voi mennä pieleen. Jos solussa A2 on 0, saat jako nollalla -virheen. Jos solu A2 sisältää ei-numeerisen arvon, saat tyyppivirheen.
Voit välttää ikävän virhesanoman kertomalla Excelille, että On Error haluat koodin suorituksen siirtyvän MyExit-nimiseen tunnisteeseen.
Seuraavassa koodissa MyExit-tarraa seuraa käyttäjälle viesti, joka antaa ystävällisiä neuvoja ilkeän virheilmoituksen sijaan. Huomaa myös Exit Sub -rivi ennen MyExit-tunnistetta, joka varmistaa, että koodi yksinkertaisesti poistuu, jos virhettä ei tapahdu:
Alamakro1()
Virheessä Siirry MyExitiin
Alue("A3").Arvo = Alue("A1").Arvo / Alue("A2").Arvo
Poistu Subista
MyExit:
MsgBox "Käytä kelvollisia nollasta poikkeavia numeroita"
Lopeta ala
Virheestä Jatka seuraavaksi
Joskus haluat Excelin ohittavan virheen ja yksinkertaisesti jatkavan koodin suorittamista. Näissä tilanteissa voit käyttää On Error Resume Next -lausetta.
Esimerkiksi seuraava koodinpätkä on tarkoitettu poistamaan tiedosto nimeltä GhostFile.exe C:Temp-hakemistosta. Kun tiedosto on poistettu, mukava viestilaatikko kertoo käyttäjälle, että tiedosto on poissa:
Alamakro1()
Tapa "C:TempGhostFile.exe"
MsgBox "Tiedosto on poistettu."
Lopeta ala
Koodi toimii hyvin, jos poistettava tiedosto on todellakin. Mutta jos jostain syystä tiedostoa nimeltä GhostFile.exe ei ole C:Temp-asemassa, tapahtuu virhe.
Tässä tapauksessa et välitä, jos tiedosto ei ole siellä, koska aiot poistaa sen joka tapauksessa. Joten voit yksinkertaisesti jättää virheen huomioimatta ja jatkaa koodilla.
Käyttämällä On Error Resume Next -käskyä koodi kulkee kulkuaan riippumatta siitä, onko kohdetiedosto olemassa vai ei:
Alamakro1()
Virheestä Jatka seuraavaksi
Tapa "C:TempGhostFile.exe"
MsgBox "Tiedosto on poistettu."
Lopeta ala
Virheessä GoTo 0
Tiettyjä virheilmoituksia käytettäessä voi olla tarpeen nollata VBA:n virheentarkistuskäyttäytyminen. Ymmärtääksesi, mitä tämä tarkoittaa, katso seuraava esimerkki.
Täällä haluat ensin poistaa tiedoston nimeltä GhostFile.exe C:Temp-hakemistosta. Voit välttää virheet, jotka voivat johtua siitä, ettei kohdetiedostoa ole olemassa, käyttämällä On Error Resume Next -lausetta. Sen jälkeen yrität tehdä epäilyttävää matematiikkaa jakamalla 100/Mike:
Alamakro1()
Virheestä Jatka seuraavaksi
Tapa "C:TempGhostFile.exe"
Alue ("A3"). Arvo = 100 / "Mike"
Lopeta ala
Tämän koodinpätkän suorittamisen pitäisi tuottaa virheen sumean matematiikan takia, mutta se ei tee sitä. Miksi? Koska viimeisin koodille antamasi ohje oli On Error Resume Next. Kaikki tämän rivin jälkeen havaitut virheet jätetään huomioimatta.
Voit korjata tämän ongelman jatkamalla normaalia virheentarkistustoimintaa On Error GoTo 0 -käskyn avulla:
Alamakro1()
Virheestä Jatka seuraavaksi
Tapa "C:TempGhostFile.exe"
Virheessä GoTo 0
Alue ("A3"). Arvo = 100 / "Mike"
Lopeta ala
Tämä koodi ohittaa virheet On Error GoTo 0 -lauseeseen asti. Tämän lausunnon jälkeen koodi palaa normaaliin virheentarkistustilaan ja laukaisee odotetun virheen, joka johtuu sumeasta matematiikasta.