Bez obzira na to koliko ste iskusni s VBA kodiranjem, pogreške će uvijek biti dio toga.
Razlika između početnika i iskusnog VBA programera je u tome što iskusni programeri znaju učinkovito rješavati i koristiti pogreške.
U ovom vodiču pokazat ću vam različite načine na koje možete učinkovito riješiti pogreške u Excelu VBA.
Prije nego što pređemo na upravljanje VBA pogreškama, prvo ćemo razumjeti različite vrste pogrešaka na koje ćete vjerojatno naići pri programiranju u Excelu VBA.
Vrste VBA pogrešaka u Excelu
U Excelu VBA postoje četiri vrste pogrešaka:
- Sintaksičke greške
- Pogreške pri sastavljanju
- Pogreške tijekom izvođenja
- Logičke pogreške
Brzo shvatimo koje su to pogreške i kada ćete se s njima vjerojatno susresti.
Sintaktička pogreška
Do sintaksne pogreške, kao što naziv govori, dolazi kada VBA pronađe nešto pogrešno sa sintaksom u kodu.
Na primjer, ako zaboravite dio naredbe/sintakse koji je potreban, vidjet ćete pogrešku pri prevođenju.
U donjem kodu, čim pritisnem enter nakon drugog retka, vidim grešku pri prevođenju. To je zato što je Izjava IF treba imati ‘Zatim‘Naredba, koja nedostaje u donjem kodu.
Kako biste bili sigurni da vidite sintaksnu pogrešku kad god nešto nedostaje, morate provjeriti je li omogućena provjera automatske sintakse. Da biste to učinili, kliknite na "Alati", a zatim na "Opcije". U dijaloškom okviru s opcijama provjerite je li omogućena opcija "Automatska provjera sintakse".
Ako je opcija "Automatska provjera sintakse" onemogućena, VBA će i dalje označavati redak s sintaksičkom greškom crvenom bojom, ali neće prikazati dijaloški okvir pogreške.
Pogreška pri prevođenju
Pogreške pri prevođenju nastaju kada nedostaje nešto što je potrebno za rad koda.
Na primjer, u donjem kodu, čim pokušam pokrenuti kôd, prikazat će se sljedeća pogreška. To se događa jer sam upotrijebio izraz IF Then bez zatvaranja sa obaveznim 'End If'.
VBA provjerava svaki redak dok upisujete kôd i ističe sintaksičku pogrešku čim redak nije točan i pritisnete enter. Greške pri prevođenju, s druge strane, identificiraju se samo kada VBA analizira cijeli kôd.
Ispod su neki scenariji u kojima ćete naići na pogrešku pri prevođenju:
- Korištenje IF izjave bez završetka IF
- Upotreba naredbe For s Next
- Korištenje naredbe Select bez upotrebe End Select
- Ne deklariranje varijable (ovo radi samo ako je omogućena opcija Explicit)
- Pozivanje podfunkcije koja ne postoji (ili s pogrešnim parametrima)
Pogreške u vremenu izvođenja
Pogreške tijekom izvođenja su one koje se pojavljuju dok se kôd izvodi.
Pogreške u vremenu izvođenja pojavit će se tek kada se pobrinu za sve greške u sintaksi i prevođenju.
Na primjer, ako pokrenete kôd koji bi trebao otvoriti radnu knjigu programa Excel, ali ta radna knjiga nije dostupna (izbrisana ili promijenjen naziv), vaš kôd će vam prikazati pogrešku tijekom izvođenja.
Kada dođe do pogreške tijekom izvođenja, zaustavit će kôd i prikazati vam dijaloški okvir pogreške.
Poruka u dijaloškom okviru Greška tijekom izvođenja je malo korisnija. Pokušava objasniti problem koji vam može pomoći da ga ispravite.
Ako kliknete gumb Debug, označit će dio koda koji dovodi do pogreške.
Ako ste ispravili pogrešku, možete kliknuti gumb Pokreni na alatnoj traci (ili pritisnite F5) da biste nastavili izvoditi kôd s mjesta na kojem je otišao.
Ili također možete kliknuti gumb Završi da biste izašli iz koda.
Važno: U slučaju da kliknete gumb Završi u dijaloškom okviru, zaustavit će kôd u retku na koji se naiđe. Međutim, svi retci koda prije toga bili bi izvedeni.Logičke pogreške
Logičke pogreške neće zaustaviti vaš kôd, ali mogu dovesti do pogrešnih rezultata. To bi također mogle biti najteže vrste pogrešaka za rješavanje problema.
Ove pogreške prevoditelj ne ističe i potrebno ih je ručno riješiti.
Jedan primjer logičke greške (s kojom se često zaglavim) je trčanje u beskrajnu petlju.
Drugi primjer može biti kada daje rezultat koji je pogrešan. Na primjer, možete završiti s korištenjem pogrešne varijable u kodu ili dodati dvije varijable ako jedna nije točna.
Postoji nekoliko načina na koje rješavam logičke pogreške:
- Umetnite okvir za poruke na neko mjesto u kodu i označite vrijednosti/podatke koji mogu pomoći u razumijevanju ide li sve u skladu s očekivanjima.
- Umjesto da pokrećete kôd odjednom, prođite kroz svaki redak jedan po jedan. Da biste to učinili, kliknite bilo gdje u kodu i pritisnite F8. primijetili biste da se svaki put kada pritisnete F8 izvršava jedan redak. To vam omogućuje da prolazite kroz red po red i identificirate logičke pogreške.
Korištenje otklanjanja pogrešaka za pronalaženje grešaka u prevođenju/sintaksi
Kada završite s kodom, dobra je praksa da ga prvo sastavite prije pokretanja.
Za sastavljanje koda kliknite opciju Debug na alatnoj traci i pritisnite Compile VBAProject.
Kad sastavite VBA projekt, on prolazi kroz kôd i identificira pogreške (ako ih ima).
U slučaju da pronađe pogrešku, prikazat će vam se dijaloški okvir s pogreškom. Pronalazi greške jednu po jednu. Dakle, ako pronađe pogrešku, a vi ste je ispravili, morate ponovno pokrenuti kompajliranje kako biste pronašli druge pogreške (ako postoje).
Kada vaš kôd nema grešaka, opcija Compile VBAProject bit će zasivljena.
Imajte na umu da će sastavljanje pronaći samo pogreške "Sintakse" i "Prevođenje". Neće pronaći pogreške tijekom izvođenja.
Kada pišete VBA kôd, ne želite da se greške pojavljuju. Kako biste to izbjegli, možete koristiti mnoge metode rješavanja pogrešaka.
U sljedećih nekoliko odjeljaka ovog članka pokazat ću metode koje možete koristiti za rješavanje VBA pogrešaka u Excelu.
Konfigurirajte postavke pogrešaka (obrađene pogreške u odnosu na neobrađene)
Prije nego počnete raditi sa svojim kodom, morate provjeriti jednu postavku u Excelu VBA.
Idite na VBA alatnu traku i kliknite Alati, a zatim kliknite Opcije.
U dijaloškom okviru Mogućnosti kliknite karticu Općenito i provjerite je li unutar grupe "Hvatanje pogrešaka" označeno "Prekini kod neobrađenih pogrešaka".
Dopustite mi da objasnim tri opcije:
- Razbij sve greške: Ovo će zaustaviti vaš kôd za sve vrste pogrešaka, čak i ako ste koristili tehnike za rješavanje ovih pogrešaka.
- Modul Pauza u nastavi: Ovo će zaustaviti vaš kôd na svim neobrađenim pogreškama, a istodobno, ako koristite objekte kao što su Userforms, također će se probiti unutar tih objekata i istaknuti točan redak koji uzrokuje pogrešku.
- Prelomite neopravdane pogreške: Ovo će zaustaviti vaš kôd samo za one pogreške koje se ne obrade. Ovo je zadana postavka jer osigurava da vas obavijeste o neopravdanim greškama. Ako koristite objekte kao što su Korisnički oblici, ovo neće označiti liniju koja uzrokuje pogrešku u objektu, već će samo istaknuti liniju koja se odnosi na taj objekt.
Ukratko - ako tek počinjete s programom Excel VBA, provjerite je li označena opcija "Prekid grešaka bez obrade".
VBA rukovanje pogreškama s izjavama o pogrešci
Kada vaš kôd naiđe na pogrešku, možete učiniti nekoliko stvari:
- Zanemarite pogrešku i pustite kôd da se nastavi
- Postavite kôd za obradu pogrešaka i pokrenite ga kada dođe do pogreške
Obje ove metode rukovanja pogreškama osiguravaju da krajnji korisnik neće vidjeti pogrešku.
Postoji nekoliko izjava "O pogrešci" koje možete upotrijebiti za to.
Uključeno Slijedi nastavak greške
Kad u svom kodu upotrijebite opciju "On Error Resume Next", svaka pogreška na koju se naiđe zanemarit će se i kôd će se nastaviti izvoditi.
Ova metoda rukovanja pogreškama koristi se prilično često, ali morate biti oprezni pri njezinoj uporabi. Budući da potpuno zanemaruje svaku pogrešku koja se može pojaviti, možda nećete moći identificirati pogreške koje je potrebno ispraviti.
Na primjer, ako se donji kôd pokrene, vratit će pogrešku.
Sub AssignValues () x = 20 /4 y = 30 /0 End Sub
To se događa jer broj ne možete podijeliti s nulom.
No, ako u ovom kodu koristim naredbu ‘On Error Resume Next’ (kao što je prikazano u nastavku), ona će zanemariti pogrešku i neću znati da postoji problem koji treba ispraviti.
Sub AssignValues () Uključeno Pogreška Nastavi Sljedeće x = 20 /4 y = 30 /0 Završi pod
On Error Resume Next treba koristiti samo ako jasno znate kakvu vrstu pogrešaka očekuje vaš VBA kôd i ako je u redu zanemariti je.
Na primjer, ispod je VBA kôd događaja koji bi odmah dodao vrijednost datuma i vremena u ćeliju A1 novo umetnutog lista (ovaj kôd dodaje se na radni list, a ne u modul).
Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Iako ovo u većini slučajeva odlično funkcionira, pokazalo bi se pogreška ako umjesto radnog lista dodam list grafikona. Budući da list grafikona nema ćelija, kod bi izazvao pogrešku.
Dakle, ako u ovom kodu koristim izraz 'On Error Resume Next', on će raditi kako se očekuje s radnim listovima i neće učiniti ništa s listovima grafikona.
Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Napomena: On Error Resume, sljedeću izjavu najbolje je upotrijebiti kada znate na kakve greške ćete vjerojatno naići. A onda, ako mislite da je sigurno zanemariti ove pogreške, možete ga upotrijebiti.
Ovaj kôd možete podići na višu razinu tako što ćete analizirati je li došlo do pogreške i prikazati relevantnu poruku za njega.
Kod u nastavku prikazao bi okvir s porukom koji će obavijestiti korisnika da radni list nije umetnut.
Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") If Err.Number 0 Then MsgBox "Liči na vas umetnuta tablica grafikona "& vbCrLf &" Pogreška - "& Err. Opis Završi ako završi Sub
"Err.Number" koristi se za dobivanje broja pogreške, a "Err.Description" za dobivanje opisa pogreške. To će biti obrađeno kasnije u ovom vodiču.
Uključeno Greška Idi na 0
'On Error GoTo 0' zaustavit će kôd u retku koji uzrokuje pogrešku i prikazati okvir s porukom koji opisuje pogrešku.
Jednostavno rečeno, omogućuje zadano ponašanje provjere pogrešaka i prikazuje zadanu poruku o pogrešci.
Zašto ga onda uopće koristiti?
Obično ne morate koristiti "On Error Goto 0", ali može biti korisno kada ga koristite zajedno s "On Error Resume Next"
Dopustite mi da objasnim!
Kod u nastavku odabrao bi sve prazne ćelije u odabiru.
Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Odaberite End Sub
No, prikazala bi se pogreška ako u odabranim ćelijama nema praznih ćelija.
Kako biste izbjegli prikazivanje pogreške, možete upotrijebiti On Error Resume next '
Sada će također pokazati svaku pogrešku kada pokrenete donji kod:
Sub SelectFormulaCells () On Error Nastavi sljedeći odabir.SpecialCells (xlCellTypeBlanks). Odaberite End Sub
Zasada je dobro!
Problem nastaje kada postoji dio koda u kojemu može doći do pogreške, a budući da koristite "On Error Resume Next", kôd bi ga jednostavno zanemario i prešao na sljedeći redak.
Na primjer, u donjem kodu ne bi bilo upita o pogrešci:
Sub SelectFormulaCells () On Error Nastavi sljedeći odabir.SpecialCells (xlCellTypeBlanks). Odaberite '… više koda koji može sadržavati pogrešku End Sub
U gornjem kodu postoje dva mjesta na kojima može doći do pogreške. Prvo mjesto odabiremo sve prazne ćelije (pomoću Selection.SpecialCells), a drugo je u preostalom kodu.
Iako se prva pogreška očekuje, svaka greška nakon toga nije.
Ovdje vam pomaže On Error Goto 0.
Kad ga upotrebljavate, vraćate postavku pogreške na zadanu vrijednost, gdje će početi prikazivati pogreške kada naiđe na nju.
Na primjer, u donjem kodu ne bi došlo do pogreške u slučaju da nema praznih ćelija, ali bi se pojavio upit o pogrešci zbog '10/0 '
Sub SelectFormulaCells () On Error Nastavi sljedeći odabir.SpecialCells (xlCellTypeBlanks). Odaberite On Error GoTo 0 '… više koda koji može sadržavati pogrešku End Sub
Greška pri uključivanju Idi na [oznaka]
Gore navedene dvije metode - ‘On Error Resume Next’ i ‘On Error Goto 0’ - ne dopuštaju nam da istinski riješimo pogrešku. Jedan tjera kôd da zanemari pogrešku, a drugi nastavlja provjeru pogrešaka.
On Error Go [Label] je način na koji možete odrediti što želite učiniti u slučaju greške u vašem kodu.
Ispod je struktura koda koja koristi ovaj alat za obradu pogrešaka:
Sub Test () On Error GoTo Label: X = 10 /0 'ovaj redak uzrokuje pogrešku'… .vaš preostali kôd ide ovdje Exit Sub Label: 'kod za rješavanje pogreške End Sub
Imajte na umu da prije pogreške pri rukovanju "oznakom" postoji podizlazni izlaz. To osigurava da u slučaju da nema pogrešaka, podizlaz izlazi i da se kôd ‘Oznaka’ ne izvršava. U slučaju da ne koristite Exit Sub, uvijek će izvršiti kôd 'Label'.
U donjem primjeru koda, kada dođe do pogreške, kod preskače i izvršava kôd u odjeljku rukovatelja (i prikazuje okvir s porukom).
Sub Errorhandler () Uključeno Greška Idi na ErrMsg X = 12 Y = 20 /0 Z = 30 Izlaz iz pod ErrMsg: MsgBox "Čini se da postoji pogreška" & vbCrLf & Err.Opis Kraj Sub
Imajte na umu da je kod greške kôd već pokrenut i izvršio retke prije retka koji uzrokuje pogrešku. U gornjem primjeru kôd postavlja vrijednost X kao 12, ali budući da se pogreška javlja u sljedećem retku, ne postavlja vrijednosti za Y i Z.
Nakon što kôd skoči na kôd rukovatelja pogreškama (ErrMsg u ovom primjeru), nastavit će izvršavati sve retke unutar i ispod koda rukovatelja pogreškama i izaći iz podmreže.
Uključeno Greška Idi na -1
Ovaj je pomalo kompliciran i u većini slučajeva vjerojatno nećete ovo koristiti.
No svejedno ću to pokriti jer sam se suočio sa situacijom u kojoj je to bilo potrebno (slobodno zanemarite i prijeđite na sljedeći odjeljak ako tražite samo osnove).
Prije nego što se pozabavim mehanikom toga, dopustite mi da pokušam objasniti gdje to može biti korisno.
Pretpostavimo da imate kôd u kojem je došlo do pogreške. No, sve je u redu jer imate jedan upravljač pogreškama. Ali što se događa kada dođe do druge pogreške u kodu rukovatelja pogreškama (da … donekle poput početnog filma).
U tom slučaju ne možete koristiti drugi rukovatelj jer prva pogreška nije izbrisana. Dakle, iako ste riješili prvu pogrešku, u VBA -inoj memoriji ona još uvijek postoji. VBA memorija ima mjesto samo za jednu pogrešku - ne dvije ili više od toga.
U ovom scenariju možete koristiti On Error Goto -1.
On briše pogrešku i oslobađa VBA memoriju za obradu sljedeće pogreške.
Dosta priče!
Dopustite mi da sada objasnim pomoću primjera.
Pretpostavimo da imam donji kod. To će izazvati pogrešku jer postoji podjela na nulu.
Sub Erhandler () X = 12 Y = 20 /0 Z = 30 End Sub
Dakle, za rješavanje toga koristim kôd rukovatelja pogreškama (s imenom ErrMsg) kako je prikazano u nastavku:
Sub Errorhandler () Uključeno Greška Idi na ErrMsg X = 12 Y = 20 /0 Z = 30 Izlaz iz pod ErrMsg: MsgBox "Čini se da postoji pogreška" & vbCrLf & Err.Opis Kraj Sub
Sad je opet sve u redu. Čim dođe do pogreške, koristi se rukovatelj pogreške i prikazuje okvir s porukom kao što je prikazano u nastavku.
Sada proširujem kôd tako da imam više koda u ili nakon rukovatelja pogreškama.
Sub Errorhandler () On Error Idi na ErrMsg X = 12 Y = 20 /0 Z = 30 Izađi iz Er ErMsg: MsgBox "Čini se da postoji pogreška" & vbCrLf & Err.Opis A = 10 /2 B = 35 /0 Kraj pod
Budući da je prva pogreška obrađena, a druga nije, ponovno vidim pogrešku kao što je prikazano u nastavku.
Još uvijek sve dobro. Kôd se ponaša onako kako smo očekivali.
Dakle, za rješavanje druge pogreške koristim drugi alat za obradu pogrešaka (ErrMsg2).
Sub Errorhandler () On Error Idi na ErrMsg X = 12 Y = 20 /0 Z = 30 Izađi iz Sub ErrMsg: MsgBox "Čini se da postoji pogreška" & vbCrLf & Err.Opis na pogrešku GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Čini se da je opet došlo do pogreške" & vbCrLf & Err.Opis Kraj Sub
I tu je to mjesto ne radi kako se očekivalo.
Ako pokrenete gornji kôd, i dalje će vam prikazati pogrešku tijekom izvođenja, čak i nakon što ste postavili drugi rukovatelj pogreškama.
To se događa jer prvu grešku nismo izbrisali iz memorije VBA -e.
Da, riješili smo to! Ali i dalje ostaje u sjećanju.
A kad VBA naiđe na drugu pogrešku, i dalje je zaglavljena s prvom pogreškom, pa se drugi alat za obradu pogrešaka ne koristi. Kôd se zaustavlja na retku koji je uzrokovao pogrešku i prikazuje upit za pogrešku.
Da biste očistili memoriju VBA -e i izbrisali prethodnu pogrešku, morate upotrijebiti "On Error Goto -1".
Dakle, ako dodate ovaj redak u donji kod i pokrenete ga, radit će prema očekivanjima.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Izlaz iz Sub ErrMsg: MsgBox "Čini se da postoji pogreška" & vbCrLf & Err.Opis Opis Greška GoTo -1 Uključeno Greška GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Izlaz iz pod ErrMsg2: MsgBox "Čini se da je opet došlo do pogreške" & vbCrLf & Err.Opis Kraj SubBilješka: Pogreška se automatski uklanja po završetku potprograma.Dakle, 'On Error Goto -1' može biti korisno kada dobijete dvije ili više od dvije pogreške u istoj potprogrami.
Objekt Err
Kad god se dogodi pogreška s kodom, objekt Err koristi se za dobivanje pojedinosti o pogrešci (poput broja pogreške ili opisa).
Err Svojstva objekta
Objekt Err ima sljedeća svojstva:
Imovina | Opis |
Broj | Broj koji predstavlja vrstu pogreške. Kad nema pogreške, ta je vrijednost 0 |
Opis | Kratak opis greške |
Izvor | Naziv projekta u kojem je došlo do greške |
Kontekst za pomoć | ID konteksta pomoći za pogrešku u datoteci pomoći |
Datoteka za pomoć | Niz koji predstavlja lokaciju mape i naziv datoteke datoteke pomoći |
Iako u većini slučajeva ne morate koristiti objekt Err, ponekad može biti korisno pri rješavanju pogrešaka u Excelu.
Na primjer, pretpostavimo da imate skup podataka kao što je prikazano u nastavku i za svaki broj u odabiru želite izračunati kvadratni korijen u susjednoj ćeliji.
Kod u nastavku to može učiniti, ali budući da u ćeliji A5 postoji tekstualni niz, prikazuje grešku čim se to dogodi.
Sub FindSqrRoot () Dim rng As Range Set rng = Odabir za svaku ćeliju u rng ćeliji.Offset (0, 1) .Value = Sqr (cell.Value) Sljedeća ćelija Kraj Sub
Problem s ovom vrstom poruke o pogrešci je taj što vam ne daje ništa o tome što je pošlo po zlu i gdje se problem pojavio.
Možete upotrijebiti objekt Err kako biste ove poruke o pogrešci učinili smislenijima.
Na primjer, ako sada koristim donji VBA kôd, zaustavit će kôd čim dođe do pogreške i prikazat će okvir s adresom ćelije ćelije u kojoj postoji problem.
Sub FindSqrRoot () Dim rng As Range Set rng = Odabir za svaku ćeliju In rng On Greška Idi na ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Sljedeća ćelija ErrHandler: MsgBox "Broj pogreške:" & Err .Broj & vbCrLf & _ "Opis pogreške:" & Err.Description & vbCrLf & _ "Pogreška na:" & cell.Address End Sub
Gornji kôd dao bi vam mnogo više informacija od jednostavnog "Neslaganje tipova", posebno adresu ćelije kako biste znali gdje je došlo do pogreške.
Možete dodatno poboljšati ovaj kôd kako biste bili sigurni da vaš kôd radi do kraja (umjesto da se razbije pri svakoj pogrešci), a zatim će vam dati popis adresa ćelije na kojoj se pogreška pojavljuje.
Kôd u nastavku bi ovo učinio:
Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Odabir za svaku ćeliju u rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next ćelija MsgBox "Greška u sljedećim ćelijama" & ErrorCells Exit Sub End Sub
Gornji kôd radi do kraja i daje kvadratni korijen svih ćelija s brojevima (u susjednom stupcu). Zatim prikazuje poruku s popisom svih ćelija u kojima je došlo do pogreške (kao što je prikazano u nastavku):
Err Objektne metode
Iako su svojstva Err korisna za prikazivanje korisnih informacija o pogreškama, postoje dvije metode Err koje vam mogu pomoći u rješavanju pogrešaka.
Metoda | Opis |
Čisto | Briše sve postavke svojstava objekta Err |
Podići | Generira pogrešku tijekom izvođenja |
Brzo naučimo što je to i kako/zašto ih koristiti s VBA -om u Excelu.
Err Clear Method
Pretpostavimo da imate skup podataka kao što je prikazano u nastavku i želite dobiti kvadratni korijen svih ovih brojeva u susjednom stupcu.
Sljedeći kôd dobit će kvadratne korijene svih brojeva u susjednom stupcu i prikazati poruku da je došlo do pogreške za ćelije A5 i A9 (budući da u njima ima teksta).
Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Odabir za svaku ćeliju u rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next ćelija MsgBox "Greška u sljedećim ćelijama" & ErrorCells End Sub
Imajte na umu da sam koristio metodu Err.Clear unutar naredbe If Then.
Nakon što se pogreška dogodi i zarobi uvjetom If, metoda Err.Clear resetira broj pogreške na 0. To osigurava da IF uvjet hvata greške samo za ćelije gdje je podignuta.
Da nisam koristio metodu Err.Clear, kada se pogreška dogodi, uvijek bi bila točna u IF stanju, a broj pogreške nije poništen.
Drugi način da ovo uspije je korištenje On Error Goto -1, koje potpuno poništava pogrešku.
Bilješka: Err.Clear se razlikuje od On Error Goto -1. Err.Clear briše samo opis pogreške i broj pogreške. ne poništava ga u potpunosti. To znači da ako postoji druga instanca greške u istom kodu, nećete je moći riješiti prije nego što je resetirate (što se može učiniti s "On Error Goto -1", a ne s "Err.Clear").Metoda podizanja greške
Metoda Err.Raise omogućuje vam pokretanje pogreške tijekom izvođenja.
Ispod je sintaksa korištenja metode Err.Raise:
Err.Podignite [broj], [izvor], [opis], [datoteku pomoći], [helpcontext]
Svi su ovi argumenti neobavezni i pomoću njih možete svoju poruku o pogrešci učiniti smislenijom.
Ali zašto biste i sami htjeli pokrenuti pogrešku?
Dobro pitanje!
Ovu metodu možete upotrijebiti kada postoji primjer pogreške (što znači da ipak dolazi do pogreške), a zatim koristite ovu metodu da biste korisniku rekli više o pogrešci (umjesto manje korisne poruke o pogrešci koju prikazuje VBA prema zadanim postavkama).
Na primjer, pretpostavimo da imate skup podataka kao što je prikazano u nastavku i želite da sve ćelije imaju samo numeričke vrijednosti.
Sub RaiseError () Dim rng As Range Set rng = Odabir On Error Idi na ErrHandler za svaku ćeliju u rng -u Ako nije (IsNumeric (Cell.Value)) Zatim Err.Raise vbObjectError + 513, Cell.Address, "Nije broj", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
Gornji kôd prikazao bi poruku o pogrešci koja ima navedeni opis i datoteku konteksta.
Osobno nikad nisam koristio Err.Raise jer uglavnom radim samo s Excelom. No, za nekoga tko koristi VBA za rad s Excelom zajedno s drugim aplikacijama, kao što su Outlook, Word ili PowerPoint, ovo može biti korisno.
Evo detaljnog članka o metodi Err.Raise u slučaju da želite saznati više.
VBA pogreške pri rukovanju najboljim praksama
Bez obzira na to koliko ste vješti u pisanju VBA koda, greške će uvijek biti dio toga. Najbolji koderi su oni koji imaju vještine ispravno se nositi s tim pogreškama.
Evo nekoliko najboljih praksi koje možete koristiti kada je u pitanju rukovanje pogreškama u programu Excel VBA.
- Koristite "On Error Go [Label]" na početku koda. To će osigurati da se riješi svaka greška koja se od tamo može dogoditi.
- Upotrijebite "On Error Resume Next" SAMO kad ste sigurni u moguće greške. Koristite ga samo s očekivanom pogreškom. U slučaju da ga koristite s neočekivanim pogreškama, jednostavno će ga zanemariti i krenuti naprijed. Možete koristiti "On Error Resume Next" s "Err.Raise" ako želite zanemariti određenu vrstu pogreške, a uhvatiti ostalo.
- Kad koristite rukovatelje pogreškama, provjerite koristite li Exit Sub prije rukovatelja. To će osigurati da se kôd rukovatelja pogreškama izvrši samo kada postoji pogreška (inače će se uvijek izvršiti).
- Koristite više rukovatelja pogreškama za hvatanje različitih vrsta pogrešaka. Imati više rukovatelja pogreškama osigurava da je pogreška ispravno riješena. Na primjer, htjeli biste drugačije postupati s pogreškom "neusklađenosti tipa" nego s pogreškom "Dijeljenje s 0".
Nadam se da vam je ovaj Excel članak bio koristan!
Evo još nekih vodiča za Excel VBA koji bi vam se mogli svidjeti:
- VBA tipovi podataka Excel VBA - potpuni vodič
- Excel VBA petlje - Za sljedeće, Učinite dok, Učinite do, Za svaku
- Excel VBA događaji - jednostavan (i potpun) vodič
- Excel Visual Basic Editor - Kako ga otvoriti i koristiti u Excelu