„Excel VBA“ klaidų tvarkymas - viskas, ką reikia žinoti!

Nesvarbu, kiek esate patyręs VBA kodavimo, klaidos visada bus jo dalis.

Skirtumas tarp pradedančiojo ir eksperto VBA programuotojo yra tas, kad programuotojai ekspertai žino, kaip efektyviai tvarkyti ir naudoti klaidas.

Šioje pamokoje parodysiu įvairius būdus, kaip efektyviai tvarkyti klaidas „Excel VBA“.

Prieš pradėdami dirbti su VBA klaidų tvarkymu, pirmiausia suprasime įvairių tipų klaidas, su kuriomis galite susidurti programuodami „Excel VBA“.

VBA klaidų tipai „Excel“

„Excel VBA“ yra keturių tipų klaidos:

  1. Sintaksės klaidos
  2. Kompiliacijos klaidos
  3. Vykdymo laiko klaidos
  4. Loginės klaidos

Greitai suprasime, kas yra šios klaidos ir kada su jomis susidursite.

Sintaksės klaida

Sintaksės klaida, kaip rodo pavadinimas, įvyksta, kai VBA nustato, kad kodo sintaksėje kažkas ne taip.

Pvz., Jei pamiršite reikiamą teiginio/sintaksės dalį, pamatysite kompiliavimo klaidą.

Žemiau esančiame kode, kai tik paspaudžiu enter po antros eilutės, matau kompiliavimo klaidą. Taip yra todėl, kad IF pareiškimas reikia turėti "Tada'Komanda, kurios trūksta žemiau esančiame kode.

Pastaba: Kai įvedate kodą „Excel VBA“, jis tikrina kiekvieną sakinį, kai tik paspaudžiate „Enter“. Jei VBA nustato, kad sintaksėje trūksta kažko, ji iškart parodo pranešimą su tam tikru tekstu, kuris gali padėti suprasti trūkstamą dalį.

Norėdami įsitikinti, kad matote sintaksės klaidą, kai kažko trūksta, turite įsitikinti, kad įjungta automatinės sintaksės patikra. Norėdami tai padaryti, spustelėkite „Įrankiai“, tada spustelėkite „Parinktys“. Parinkčių dialogo lange įsitikinkite, kad įjungta parinktis „Automatinis sintaksės tikrinimas“.

Jei parinktis „Automatinis sintaksės tikrinimas“ yra išjungta, VBA vis tiek paryškins raudonai raudoną eilutę su sintaksės klaida, bet nebus rodomas klaidos dialogo langas.

Kompiliavimo klaida

Kompiliavimo klaidos atsiranda, kai trūksta kažko, ko reikia kodui paleisti.

Pavyzdžiui, žemiau esančiame kode, kai tik bandysiu paleisti kodą, jis parodys šią klaidą. Tai atsitinka, nes aš naudoju IF IF teiginį, neuždarydamas jo privalomu „End If“.

Sintaksės klaida taip pat yra kompiliavimo klaidos rūšis. Sintaksės klaida atsiranda vos paspaudus klavišą Enter ir VBA nustato, kad kažko trūksta. Kompiliavimo klaida taip pat gali atsirasti, kai VBA neranda nieko trūkstant įvedant kodą, tačiau ji atsiranda, kai kodas surenkamas arba vykdomas.

VBA tikrina kiekvieną eilutę, kai rašote kodą, ir pabrėžia sintaksės klaidą, kai tik eilutė neteisinga ir paspaudžiate klavišą Enter. Kita vertus, kompiliavimo klaidos nustatomos tik tada, kai VBA analizuoja visą kodą.

Žemiau yra keletas scenarijų, kai susidursite su kompiliavimo klaida:

  1. IF pareiškimo naudojimas be pabaigos IF
  2. Naudojant sakinį „Kitas“
  3. Pasirinkimo „Pasirinkimas“ naudojimas nenaudojant pabaigos pasirinkimo
  4. Nepaskelbiamas kintamasis (tai veikia tik tada, kai įjungta aiški parinktis)
  5. Skambinimas neegzistuojančiai antrajai funkcijai (arba su netinkamais parametrais)
Pastaba apie „Explicit Option“: Kai pridėsite „Option Explicit“, prieš paleisdami kodą turėsite deklaruoti visus kintamuosius. Jei yra koks nors kintamasis, kuris nebuvo deklaruotas, VBA parodys klaidą. Tai gera praktika, nes ji rodo klaidą, jei turite klaidingai parašytą kintamąjį. Daugiau apie „Option Explicit“ galite perskaityti čia.

Vykdymo laiko klaidos

Vykdymo laiko klaidos yra tos, kurios atsiranda, kai kodas veikia.

Vykdymo laiko klaidos atsiras tik tada, kai bus pasirūpinta visomis sintaksės ir kompiliavimo klaidomis.

Pvz., Jei vykdote kodą, kuris turėtų atidaryti „Excel“ darbaknygę, bet ši darbaknygė nepasiekiama (ištrinta arba pakeistas pavadinimas), kodas parodys vykdymo klaidą.

Kai įvyksta vykdymo laiko klaida, jis sustabdys kodą ir parodys klaidos dialogo langą.

Pranešimas dialogo lange „Vykdymo laiko klaida“ yra šiek tiek naudingesnis. Jis bando paaiškinti problemą, kuri gali padėti ją išspręsti.

Jei spustelėsite mygtuką Derinti, jis paryškins kodo dalį, dėl kurios atsiranda klaida.

Jei ištaisėte klaidą, įrankių juostoje galite spustelėti mygtuką Vykdyti (arba paspauskite F5), kad tęstumėte kodo vykdymą iš ten, kur jis liko.

Arba taip pat galite spustelėti mygtuką Baigti, kad išeitumėte iš kodo.

Svarbu: Jei dialogo lange spustelėsite mygtuką Pabaigti, kodas sustabdys eilutę, kurioje susiduriate. Tačiau visos kodo eilutės prieš tai būtų įvykdytos.

Loginės klaidos

Loginės klaidos nesustabdys jūsų kodo, tačiau gali sukelti klaidingų rezultatų. Tai taip pat gali būti sunkiausiai pašalinamos klaidos.

Šios klaidos kompiliatorius neišryškina ir jas reikia pašalinti rankiniu būdu.

Vienas iš loginės klaidos pavyzdžių (su kuriais dažnai susiduriu) yra begalinė kilpa.

Kitas pavyzdys galėtų būti tada, kai gaunamas neteisingas rezultatas. Pvz., Galite naudoti neteisingą kodo kintamąjį arba pridėti du kintamuosius, jei vienas neteisingas.

Yra keli būdai, kuriais sprendžiu logines klaidas:

  1. Įdėkite pranešimų laukelį į tam tikrą kodo vietą ir paryškinkite vertes/duomenis, kurie gali padėti suprasti, ar viskas vyksta taip, kaip tikėtasi.
  2. Užuot paleidę kodą vienu metu, eikite per kiekvieną eilutę po vieną. Norėdami tai padaryti, spustelėkite bet kurią kodo vietą ir paspauskite F8. pastebėsite, kad kiekvieną kartą paspaudus F8, vykdoma viena eilutė. Tai leidžia pereiti per kodą po vieną eilutę ir nustatyti logines klaidas.

Derinimo naudojimas kompiliavimo/sintaksės klaidoms rasti

Kai baigsite naudoti kodą, geriausia jį paleisti prieš paleidžiant.

Norėdami surinkti kodą, įrankių juostoje spustelėkite parinktį Derinti ir spustelėkite Kompiliuoti VBAProject.

Kai sudarote VBA projektą, jis pereina kodą ir nustato klaidas (jei tokių yra).

Jei radote klaidą, ji parodys dialogo langą su klaida. Jis randa klaidas po vieną. Taigi, jei jis randa klaidą ir jūs ją ištaisėte, turite dar kartą paleisti kompiliavimą, kad rastumėte kitų klaidų (jei jų yra).

Kai jūsų kodas be klaidų, parinktis „Kompiliuoti VBAProject“ bus pilka.

Atminkite, kad kompiliavimas ras tik „sintaksės“ ir „kompiliavimo“ klaidas. Jis neras vykdymo laiko klaidų.

Kai rašote VBA kodą, nenorite, kad klaidos atsirastų. Norėdami to išvengti, galite naudoti daugybę klaidų valdymo metodų.

Kituose šio straipsnio skyriuose aptarsiu metodus, kuriuos galite naudoti VBA klaidų tvarkymui „Excel“.

Konfigūruokite klaidų nustatymus (apdorotos ir neapdorotos klaidos)

Prieš pradėdami dirbti su kodu, turite patikrinti, ar yra vienas „Excel VBA“ nustatymas.

Eikite į VBA įrankių juostą ir spustelėkite Įrankiai, tada spustelėkite Parinktys.

Dialogo lange Parinktys spustelėkite skirtuką Bendra ir įsitikinkite, kad grupėje „Klaidų gaudymas“ pažymėta „Pertrauka dėl neapdorotų klaidų“.

Leiskite paaiškinti tris variantus:

  1. Atsisakykite visų klaidų: Tai sustabdys jūsų kodą dėl visų tipų klaidų, net jei naudojote šių klaidų tvarkymo būdus.
  2. Pertrauka klasės modulyje: Tai sustabdys jūsų kodą dėl visų neapdorotų klaidų, ir tuo pačiu metu, jei naudojate tokius objektus kaip „Userforms“, jis taip pat sulaužys tuos objektus ir paryškins tikslią klaidos priežastį.
  3. Pertrauka nuo neapdorotų klaidų: Tai sustabdys jūsų kodą tik dėl tų klaidų, kurios nėra tvarkomos. Tai yra numatytasis nustatymas, nes jis užtikrina, kad jums būtų pranešta apie visas neištaisytas klaidas. Jei naudojate tokius objektus kaip „Userforms“, nebus paryškinta linija, sukelianti objekto klaidą, o tik paryškinama eilutė, nurodanti tą objektą.
Pastaba: Jei dirbate su tokiais objektais kaip „Userforms“, galite pakeisti šį nustatymą į „Break on Class Modules“. Skirtumas tarp 2 ir 3 yra tas, kad kai naudojate „Break in Class Module“, jis nukreips jus į konkrečią klaidą sukeliančio objekto eilutę. Taip pat galite pasirinkti tai padaryti, o ne „Sulaužyti neapdorotas klaidas“.

Trumpai tariant - jei tik pradedate naudoti „Excel VBA“, įsitikinkite, kad pažymėta „Break on Unhandled Errors“.

VBA klaidų tvarkymas naudojant teiginius apie klaidą

Kai jūsų kodas susiduria su klaida, galite atlikti kelis veiksmus:

  1. Ignoruokite klaidą ir leiskite kodui tęsti
  2. Įdėkite klaidų tvarkymo kodą ir paleiskite jį, kai įvyksta klaida

Abu šie klaidų tvarkymo būdai užtikrina, kad galutinis vartotojas nematys klaidos.

Yra keletas teiginių apie klaidą, kuriuos galite naudoti norėdami tai padaryti.

Dėl klaidos Tęsti toliau

Kai savo kode naudosite „On Error Resume Next“, į klaidą bus atsižvelgiama ir kodas bus toliau vykdomas.

Šis klaidų tvarkymo metodas naudojamas gana dažnai, tačiau jį naudodami turite būti atsargūs. Kadangi ji visiškai ignoruoja visas galimas klaidas, gali būti, kad negalėsite nustatyti klaidų, kurias reikia ištaisyti.

Pavyzdžiui, jei paleidžiamas toliau pateiktas kodas, jis grąžins klaidą.

Sub AssignValues ​​() x = 20 /4 y = 30 /0 Pabaiga

Taip atsitinka todėl, kad negalima padalinti skaičiaus iš nulio.

Bet jei šiame kode naudoju teiginį „On Error Resume Next“ (kaip parodyta toliau), jis ignoruoja klaidą ir nežino, kad yra problema, kurią reikia ištaisyti.

Sub AssignValues ​​() On Error Resume Next x = 20 /4 y = 30 /0 Pabaiga

„On Error Resume Next“ turėtų būti naudojamas tik tada, kai aiškiai žinote, kokių klaidų tikimasi įvesti jūsų VBA kodą, ir galite to nepaisyti.

Pavyzdžiui, žemiau yra VBA įvykio kodas, kuris akimirksniu pridėtų datos ir laiko reikšmę naujai įterpto lapo A1 langelyje (šis kodas pridedamas darbalapyje, o ne modulyje).

Privati ​​antrinė darbo knyga_Naujas lapas (ByVal Sh kaip objektas) Sh.Range ("A1") = Formatas (dabar, "dd-mmm-yyyy hh: mm: ss") Pabaiga

Nors daugeliu atvejų tai puikiai veikia, būtų rodoma klaida, jei vietoj darbalapio pridedu diagramos lapą. Kadangi diagramos lape nėra langelių, kodas sukels klaidą.

Taigi, jei šiame kode naudoju teiginį „On Error Resume Next“, su darbalapiais jis veiks kaip tikėtasi ir nieko nedarys su diagramų lapais.

Privatus antrinis darbaknygės_Naujas lapas („ByVal Sh“ kaip objektas) Klaida Tęsti kitą Sh.Range („A1“) = Formatas (dabar, „dd-mmm-yyyy hh: mm: ss“) Pabaiga

Pastaba: Apie klaidą tęsti kitą teiginį geriausia naudoti, kai žinote, su kokiomis klaidomis galite susidurti. Ir tada, jei manote, kad saugu ignoruoti šias klaidas, galite ja pasinaudoti.

Galite perkelti šį kodą į kitą lygį, išanalizavę, ar įvyko klaida, ir rodydami atitinkamą pranešimą.

Žemiau pateiktas kodas parodys pranešimų laukelį, kuris informuos vartotoją, kad darbalapis nebuvo įterptas.

Private Sub Workbook_NewSheet (ByVal Sh as Object) On Error Resume Next Sh.Range ("A1") = Formatas (Dabar, "dd-mmm-yyyy hh: mm: ss") Jei Err.Number 0, tada MsgBox "Atrodo kaip tu įterptas diagramos lapas "& vbCrLf &" Klaida - "& Err.Description End If End Sub

„Err.Number“ naudojamas klaidos numeriui gauti, o „Err.Description“ - klaidos aprašui gauti. Jie bus aptarti vėliau šioje pamokoje.

Klaida „GoTo 0“

„On Error GoTo 0“ sustabdys kodą eilutėje, kuri sukelia klaidą, ir parodys pranešimą, kuriame aprašoma klaida.

Paprasčiau tariant, tai įgalina numatytąjį klaidų tikrinimo elgesį ir rodo numatytąjį klaidos pranešimą.

Tada kodėl net jį naudoti?

Paprastai jums nereikia naudoti „On Error Goto 0“, tačiau tai gali būti naudinga, kai naudojate ją kartu su „On Error Resume Next“

Leisk man paaiškinti!

Žemiau pateiktas kodas pasirinktų visus tuščius pasirinkimo langelius.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Pasirinkite Pabaigos antraštė

Bet tai parodytų klaidą, kai pasirinktuose langeliuose nėra tuščių langelių.

Taigi, kad nerodytumėte klaidos, galite naudoti „Įjungus klaidą atnaujinti kitą“

Dabar jis taip pat parodys bet kokią klaidą, kai paleisite žemiau esantį kodą:

Sub SelectFormulaCells () On Error Tęsti kitą pasirinkimą. SpecialCells (xlCellTypeBlanks). Pasirinkite End Sub

Kol kas viskas gerai!

Problema kyla, kai yra kodo dalis, kurioje gali atsirasti klaida, o kadangi naudojate „On Error Resume Next“, kodas tiesiog ignoruoja jį ir pereina į kitą eilutę.

Pavyzdžiui, žemiau esančiame kode nėra klaidos raginimo:

Sub SelectFormulaCells () dėl klaidos tęskite kitą pasirinkimą. SpecialCells (xlCellTypeBlanks). Pasirinkite „… daugiau kodo, kuriame gali būti klaida End Sub

Pirmiau pateiktame kode yra dvi vietos, kuriose gali atsirasti klaida. Pirmoje vietoje mes pasirenkame visas tuščias ląsteles (naudodami „Selection.SpecialCells“), o antroji - likusiame kode.

Nors tikimasi pirmosios klaidos, bet kuri klaida po jos nėra.

Čia gelbsti „On Error Goto 0“.

Kai jį naudojate, atkuriate numatytąjį klaidos nustatymą, kur jis pradės rodyti klaidas, kai susidurs su ja.

Pvz., Žemiau esančiame kode nėra klaidos, jei nėra tuščių langelių, tačiau bus rodomas klaidos pranešimas dėl „10/0“

Sub SelectFormulaCells () On Error Tęskite kitą pasirinkimą. SpecialCells (xlCellTypeBlanks). Pasirinkite On Error GoTo 0 '… daugiau kodo, kuriame gali būti klaida End Sub

Įvyko klaida [etiketė]

Pirmiau minėti du metodai - „On Error Resume Next“ ir „On Error Goto 0“ - neleidžia mums iš tikrųjų tvarkyti klaidos. Vienas verčia kodą ignoruoti klaidą, o antrasis atnaujina klaidų tikrinimą.

On Error Go [Etiketė] - tai būdas, kuriuo galite nurodyti, ką norite daryti, jei jūsų kode yra klaida.

Žemiau pateikiama kodo struktūra, kurioje naudojama ši klaidų tvarkyklė:

Antrinis bandymas () dėl klaidos „GoTo Label“: X = 10 /0 “ši eilutė sukelia klaidą“…. Likusį kodą rasite čia Išeiti iš antrinės etiketės: „kodas klaidai pašalinti

Atminkite, kad prieš klaidą tvarkant „etiketę“ yra išėjimo antraštė. Tai užtikrina, kad jei nėra klaidų, antrinis elementas uždaromas ir „Label“ kodas nėra vykdomas. Jei nenaudojate „Exit Sub“, jis visada vykdys „Etiketės“ ​​kodą.

Toliau pateiktame kodo pavyzdyje, kai įvyksta klaida, kodas šokinėja ir vykdo kodą tvarkyklės skyriuje (ir parodo pranešimų laukelį).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Atrodo, kad įvyko klaida" & vbCrLf & Err.Description End Sub

Atminkite, kad kai įvyksta klaida, kodas jau buvo paleistas ir įvykdė eilutes prieš klaidą sukėlusią eilutę. Pirmiau pateiktame pavyzdyje kodas nustato X reikšmę kaip 12, tačiau kadangi klaida įvyksta kitoje eilutėje, ji nenustato Y ir Z reikšmių.

Kai kodas pereis prie klaidų tvarkyklės kodo (šiame pavyzdyje - ErrMsg), jis ir toliau vykdys visas eilutes, esančias klaidų tvarkyklės kode ir po juo, ir išeis iš antrinio.

Klaida Goto -1

Tai yra šiek tiek sudėtinga, ir daugeliu atvejų vargu ar tai naudosite.

Bet aš vis tiek tai aptarsiu, nes susidūriau su situacija, kai to reikėjo (nedvejodami ignoruokite ir pereikite prie kito skyriaus, jei ieškote tik pagrindų).

Prieš pradėdamas nagrinėti jo mechaniką, leiskite man pabandyti paaiškinti, kur tai gali būti naudinga.

Tarkime, kad turite kodą, kuriame įvyko klaida. Bet viskas gerai, nes turite vieną klaidų tvarkyklę. Bet kas atsitinka, kai klaidų tvarkytojo kode yra kita klaida (taip … šiek tiek panašu į pradžios filmą).

Tokiu atveju negalite naudoti antrojo tvarkyklės, nes pirmoji klaida nebuvo pašalinta. Taigi, nors jūs sutvarkėte pirmąją klaidą, VBA atmintyje ji vis dar egzistuoja. Ir VBA atmintyje yra tik viena klaida - ne dvi ar daugiau.

Šiuo atveju galite naudoti klaidą „Goto -1“.

Tai pašalina klaidą ir atlaisvina VBA atmintį kitai klaidai tvarkyti.

Pakanka kalbėti!

Dabar paaiškinsiu pavyzdžiais.

Tarkime, kad turiu žemiau esantį kodą. Tai sukels klaidą, nes yra padalijimas iš nulio.

Papildomas klaidų tvarkytuvas () X = 12 Y = 20 /0 Z = 30 Pabaiga

Taigi, norėdamas jį tvarkyti, naudoju klaidų tvarkyklės kodą (pavadinimu ErrMsg), kaip parodyta žemiau:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Atrodo, kad įvyko klaida" & vbCrLf & Err.Description End Sub

Dabar vėl viskas gerai. Kai tik atsiranda klaida, naudojamas klaidų tvarkytuvas ir parodomas pranešimų langelis, kaip parodyta žemiau.

Dabar išplėsiu kodą, kad klaidų tvarkytuvėje arba po jos būtų daugiau kodo.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Atrodo, kad įvyko klaida" & vbCrLf & Err.Aprašymas A = 10/2 B = 35 /0 Pabaiga

Kadangi pirmoji klaida buvo ištaisyta, bet antroji nebuvo, vėl matau klaidą, kaip parodyta žemiau.

Vis tiek viskas gerai. Kodas elgiasi taip, kaip tikėjomės.

Taigi, norėdamas išspręsti antrąją klaidą, naudoju kitą klaidų tvarkyklę (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Atrodo, kad įvyko klaida" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Atrodo, kad vėl klaida" & vbCrLf & Err.Description End Sub

Ir štai kur neveikia taip, kaip tikėtasi.

Jei paleisite aukščiau pateiktą kodą, jis vis tiek pateiks veikimo laiko klaidą, net jei bus įdiegtas antrasis klaidų tvarkytojas.

Taip atsitinka, nes iš VBA atminties neišvalėme pirmosios klaidos.

Taip, mes susitvarkėme! Bet tai vis tiek lieka atmintyje.

Ir kai VBA susiduria su kita klaida, ji vis tiek įstrigo su pirmąja klaida, todėl antrasis klaidų tvarkytojas nenaudojamas. Kodas sustoja ties eilute, kuri sukėlė klaidą, ir rodo klaidos raginimą.

Norėdami išvalyti VBA atmintį ir išvalyti ankstesnę klaidą, turite naudoti „On Error Goto -1“.

Taigi, jei pridėsite šią eilutę žemiau esančiame kode ir paleisite, ji veiks taip, kaip tikėtasi.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Atrodo, kad įvyko klaida" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Exit Sub ErrMsg2: MsgBox "Atrodo, kad vėl klaida" & vbCrLf & Err.Description End Sub
Pastaba: Klaida automatiškai pašalinama pasibaigus paprogramei.Taigi, „On Error Goto -1“ gali būti naudinga, kai toje pačioje paprogramėje gaunate dvi ar daugiau klaidų.

Klaidos objektas

Kai su kodu įvyksta klaida, „Err“ objektas naudojamas norint gauti išsamią informaciją apie klaidą (pvz., Klaidos numerį ar aprašą).

Klaida Objekto ypatybės

Objektas „Err“ turi šias savybes:

Nuosavybė apibūdinimas
Skaičius Skaičius, nurodantis klaidos tipą. Jei nėra klaidos, ši vertė yra 0
apibūdinimas Trumpas klaidos aprašymas
Šaltinis Projekto pavadinimas, kuriame įvyko klaida
HelpContext Pagalbos konteksto ID, skirtas klaidai pagalbos faile
HelpFile Eilutė, vaizduojanti aplanko vietą ir pagalbos failo failo pavadinimą

Nors daugeliu atvejų jums nereikia naudoti „Err“ objekto, kartais jis gali būti naudingas tvarkant „Excel“ klaidas.

Pvz., Tarkime, kad turite duomenų rinkinį, kaip parodyta žemiau, ir kiekvienam skaičiui pasirinkdami norite apskaičiuoti kvadratinę šaknį gretimame langelyje.

Žemiau pateiktas kodas gali tai padaryti, tačiau kadangi ląstelėje A5 yra teksto eilutė, ji iškart parodo klaidą.

Sub FindSqrRoot () Dim rng As Range Set

Šio tipo klaidos pranešimo problema yra ta, kad ji nieko nesako apie tai, kas nutiko ir kur įvyko problema.

Galite naudoti Err objektą, kad šie klaidų pranešimai būtų prasmingesni.

Pavyzdžiui, jei dabar naudoju žemiau esantį VBA kodą, jis sustabdys kodą, kai tik įvyks klaida, ir parodys pranešimo langelį su langelio, kuriame yra problema, langelio adresu.

Sub FindSqrRoot () Dim rng As Range Set rng = Kiekvieno langelio pasirinkimas rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Kitas langelis ErrHandler: MsgBox "Klaidos numeris:" & Err .Number & vbCrLf & _ "Klaidos aprašas:" & Err.Description & vbCrLf & _ "Klaida:" & cell.Address End Sub

Aukščiau pateiktas kodas suteiks jums daug daugiau informacijos nei paprastas „Tipo neatitikimas“, ypač langelio adresas, kad žinotumėte, kur įvyko klaida.

Galite dar patikslinti šį kodą, kad įsitikintumėte, jog kodas veikia iki galo (užuot sulaužęs kiekvieną klaidą), ir tada pateikiamas langelio adreso, kuriame įvyko klaida, sąrašas.

Žemiau pateiktas kodas tai padarys:

Sub FindSqrRoot2 () Dim ErrorCells kaip eilutė Dim rng kaip diapazonas į klaidą Tęsti Toliau Nustatykite rng = Pasirinkimas kiekvienai langeliui rng ląstelėje. Poslinkis (0, 1). Value = Sqr (cell.Value) If Err.Number 0 then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Klaida šiose ląstelėse" & ErrorCells Exit Sub End Sub

Aukščiau pateiktas kodas veikia iki galo ir suteikia visų langelių, turinčių skaičių (gretimame stulpelyje), kvadratinę šaknį. Tada rodomas pranešimas, kuriame išvardytos visos ląstelės, kuriose įvyko klaida (kaip parodyta žemiau):

Klaida Objekto metodai

Nors „Err“ ypatybės yra naudingos norint parodyti naudingą informaciją apie klaidas, taip pat yra du „Err“ metodai, kurie gali padėti tvarkyti klaidas.

Metodas apibūdinimas
Skaidrus Išvalo visus „Err“ objekto ypatybių nustatymus
Pakelti Sukuria vykdymo laiko klaidą

Greitai sužinokime, kas tai yra ir kaip/kodėl juos naudoti su VBA „Excel“.

Klaida aiškus metodas

Tarkime, kad turite duomenų rinkinį, kaip parodyta žemiau, ir norite gauti visų šių skaičių kvadratinę šaknį gretimame stulpelyje.

Šis kodas gaus visų gretimame stulpelyje esančių skaičių kvadratines šaknis ir parodys pranešimą, kad įvyko klaida ląstelėse A5 ir A9 (nes juose yra tekstas).

Sub FindSqrRoot2 () Dim ErrorCells kaip eilutė Dim rng kaip diapazonas į klaidą Tęsti Toliau Nustatykite rng = Pasirinkimas kiekvienai langeliui rng ląstelėje. Poslinkis (0, 1). Value = Sqr (cell.Value) If Err.Number 0 then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Klaida šiose ląstelėse" & ErrorCells End Sub

Atminkite, kad sakinyje „Jei tada“ naudojau „Err.Clear“ metodą.

Įvykus klaidai ir įstrigus „If“ sąlygai, „Err.Clear“ metodas grąžina klaidos numerį į 0. Tai užtikrina, kad IF sąlyga klaidas fiksuoja tik tose ląstelėse, kuriose ji yra iškelta.

Jei nebūčiau naudojęs „Err.Clear“ metodo, kai tik įvyktų klaida, jis visada būtų teisingas IF sąlygomis, o klaidos numeris nebuvo nustatytas iš naujo.

Kitas būdas atlikti šį darbą yra naudojant „On Error Goto -1“, kuris visiškai atkuria klaidą.

Pastaba: „Err.Clear“ skiriasi nuo „On Error Goto -1“. Err.Clear ištrina tik klaidos aprašą ir klaidos numerį. tai visiškai neatkuria. Tai reiškia, kad jei tame pačiame kode yra dar vienas klaidos atvejis, negalėsite jos išspręsti prieš iš naujo nustatydami (tai galima padaryti naudojant „On Error Goto -1“, o ne „Err.Clear“).

Klaidos pakėlimo metodas

„Err.Raise“ metodas leidžia padidinti vykdymo laiko klaidą.

Žemiau yra Err.Raise metodo naudojimo sintaksė:

Err.Raise [skaičius], [šaltinis], [aprašymas], [pagalbos failas], [pagalbos kontekstas]

Visi šie argumentai yra neprivalomi ir galite juos naudoti, kad klaidos pranešimas būtų prasmingesnis.

Bet kodėl jūs kada nors norėtumėte patys padaryti klaidą?

Geras klausimas!

Galite naudoti šį metodą, kai yra klaidos atvejis (o tai reiškia, kad vis tiek bus klaida), ir tada naudosite šį metodą, kad vartotojui daugiau papasakotumėte apie klaidą (vietoj mažiau naudingo klaidos pranešimo, kurį rodo VBA) pagal numatytuosius nustatymus).

Pvz., Tarkime, kad turite duomenų rinkinį, kaip parodyta žemiau, ir norite, kad visos ląstelės turėtų tik skaitines reikšmes.

Sub RaiseError () Dim rng As Range Set rng = Pasirinkimas dėl klaidos „GoTo ErrHandler“ kiekvienai langai į rng, jei ne (IsNumeric (Cell.Value)) Tada Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Baigti, jei kitas langas ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Aukščiau pateiktas kodas parodys klaidos pranešimą, kuriame yra nurodytas aprašas ir kontekstinis failas.

Asmeniškai aš niekada nenaudojau „Err.Raise“, nes dažniausiai dirbu tik su „Excel“. Bet tiems, kurie naudoja VBA, kad galėtų dirbti su „Excel“ kartu su kitomis programomis, pvz., „Outlook“, „Word“ ar „PowerPoint“, tai gali būti naudinga.

Čia yra išsamus straipsnis apie „Err.Raise“ metodą, jei norite sužinoti daugiau.

VBA klaidų tvarkymo geriausia praktika

Nesvarbu, koks įgudęs rašote VBA kodą, klaidos visada bus jo dalis. Geriausi koduotojai yra tie, kurie turi įgūdžių tinkamai tvarkyti šias klaidas.

Štai keletas geriausių praktikų, kurias galite naudoti tvarkydami klaidas „Excel VBA“.

  1. Naudokite „On Error Go [Label]“ kodo pradžioje. Tai užtikrins, kad bus pašalintos visos klaidos, kurios gali įvykti iš ten.
  2. Naudokite „On Error Resume Next“ TIK tada, kai esate tikri dėl galimų klaidų. Naudokite tik su numatoma klaida. Jei naudosite jį su netikėtomis klaidomis, jis tiesiog ignoruos ir judės į priekį. Galite naudoti „On Error Resume Next“ (tęsti toliau) su „Err.Raise“, jei norite ignoruoti tam tikros rūšies klaidą ir sugauti likusią.
  3. Kai naudojate klaidų tvarkytojus, prieš tvarkykles įsitikinkite, kad naudojate „Exit Sub“. Tai užtikrins, kad klaidų tvarkyklės kodas būtų vykdomas tik tada, kai yra klaida (kitaip jis visada bus vykdomas).
  4. Naudokite kelis klaidų tvarkytojus, kad gautumėte įvairių rūšių klaidas. Kelių klaidų tvarkytojas užtikrina, kad klaida būtų tinkamai pašalinta. Pavyzdžiui, „tipo neatitikimo“ klaidą norėtumėte tvarkyti kitaip, nei vykdymo laiko klaidą „Padalijimas pagal 0“.

Tikimės, kad šis „Excel“ straipsnis jums buvo naudingas!

Čia yra dar keletas „Excel VBA“ vadovėlių, kurie jums gali patikti:

  • „Excel VBA“ duomenų tipai - išsamus vadovas
  • „Excel VBA“ kilpos - kitam, darykite, darykite iki, kiekvienam
  • „Excel VBA Events“ - lengvas (ir išsamus) vadovas
  • „Excel Visual Basic“ redaktorius - kaip jį atidaryti ir naudoti „Excel“
wave wave wave wave wave