VBA apie klaidą - klaidų tvarkymo geriausia praktika

VBA klaidų apgaulės lapas

Klaidos

apibūdinimasVBA kodasĮjungta klaida - sustabdyti kodą ir rodyti klaidąKlaida Goto 0On Error - praleiskite klaidą ir tęskite darbąDėl klaidos Tęsti toliauKlaida - eikite į kodo eilutę [etiketė]Įvyko klaida [etiketė]Išvalo (atkuria) klaidąKlaida „GoTo -1“Rodyti klaidos numerį„MsgBox“ klaidos numerisRodyti klaidos aprašą„MsgBox“ klaida. AprašymasFunkcija, kuri sukuria savo klaidąKlaida. Pakelkite

Žiūrėkite daugiau VBA „Cheat Sheets“ ir nemokamus PDF atsisiuntimus

VBA klaidų tvarkymas

VBA klaidų tvarkymas reiškia VBA vykdymo laiko klaidų numatymo, aptikimo ir sprendimo procesą. VBA klaidų tvarkymo procesas įvyksta rašant kodą, kol iš tikrųjų neįvyksta klaidų.

VBA vykdymo laiko klaidos yra klaidos, kurios atsiranda vykdant kodą. Runtime klaidų pavyzdžiai:

  • Nuoroda į neegzistuojančią darbaknygę, darbalapį ar kitą objektą
  • Netinkami duomenys, pvz. nuoroda į „Excel“ langelį, kuriame yra klaida
  • Bandymas padalyti iš nulio

VBA apie klaidos pareiškimą

Dauguma VBA klaidų tvarkomos naudojant Apie klaidos pareiškimą. Pareiškimas apie klaidą nurodo VBA, ką daryti, jei susiduria su klaida. Yra trys Apie klaidų pareiškimus:

  • Klaida „GoTo 0“
  • Dėl klaidos Tęsti toliau
  • Dėl klaidos „GoTo“ Linija

Klaida „GoTo 0“

Klaida „GoTo 0“ yra numatytasis VBA nustatymas. Galite atkurti šį numatytąjį nustatymą pridėdami šią kodo eilutę:

1 Klaida „GoTo 0“

Kai įvyksta klaida su Klaida „GoTo 0“, VBA nustos vykdyti kodą ir parodys standartinį klaidos pranešimų laukelį.

Dažnai pridėsite Klaida „GoTo 0“ pridėjus Dėl klaidos Tęsti toliau klaidų tvarkymas (kitas skyrius):

123456789 Antroji klaidaGoTo0 ()Dėl klaidos Tęsti toliauActiveSheet.Shapes („Start_Button“). IštrintiKlaida „GoTo 0“„Paleiskite daugiau kodoPabaiga Sub

Dėl klaidos Tęsti toliau

Dėl klaidos Tęsti toliau liepia VBA praleisti visas kodo eilutes, kuriose yra klaidų, ir pereiti prie kitos eilutės.

1 Dėl klaidos Tęsti toliau

Pastaba: Dėl klaidos Tęsti toliau klaidos neištaiso arba kitaip neišsprendžia. Tai tiesiog liepia VBA tęsti taip, tarsi nebūtų kodo eilutės, kurioje yra klaida. Netinkamas naudojimas Dėl klaidos Tęsti toliau gali sukelti nenumatytų pasekmių.

Puikus laikas naudoti Dėl klaidos Tęsti toliau yra dirbant su objektais, kurie gali arba neegzistuoja. Pvz., Norite parašyti kodą, kuris ištrins formą, bet jei paleisite kodą, kai figūra jau ištrinta, VBA pateiks klaidą. Vietoj to galite naudoti Dėl klaidos Tęsti toliau liepti VBA ištrinti formą, jei ji yra.

123 Dėl klaidos Tęsti toliauActiveSheet.Shapes („Start_Button“). IštrintiKlaida „GoTo 0“

Pastaba, kurią pridėjome Klaida „GoTo 0“ po kodo eilutės, kurioje yra galima klaida. Tai iš naujo nustato klaidų tvarkymą.

Kitame skyriuje parodysime, kaip patikrinti, ar naudojant įvyko klaida Klaida. Skaičius, suteikiant jums daugiau išplėstinių klaidų valdymo parinkčių …

Err.Number, Err.Clear ir gaudymo klaidos

Užuot tiesiog praleidę eilutę, kurioje yra klaida, klaidą galime surasti naudodami Dėl klaidos Tęsti toliau ir Klaida. Skaičius.

Klaida. Skaičius pateikia klaidos numerį, atitinkantį aptiktos klaidos tipą. Jei nėra klaidos, Klaida. Skaičius = 0.

Pavyzdžiui, ši procedūra grąžins „11“, nes įvyksta klaida Vykdymo laiko klaida „11“.

1234567 Antroji klaidaNumber_ex ()Dėl klaidos Tęsti toliau„ActiveCell.Value“ = 2 /0„MsgBox“ klaidos numerisPabaiga Sub

Klaidų tvarkymas naudojant Err.Number

Tikroji galia Klaida. Skaičius yra galimybė nustatyti, ar įvyko klaida (Klaida. Skaičius 0). Žemiau pateiktame pavyzdyje sukūrėme funkciją, kuri patikrins, ar lapas yra, naudojant Err.Number.

12345678910111213141516171819 Antrasis testasWS ()„MsgBox“ egzistuoja („testas“)Pabaiga SubFunkcija Ar WSExist (wsName As String) kaip loginisDim ws kaip darbalapisDėl klaidos Tęsti toliauNustatyti ws = Sheets (wsName)„Jei klaidos WS nėraJei klaidos numeris 0 TadaDoesWSExist = NetiesaKitasDoesWSExist = TiesaPabaiga JeiKlaida „GoTo -1“Pabaigos funkcija

Pastaba: mes pridėjome a Klaida „GoTo -1“ iki pabaigos, kuris Err.Number atstatomas į 0 (žr. du skyrius žemyn).

Su Dėl klaidos Tęsti toliau ir Klaida. Skaičius, galite pakartoti „Išbandyti“ ir „pagauti“ kitų programavimo kalbų funkcionalumas.

Dėl klaidos „GoTo“ Linija

Dėl klaidos „GoTo“ Linija liepia VBA „eiti“ į pažymėtą kodo eilutę, kai atsiranda klaida. Pareiškimą „Eiti į“ deklaruojate taip (kur „errHandler“ yra eilutės etiketė):

1 Dėl klaidos „GoTo errHandler“

ir sukurkite tokią eilutės etiketę:

1 errHandler:

Pastaba: tai ta pati etiketė, kurią naudotumėte su įprasta „VBA GoTo“ ataskaita.

Žemiau mes parodysime naudojimą Dėl klaidos „GoTo“ Linija išeiti iš procedūros.

Klaida Išeiti iš antr

Galite naudoti „On Error GoTo Line“, kad išeitumėte iš antrinės dalies, kai įvyksta klaida.

Tai galite padaryti įdėdami klaidų tvarkyklės eilutės etiketę procedūros pabaigoje:

12345678 Sub ErrGoToEnd ()Dėl klaidos „GoTo endProc“'Kažkoks kodasendProc:Pabaiga Sub

arba naudodami komandą Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Dėl klaidos „GoTo endProc“'Kažkoks kodasGoTo praleistiExitendProc:Išeiti iš Subpraleisti„Dar keli kodaiPabaiga Sub

Err.Clear, On Error GoTo -1 ir Reset Err.Number

Išsprendę klaidą, paprastai turėtumėte ją pašalinti, kad ateityje nekiltų klaidų tvarkymo problemų.

Po to, kai įvyksta klaida, tiek Klaida. Aišku ir Klaida „GoTo -1“ gali būti naudojamas atstatyti Klaida. Skaičius iki 0. Tačiau yra vienas labai svarbus skirtumas: Klaida. Aišku nepanaikina tikrosios klaidos, o tik atkuria Klaida. Skaičius.

Ką tai reiškia? NaudojantKlaida. Aišku, negalėsite pakeisti klaidų tvarkymo nustatymo. Norėdami pamatyti skirtumą, išbandykite šį kodą ir pakeiskite Klaida „GoTo -1“ su Klaida. Aišku:

123456789101112131415161718192021 Papildomos klaidosPavyzdžiai ()Dėl klaidos „GoTo errHandler“:„Programos apibrėžta“ klaidaKlaida (13)Išeiti iš SuberrHandler:'Išvalyti klaidąKlaida „GoTo -1“Dėl klaidos „GoTo errHandler2“:„Tipo neatitikimo klaida“Klaida (1034)Išeiti iš SuberrHandler2:Derinimas. Spausdinimo klaida. AprašymasPabaiga Sub

Paprastai rekomenduoju visada naudoti Klaida „GoTo -1“, nebent turite rimtų priežasčių jį naudoti Klaida. Aišku vietoj to.

VBA dėl klaidos „MsgBox“

Taip pat galbūt norėsite parodyti pranešimų laukelį apie klaidą. Šiame pavyzdyje bus rodomi skirtingi pranešimų langai, atsižvelgiant į klaidos vietą:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg kaip eilutėDėl klaidos „GoTo errHandler“'1 etapaserrMsg = "Kopijavimo ir įklijavimo metu įvyko klaida."„Err. Raise“ (11)'2 etapaserrMsg = "Duomenų tikrinimo etape įvyko klaida."„Err. Raise“ (11)'3 etapaserrMsg = "P & L kūrimo ir kopijavimo etape įvyko klaida."Err. Raise (11)'4 etapaserrMsg = "Bandant užregistruoti importavimą sąrankos puslapyje įvyko klaida"„Err. Raise“ (11)„GoTo endProc“errHandler:„MsgBox“ klaidaendProc:Pabaiga Sub

Čia jūs pakeistumėte Err.Raise (11) savo tikruoju kodu.

VBA IsError

Kitas būdas tvarkyti klaidas - išbandyti jas naudojant „VBA IsError“ funkciją. Funkcija „IsError“ patikrina išraišką, ar nėra klaidų, ir, jei įvyksta klaida, pateikia TRUE arba FALSE.

123 Sub IsErrorEx ()„MsgBox IsError“ (diapazonas („a7“). Vertė)Pabaiga Sub

Jei klaida VBA

Taip pat galite tvarkyti klaidas VBA naudodami „Excel IfError“ funkciją. „IfError“ funkciją reikia pasiekti naudojant Funkcijų klasė:

1234567 Sub IfErrorEx ()Dim n Kaip ilgain = WorksheetFunction.IfError (diapazonas ("a10"). Reikšmė, 0)„MsgBox“ nPabaiga Sub

Taip bus išvesta diapazono A10 reikšmė, jei reikšmė yra klaida, ji išves 0.

VBA klaidų tipai

Vykdymo klaidos

Kaip minėta aukščiau:

VBA vykdymo laiko klaidos yra klaidos, kurios atsiranda vykdant kodą. Runtime klaidų pavyzdžiai:

  • Nuoroda į neegzistuojančią darbaknygę, darbalapį ar kitą objektą
  • Netinkami duomenys, pvz. nuoroda į „Excel“ langelį, kuriame yra klaida
  • Bandymas padalyti iš nulio

Galite „tvarkyti klaidas“ vykdymo laiko klaidas naudodami aukščiau aptartus metodus.

Sintaksės klaidos

VBA sintaksės klaidos yra klaidų rašant kodą. Sintaksės klaidų pavyzdžiai:

  • Rašybos klaidos
  • Trūksta skyrybos ženklų arba jie neteisingi

VBA redaktorius identifikuoja daugybę sintaksės klaidų su raudonu paryškinimu:

VBA redaktorius taip pat turi parinktį „Automatinis sintaksės tikrinimas“:

Kai tai pažymėta, VBA redaktorius sugeneruos pranešimų laukelį, įspėsiantį apie sintaksės klaidas, kai įvesite kodo eilutę:

Man asmeniškai tai labai erzina ir išjungiu šią funkciją.

Kompiliavimo klaidos

Prieš bandydamas vykdyti procedūrą, VBA „sukompiliuos“ procedūrą. Kompiliavimas paverčia programą iš šaltinio kodo (kurį galite pamatyti) į vykdomąją formą (nematote).

VBA kompiliavimo klaidos yra klaidos, neleidžiančios kaupti kodo.

Geras kompiliavimo klaidos pavyzdys yra trūkstama kintamojo deklaracija:

Kiti pavyzdžiai:

  • Dėl be Kitas
  • Pasirinkite be Pabaiga Pasirinkite
  • Jei be Pabaiga Jei
  • Skambinant a procedūrą kad neegzistuoja

Sintaksės klaidos (ankstesnis skyrius) yra kompiliavimo klaidų pogrupis.

Derinimas> Kompiliavimas

Kai bandysite paleisti procedūrą, pasirodys kompiliavimo klaidos. Bet idealiu atveju, prieš bandydami paleisti procedūrą, turėtumėte nustatyti kompiliavimo klaidas.

Tai galite padaryti iš anksto sudarydami projektą. Norėdami tai padaryti, eikite į Derinti> Kompiliuoti VBA projektą.

Kompiliatorius „eis“ į pirmąją klaidą. Ištaisę klaidą, dar kartą sukompiliuokite projektą. Kartokite, kol visos klaidos bus ištaisytos.

Galite pasakyti, kad visos klaidos yra ištaisytos, nes Sudarykite VBA projektą bus pilka:

„OverFlow“ klaida

The VBA perpildymo klaida atsiranda, kai bandote įvesti reikšmę į per didelį kintamąjį. Pavyzdžiui, Sveikieji kintamieji gali būti tik vertės nuo -32 768 iki 32 768. Jei įvesite didesnę vertę, gausite perpildymo klaidą:

Vietoj to turėtumėte naudoti Ilgas kintamasis didesniam skaičiui išsaugoti.

Kitos VBA klaidų sąlygos

VBA sugavimo klaida

Skirtingai nuo kitų programavimo kalbų, VBA nėra Sugavimo pareiškimas. Tačiau sugavimo pareiškimą galite pakartoti naudodami Dėl klaidos Tęsti toliau ir Jei klaidos numeris 0 Tada. Tai aprašyta aukščiau skiltyje Klaidų tvarkymas naudojant Err.Number.

VBA Ignoruoti klaidą

Norėdami ignoruoti klaidas VBA, tiesiog naudokite Dėl klaidos Tęsti toliau teiginys:

1 Dėl klaidos Tęsti toliau

Tačiau, kaip minėta aukščiau, turėtumėte būti atsargūs naudodami šį teiginį, nes jis neištaiso klaidos, tiesiog ignoruoja kodo eilutę, kurioje yra klaida.

VBA metimo klaida / klaida

Norėdami padaryti klaidą VBA, naudojate Klaida. Pakelkite metodas.

Ši kodo eilutė padidins vykdymo laiko klaidą „13“: Tipo neatitikimas:

1 Err. Raise (13)

VBA klaidų gaudymas

VBA klaidų gaudymas yra tik dar vienas VBA klaidų tvarkymo terminas.

VBA klaidos pranešimas

A VBA klaidos pranešimas atrodo taip:

Spustelėję „Derinti“ pamatysite klaidos kodo eilutę:

VBA klaidų tvarkymas ciklu

Geriausias būdas tvarkyti klaidą cikle yra naudojant Dėl klaidos Tęsti toliau kartu su Klaida. Skaičius Norėdami nustatyti, ar įvyko klaida (nepamirškite naudoti Klaida. Aišku kad pašalintumėte klaidą po kiekvieno įvykio).

Žemiau pateiktame pavyzdyje bus padalyti du skaičiai (A stulpelis iš B stulpelio) ir rezultatas bus išvestas į C stulpelį. Jei yra klaida, rezultatas bus 0.

12345678910111213141516 Papildomas testas ()Šviesos langelis kaip diapazonasDėl klaidos Tęsti toliauKiekvienam diapazono langeliui („a1: a10“)'Nustatykite langelio vertęląstelė. Poslinkis (0, 2). Vertė = langelis. Vertė / langelis. Poslinkis (0, 1). Vertė„Jei„ Cell.Value “yra klaida, tada numatytasis yra 0Jei klaidos numeris 0 Tadalangelis. Poslinkis (0, 2). Vertė = 0Klaida. AiškuPabaiga JeiKitasPabaiga Sub

VBA klaidų tvarkymas prieigoje

Visi aukščiau pateikti pavyzdžiai „Access VBA“ veikia lygiai taip pat, kaip „Excel VBA“.

123456789101112131415161718 Funkcija „DelRecord“ (iš formos)Ši funkcija naudojama ištrinti įrašą iš lentelės iš formosKlaida „GoTo“ baigiasiSu frmJei .NewRecord Tada.AtšauktiIšėjimo funkcijaPabaiga JeiPabaiga suSu frm.RecordsetClone.Knyga = frm.Knyga.Ištrintifrm. KlausimasPabaiga suIšėjimo funkcijapabaiga:GalasPabaigos funkcija

Padėsite svetainės plėtrą, dalintis puslapį su draugais

wave wave wave wave wave