Geslo za napake VBA
Napake
OpisKoda VBANapaka pri vklopu - koda zaustavitve in napaka na zaslonuPri napaki Pojdi na 0Napaka pri vklopu - preskočite napako in nadaljujte z izvajanjemOn Napaka Nadaljuj NaprejNapaka pri vklopu - pojdite na vrstico kode [Oznaka]Pri napaki Pojdi na [Oznaka]Počisti (ponastavi) napakoNapaka GoTo -1Pokaži številko napakeMsgBox Err.ŠtevilkaPokaži opis napakeMsgBox Err. OpisFunkcija ustvarjanja lastne napakeNapaka DvigOglejte si več VBA "Cheat Sheets" in brezplačne prenose PDF
Obravnavanje napak VBA
Obravnavanje napak VBA se nanaša na postopek predvidevanja, odkrivanja in reševanja napak v času izvajanja VBA. Postopek obravnave napak VBA se pojavi pri pisanju kode, preden se dejansko pojavijo napake.
Napake v času izvajanja VBA so napake, ki se pojavijo med izvajanjem kode. Primeri napak pri izvajanju so:
- Sklicevanje na neobstoječi delovni zvezek, delovni list ali drug predmet
- Neveljavni podatki, npr. sklicevanje na celico Excel, ki vsebuje napako
- Poskus deljenja z ničlo
VBA o izjavi o napaki
Večina napak VBA se obravnava z O izjavi o napaki. Izjava On Error pove VBA, kaj naj stori, če naleti na napako. Tam so drevesa O izjavah o napakah:
- Pri napaki Pojdi na 0
- On Napaka Nadaljuj Naprej
- Napaka GoTo Linija
Pri napaki Pojdi na 0
Pri napaki Pojdi na 0 je privzeta nastavitev VBA. To privzeto nastavitev lahko obnovite tako, da dodate naslednjo vrstico kode:
1 | Pri napaki Pojdi na 0 |
Ko pride do napake pri Pri napaki Pojdi na 0, VBA preneha izvajati kodo in prikaže standardno polje s sporočilom o napaki.
Pogosto boste dodali Pri napaki Pojdi na 0 po dodajanju On Napaka Nadaljuj Naprej obravnavanje napak (naslednji razdelek):
123456789 | Sub ErrorGoTo0 ()On Napaka Nadaljuj NaprejActiveSheet.Shapes ("Start_Button"). IzbrišiPri napaki Pojdi na 0'Zaženi več kodeEnd Sub |
On Napaka Nadaljuj Naprej
On Napaka Nadaljuj Naprej pove VBA, naj preskoči vse vrstice kode, ki vsebujejo napake, in nadaljuje z naslednjo vrstico.
1 | On Napaka Nadaljuj Naprej |
Opomba: On Napaka Nadaljuj Naprej ne odpravi napake ali je kako drugače odpravi. VBA preprosto pove, naj nadaljuje, kot da vrstica kode, ki vsebuje napako, ne obstaja. Nepravilna uporaba On Napaka Nadaljuj Naprej lahko povzroči nenamerne posledice.
Odličen čas za uporabo On Napaka Nadaljuj Naprej je pri delu s predmeti, ki lahko obstajajo ali pa tudi ne. Na primer, želite napisati kodo, ki bo izbrisala obliko, če pa kodo zaženete, ko je oblika že izbrisana, bo VBA vrgel napako. Namesto tega lahko uporabite On Napaka Nadaljuj Naprej povedati VBA, naj izbriše obliko, če obstaja.
123 | On Napaka Nadaljuj NaprejActiveSheet.Shapes ("Start_Button"). IzbrišiPri napaki Pojdi na 0 |
Opomba, ki smo jo dodali Pri napaki Pojdi na 0 za vrstico kode, ki vsebuje potencialno napako. To ponastavi obravnavo napak.
V naslednjem razdelku vam bomo pokazali, kako preizkusiti, ali je prišlo do napake Err.Številka, ki vam ponuja naprednejše možnosti za odpravljanje napak …
Err.Number, Err.Clear in Catching Errors
Namesto da preprosto preskočimo vrstico, ki vsebuje napako, lahko napako ujamemo z uporabo On Napaka Nadaljuj Naprej in Err.Številka.
Err.Številka vrne številko napake, ki ustreza vrsti zaznane napake. Če ni napake, Err.Številka = 0.
Na primer, ta postopek bo vrnil "11", ker je napaka, ki se pojavi Napaka med izvajanjem '11'.
1234567 | Sub ErrorNumber_ex ()On Napaka Nadaljuj NaprejActiveCell.Value = 2 /0MsgBox Err.ŠtevilkaEnd Sub |
Obravnavanje napak z Err.Number
Resnična moč Err.Številka je v sposobnosti zaznavanja napake (Err.Številka 0). V spodnjem primeru smo ustvarili funkcijo, ki bo s pomočjo Err.Number preverila, ali list obstaja.
12345678910111213141516171819 | Sub TestWS ()MsgBox Ali WSExist ("test")End SubFunkcija Ali WSE obstaja (wsName As String) kot BooleanZatemni kot delovni listOn Napaka Nadaljuj NaprejNastavi ws = Preglednice (wsName)'Če napaka WS ne obstajaČe Err.Številka 0 PotemAliWSExist = FalseSicer paAliWSExist = ResKonec ČeNapaka GoTo -1Končana funkcija |
Opomba: Dodali smo a Napaka GoTo -1 do konca, ki ponastavi številko Err.Number na 0 (glej dva odseka navzdol).
Z On Napaka Nadaljuj Naprej in Err.Številka, lahko podvojite »Poskusi« in »Ulovi« funkcionalnost drugih programskih jezikov.
Napaka GoTo Linija
Napaka GoTo Linija pove VBA, naj "odide" na označeno vrstico kode, ko pride do napake. Izjavo Pojdi na razglasite tako (kjer je errHandler oznaka vrstice, na katero morate iti):
1 | Na Napaka Pojdi na errHandler |
in ustvarite oznako vrstice, kot je ta:
1 | errHandler: |
Opomba: To je ista oznaka, ki bi jo uporabili z običajno izjavo VBA GoTo.
Spodaj bomo pokazali uporabo Napaka GoTo Linija za izhod iz postopka.
On Error Exit Sub
Če se pojavi napaka, lahko uporabite On Error GoTo Line za izhod iz podrejenega elementa.
To lahko storite tako, da oznako vrstice upravljalca napak postavite na konec postopka:
12345678 | Sub ErrGoToEnd ()Napaka Pojdi na endProc"Nekaj kodeksaendProc:End Sub |
ali z uporabo ukaza Exit Sub:
123456789101112131415 | Sub ErrGoToEnd ()Napaka Pojdi na endProc"Nekaj kodeksaPojdi preskočiti IzhodendProc:Zapri podskipExit:'Še nekaj kodeEnd Sub |
Err.Clear, On Error GoTo -1 in Resetting Err.Number
Ko odpravite napako, jo morate na splošno počistiti, da preprečite prihodnje težave pri obravnavi napak.
Ko pride do napake, oboje Napaka Jasno in Napaka GoTo -1 lahko uporabite za ponastavitev Err.Številka do 0. Je pa ena zelo pomembna razlika: Napaka Jasno ne ponastavi same napake, samo ponastavi Err.Številka.
Kaj to pomeni? UporabaNapaka Jasno, nastavitev obravnavanja napak ne boste mogli spremeniti. Če želite videti razliko, preizkusite to kodo in jo zamenjajte Napaka GoTo -1 z Napaka Jasno:
123456789101112131415161718192021 | Sub ErrExamples ()Pri napaki Pojdi na errHandler:Napaka »Aplikacija določena«Napaka (13)Zapri poderrHandler:'Clear ErrorNapaka GoTo -1Pri napaki Pojdi na errHandler2:Napaka "Neujemanje vrste"Napaka (1034)Zapri poderrHandler2:Debug.Print Err. OpisEnd Sub |
Običajno priporočam, da vedno uporabite Napaka GoTo -1, razen če imate dober razlog za uporabo Napaka Jasno namesto tega.
VBA pri napaki MsgBox
Morda boste želeli prikazati tudi sporočilo o napaki. Ta primer bo prikazal različna polja s sporočili, odvisno od tega, kje se pojavi napaka:
12345678910111213141516171819202122232425262728 | Sub ErrorMessageEx ()Zatemni errMsg kot nizNa Napaka Pojdi na errHandler'Faza 1errMsg = "Napaka med fazo kopiranja in lepljenja."'Err.Rasise (11)'Faza 2errMsg = "Med fazo preverjanja podatkov je prišlo do napake."'Err.Rasise (11)'Faza 3errMsg = "Prišlo je do napake med fazo P & L-Building in Copy-Over."Napaka dviga (11)"Faza 4errMsg = "Pri poskusu beleženja uvoza na strani za nastavitev je prišlo do napake."'Err.Rasise (11)Pojdi na endProcerrHandler:MsgBox errMsgendProc:End Sub |
Tu bi zamenjali Err.Raise (11) z vašo dejansko kodo.
Napaka VBA IsError
Drug način za odpravljanje napak je, da jih preizkusite s funkcijo VBA IsError. Funkcija IsError preizkusi napake pri izrazu in vrne TRUE ali FALSE, če pride do napake.
123 | Sub IsErrorEx ()MsgBox IsErrror (obseg ("a7"). Vrednost)End Sub |
Če je napaka VBA
Napake v VBA lahko odpravite tudi s funkcijo Excel IfError. Do funkcije IfError morate dostopati s pomočjo Delovni list Funkcijski razred:
1234567 | Sub IfErrorEx ()Dim n As Longn = Funkcija delovnega lista.IfError (obseg ("a10"). Vrednost, 0)MsgBox nEnd Sub |
To bo prikazalo vrednost območja A10, če je vrednost napaka, bo namesto tega prikazalo 0.
Vrste napak VBA
Napake med izvajanjem
Kot je navedeno zgoraj:
Napake v času izvajanja VBA so napake, ki se pojavijo med izvajanjem kode. Primeri napak pri izvajanju so:
- Sklicevanje na neobstoječi delovni zvezek, delovni list ali drug predmet
- Neveljavni podatki, npr. sklicevanje na celico Excel, ki vsebuje napako
- Poskus deljenja z ničlo
Napake med izvajanjem lahko "odpravite z napakami" z uporabo zgoraj opisanih metod.
Napake v sintaksi
Napake v sintaksi VBA so napake pri pisanju kode. Primeri sintaktičnih napak vključujejo:
- Napačno črkovanje
- Manjkajoča ali nepravilna ločila
Urejevalnik VBA prepozna številne sintaktične napake z rdečo oznako:
Urejevalnik VBA ima tudi možnost »Samodejno preverjanje skladnje«:
Ko je to potrjeno, bo urejevalnik VBA ustvaril okno s sporočilom, ki vas bo opozorilo na sintaktične napake, potem ko vnesete vrstico kode:
Meni osebno je to zelo nadležno in onemogočim funkcijo.
Napake pri sestavljanju
Preden poskusi zagnati postopek, bo VBA postopek "prevedel". S prevajanjem se program iz izvorne kode (ki jo vidite) pretvori v izvedljivo obliko (ne vidite).
Napake pri sestavi VBA so napake, ki preprečujejo sestavljanje kode.
Dober primer napake pri prevajanju je manjkajoča deklaracija spremenljivke:
Drugi primeri vključujejo:
- Za brez Naslednji
- Izberite brez Konec Izberite
- Če brez Konec Če
- Klicanje a postopku ki ne obstaja
Napake skladnje (prejšnji razdelek) so podskup napak pri prevajanju.
Debug> Compile
Ko poskusite zagnati postopek, se bodo pojavile napake pri prevajanju. V idealnem primeru bi identificirali napake pri sestavljanju, preden poskusite zagnati postopek.
To lahko storite tako, da vnaprej sestavite projekt. Če želite to narediti, pojdite na Debug> Compile VBA Project.
Prevajalnik bo »šel« na prvo napako. Ko odpravite to napako, znova sestavite projekt. Ponavljajte, dokler ne odpravite vseh napak.
Lahko rečete, da so vse napake odpravljene, ker Sestavite projekt VBA bo obarvano sivo:
Napaka pretoka
The Napaka pretoka VBA se pojavi, ko poskušate dati vrednost v preveliko spremenljivko. Na primer, Celobrojne spremenljivke lahko vsebuje samo vrednosti med -32,768 do 32,768. Če vnesete večjo vrednost, boste prejeli napako Overflow:
Namesto tega uporabite Dolga spremenljivka za shranjevanje večjega števila.
Drugi pogoji napak VBA
Napaka ulova VBA
Za razliko od drugih programskih jezikov v VBA ni Izjava o ulovu. Izjavo o ulovu pa lahko podvojite z uporabo On Napaka Nadaljuj Naprej in Če Err.Številka 0 Potem. To je opisano zgoraj v naslovu Obravnavanje napak z številko napake.
Napaka zanemarjanja VBA
Če želite prezreti napake v VBA, preprosto uporabite datoteko On Napaka Nadaljuj Naprej izjava:
1 | On Napaka Nadaljuj Naprej |
Kot je navedeno zgoraj, morate biti pri uporabi te izjave previdni, saj ne odpravi napake, ampak preprosto prezre vrstico kode, ki vsebuje napako.
Napaka vrtenja VBA / Err.Raise
Za napako v VBA uporabite datoteko Napaka dvig metoda.
Ta vrstica kode bo povzročila napako med izvajanjem '13': Neujemanje vrste:
1 | Napaka dviga (13) |
Ujemanje napak VBA
Ujemanje napak VBA je le še en izraz za obravnavo napak VBA.
Sporočilo o napaki VBA
A Sporočilo o napaki VBA izgleda takole:
Ko kliknete »Odpravi napake«, boste videli vrstico kode, ki oddaja napako:
Obnavljanje napak VBA
Najboljši način za odpravljanje napak v zanki je uporaba On Napaka Nadaljuj Naprej skupaj z Err.Številka za odkrivanje napake (Ne pozabite uporabiti Napaka Jasno po vsakem pojavu odpraviti napako).
Spodnji primer bo razdelil dve številki (stolpec A s stolpcem B) in rezultat prikazal v stolpcu C. Če pride do napake, bo rezultat 0.
12345678910111213141516 | Pod test ()Zatemni celico kot obsegOn Napaka Nadaljuj NaprejZa vsako celico v dosegu ("a1: a10")'Nastavi vrednost celicecell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Če je Cell.Value Error, potem privzeto nastavite na 0Če Err.Številka 0 Potemcelica. Odmik (0, 2) .Vrednost = 0Napaka JasnoKonec ČeNaslednjiEnd Sub |
Obravnavanje napak VBA pri dostopu
Vsi zgornji primeri delujejo popolnoma enako v Access VBA kot v Excelu VBA.
123456789101112131415161718 | Funkcija DelRecord (frm kot obrazec)'ta funkcija se uporablja za brisanje zapisa v tabeli iz obrazcaNapaka GoTo se končaS frmČe .NewRecord Potem.RazveljaviIzhodna funkcijaKonec ČeKončaj sS frm.RecordsetClone.Zaznamek = frm.Zaznamek.Izbrišifrm.ZahtevaKončaj sIzhodna funkcijazaključek:KonecKončana funkcija |