Kui teil on vaja Excel VBA tõrkeid lahendada, saate kasutada avaldust OnError. Siiski on mõned asjad, mida peate kõigepealt teadma. Saate kasutada avaldust On Error kolmel viisil.
| Süntaks |
Mida see teeb |
| On Error GoTo silt |
Pärast selle avalduse täitmist jätkab VBA täitmist
määratud sildile järgnevas lauses. Peate lisama
sildi järele kooloni , et VBA tunneks selle sildina ära. |
| Viga GoTo 0 korral |
Pärast selle avalduse täitmist jätkab VBA tavalist
veakontrolli käitumist. Kasutage seda avaldust pärast mõne
muu tõrkeavalduse kasutamist või kui soovite
oma protseduurist veakäsitluse eemaldada . |
| Vea korral Jätka järgmisena |
Pärast selle avalduse
täitmist ignoreerib VBA lihtsalt kõiki vigu ja jätkab täitmist järgmise lausega. |
Jätkatakse pärast viga
Mõnel juhul soovite lihtsalt, et rutiin lõppeks vea ilmnemisel kaunilt. Näiteks võite kuvada tõrget kirjeldava teate ja seejärel protseduurist väljuda. (Varem näidatud EnterSquareRoot5 näide kasutab seda tehnikat.) Muudel juhtudel soovite võimalusel veast taastuda.
Veast taastumiseks peate kasutama Resume avaldust. See kustutab tõrkeseisundi ja võimaldab täitmist mõnes kohas jätkata. Resume avaldust saate kasutada kolmel viisil.
| Süntaks |
Mida see teeb |
| Jätka |
Täitmine jätkub vea põhjustanud avaldusega. Kasutage
seda juhul, kui teie veakäsitluskood probleemi lahendab ja võite
jätkata. |
| Jätka järgmisena |
Täitmine jätkub kohe pärast
vea põhjustanud avaldust. See sisuliselt ignoreerib
viga. |
| Jätkamise silt |
Täitmine jätkub teie määratud sildi juures . |
Järgmises näites kasutatakse pärast tõrke ilmnemist jätkulause:
Sub EnterSquareRoot6()
Dim Num Variandina
Hämarda sõnum stringina
Dim Ans täisarvuna
Proovi uuesti:
' Seadistage veatöötlus
Viga GoTo BadEntry
' Küsi väärtust
Num = Inputbox ("Sisesta väärtus")
Kui Num = "" Seejärel välju Sub
' Sisestage ruutjuur
ActiveCell.Value = ruut(arv)
Välju Sub
BadEntry:
Msg = Err.Number & ": " & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Sõnum & "Veenduge, et vahemik on valitud, "
Msg = sõnum & "leht pole kaitstud",
Msg = Msg & "ja sisestate mittenegatiivse väärtuse."
Msg = Sõnum & vbNewLine & vbNewLine & "Kas proovite uuesti?"
Ans = MsgBox (SMS, vbYesNo + vbCritical)
Kui Ans = vbYes, siis jätkake TryAgain
Lõpeta alam
Sellel protseduuril on veel üks silt: TryAgain. Kui ilmneb tõrge, jätkub täitmine BadEntry sildi juures ja kood kuvab alloleva teate. Kui kasutaja vastab nupul Jah, käivitub avaldus Jätka ja täitmine hüppab tagasi sildile TryAgain. Kui kasutaja klõpsab nuppu Ei, protseduur lõpeb.

Kui ilmneb viga, saab kasutaja otsustada, kas proovida uuesti.
Pange tähele, et veateade sisaldab ka vea numbrit koos "ametliku" veakirjeldusega.
Jätkamise avaldus kustutab enne jätkamist veatingimuse. Selle nägemiseks proovige eelmises näites teise kuni viimase lausega asendada järgmine lause:
Kui Ans = vbYes, siis minge ProoviAgain
Kood ei tööta õigesti, kui kasutate jätkamise asemel GoTo. Demonstreerimiseks sisestage negatiivne arv. Saate veateate. Uuesti proovimiseks klõpsake nuppu Jah ja seejärel sisestage teine negatiivne arv. See teine tõrge ei ole lõksus, kuna algset veatingimust ei kustutatud.
Vigade käsitlemine lühidalt
Siin on kiire ja räpane kokkuvõte, et aidata teil kogu seda veakäsitlust alal hoida. Veakäsitluskoodi plokil on järgmised omadused:
-
See algab kohe pärast avalduses On Error määratud silti.
-
Teie makro peaks selleni jõudma ainult vea ilmnemisel. See tähendab, et peate vahetult enne silti kasutama avaldust, nagu Exit Sub või Exit Function.
-
See võib nõuda CV avaldust. Kui otsustate tõrke ilmnemisel protseduuri mitte katkestada, peate enne põhikoodi juurde naasmist täitma käsu Jätka.
Teadmine, millal vigu ignoreerida
Mõnel juhul on täiesti okei vigu ignoreerida. Siis tuleb mängu avaldus On Error Resume Next.
Järgmine näide läbib valitud vahemiku iga lahtri ja teisendab väärtuse selle ruutjuureks. See protseduur genereerib veateate, kui valiku mõni lahter sisaldab negatiivset arvu või teksti:
Sub SelectionSqrt()
Dim cell as Range
Kui TypeName(Selection) <> “Range”, siis välju Sub
Iga valitud lahtri jaoks
lahter.Väärtus = Sqr(lahter.Väärtus)
Järgmine lahter
Lõpeta alam
Sel juhul võite lihtsalt vahele jätta kõik lahtrid, mis sisaldavad väärtust, mida ei saa ruutjuureks teisendada. Kui-Siis-struktuure kasutades saate luua igasuguseid tõrkekontrollivõimalusi, kuid te võite leida parema (ja lihtsama) lahenduse, lihtsalt ignoreerides tekkivaid vigu.
Selle saavutab järgmine rutiin, kasutades avaldust On Error Resume Next:
Sub SelectionSqrt()
Dim cell as Range
Kui TypeName(Selection) <> “Range”, siis välju Sub
Vea korral Jätka järgmisena
Iga valitud lahtri jaoks
lahter.Väärtus = Sqr(lahter.Väärtus)
Järgmine lahter
Lõpeta alam
Üldiselt võite kasutada avaldust On Error Resume Next, kui arvate, et vead on kahjutud või ei ole teie ülesandega seotud.