VBA On Error - Pogreška pri rukovanju najboljim praksama

VBA pogreške Cheat Sheet

Pogreške

OpisVBA kodGreška pri uključivanju - Zaustavljanje koda i pogreška prikazaUključeno Greška Idi na 0Greška pri uključivanju - Preskočite pogrešku i nastavite s radomUključeno Slijedi nastavak greškeGreška pri uključivanju - Idite na redak koda [Oznaka]Greška pri uključivanju Idi na [oznaka]Briše (resetira) pogreškuUključena greška GoTo -1Prikaži broj pogreškeMsgBox Err.BrojPrikaži opis greškeMsgBox Err.OpisFunkcija generiranja vlastite pogreškeGreška.Podigni

Pogledajte više VBA "Cheat Sheets" i besplatno preuzimanje PDF -a

VBA rukovanje pogreškama

VBA rukovanje pogreškama odnosi se na proces predviđanja, otkrivanja i rješavanja VBA Runtime grešaka. Postupak rukovanja pogreškama VBA događa se pri pisanju koda, prije nego što se greške zaista dogode.

VBA pogreške tijekom izvođenja greške su koje se javljaju tijekom izvršavanja koda. Primjeri grešaka za vrijeme izvođenja uključuju:

  • Pozivanje na nepostojeću radnu knjigu, radni list ili drugi objekt
  • Nevažeći podaci, npr. upućivanje na Excel ćeliju koja sadrži pogrešku
  • Pokušaj podjele s nulom

VBA o izjavi o pogrešci

Većina VBA pogrešaka rješava se s O Izjavi o grešci. Izjava On Error govori VBA -i što učiniti ako naiđe na pogrešku. Postoje tri O Izjavama o greškama:

  • Uključeno Greška Idi na 0
  • Uključeno Slijedi nastavak greške
  • Uključeno Greška GoTo Crta

Uključeno Greška Idi na 0

Uključeno Greška Idi na 0 je zadana postavka VBA -e. Ovu zadanu postavku možete vratiti dodavanjem sljedećeg retka koda:

1 Uključeno Greška Idi na 0

Kada dođe do pogreške s Uključeno Greška Idi na 0, VBA će zaustaviti izvršavanje koda i prikazati standardni okvir s porukom o pogrešci.

Često ćete dodati an Uključeno Greška Idi na 0 nakon dodavanja Uključeno Slijedi nastavak greške rukovanje pogreškama (sljedeći odjeljak):

123456789 Sub ErrorGoTo0 ()Uključeno Slijedi nastavak greškeActiveSheet.Shapes ("Start_Button"). IzbrišiUključeno Greška Idi na 0'Pokreni više kodaKraj podm

Uključeno Slijedi nastavak greške

Uključeno Slijedi nastavak greške govori VBA -i da preskoči sve retke koda koji sadrže pogreške i pređe na sljedeći redak.

1 Uključeno Slijedi nastavak greške

Bilješka: Uključeno Slijedi nastavak greške ne ispravlja grešku ili je na drugi način rješava. On jednostavno govori VBA -i da nastavi kao da redak koda koji sadrži pogrešku ne postoji. Nepravilno korištenje Uključeno Slijedi nastavak greške može rezultirati neželjenim posljedicama.

Izvrsno vrijeme za korištenje Uključeno Slijedi nastavak greške je kada radite s objektima koji mogu ili ne moraju postojati. Na primjer, želite napisati neki kod koji će izbrisati oblik, ali ako pokrenete kôd kada je oblik već izbrisan, VBA će baciti pogrešku. Umjesto toga možete koristiti Uključeno Slijedi nastavak greške reći VBA -u da izbriše oblik ako postoji.

123 Uključeno Slijedi nastavak greškeActiveSheet.Shapes ("Start_Button"). IzbrišiUključeno Greška Idi na 0

Obavijest koju smo dodali Uključeno Greška Idi na 0 iza retka koda koji sadrži potencijalnu pogrešku. Time se poništava rukovanje pogreškama.

U sljedećem odjeljku pokazat ćemo vam kako provjeriti je li došlo do pogreške pri korištenju Err.Broj, dajući vam naprednije mogućnosti rješavanja pogrešaka …

Err.Number, Err.Clear i Catching Errors

Umjesto da jednostavno preskočimo redak koji sadrži pogrešku, grešku možemo uhvatiti pomoću Uključeno Slijedi nastavak greške i Err.Broj.

Err.Broj vraća broj pogreške koji odgovara vrsti otkrivene pogreške. Ako nema greške, Err.Broj = 0.

Na primjer, ovaj će postupak vratiti "11" jer je greška koja se dogodi Pogreška tijekom izvođenja '11'.

1234567 Pod ErrorNumber_ex ()Uključeno Slijedi nastavak greškeActiveCell.Value = 2 /0MsgBox Err.BrojKraj podm

Rukovanje pogreškama s greškom

Istinska moć Err.Broj leži u sposobnosti otkrivanja je li došlo do pogreške (Err.Broj 0). U donjem primjeru stvorili smo funkciju koja će testirati postoji li list pomoću Err.Number.

12345678910111213141516171819 Pod TestWS ()MsgBox DoesWSExist ("test")Kraj podmFunkcija Postoji li WSExist (wsName As String) kao BooleanZatamni kao radni listUključeno Slijedi nastavak greškePostavi ws = Tablice (wsName)'Ako pogreška WS ne postojiAko je Err.Broj 0 TadaDoesWSExist = FalseDrugoDoesWSExist = IstinaZavrši akoUključena greška GoTo -1Završna funkcija

Napomena: Dodali smo a Uključena greška GoTo -1 do kraja koji vraća Err.Number na 0 (vidi dva odjeljka dolje).

S Uključeno Slijedi nastavak greške i Err.Broj, možete replicirati "Pokušaj uhvatiti" funkcionalnost drugih programskih jezika.

Uključeno Greška GoTo Crta

Uključeno Greška GoTo Crta govori VBA -i da "ode na" označeni redak koda kada dođe do pogreške. Izjavu Go To deklarirate ovako (gdje je errHandler oznaka retka na koju se ide):

1 Uključeno Greška Idi na errHandler

i stvorite oznaku retka ovako:

1 errHandler:

Napomena: Ovo je ista oznaka koju biste koristili s običnom VBA GoTo izjavom.

U nastavku ćemo pokazati korištenje Uključeno Greška GoTo Crta za izlazak iz postupka.

On Greška Izlaz Sub

Možete koristiti On Error GoTo Line za izlazak iz podmornice kada dođe do pogreške.

To možete učiniti stavljanjem oznake retka rukovatelja pogreške na kraj postupka:

12345678 Pod ErrGoToEnd ()Uključeno Greška Idi na endProc»Neki KodeksendProc:Kraj podm

ili pomoću naredbe Exit Sub:

123456789101112131415 Pod ErrGoToEnd ()Uključeno Greška Idi na endProc»Neki KodeksIdi na skipExitendProc:Izlaz iz podvskipExit:»Još neki kodKraj podm

Err.Clear, On Error GoTo -1 i Resetting Err.Number

Nakon što se pogreška obradi, općenito biste trebali izbrisati pogrešku kako biste spriječili buduće probleme s rukovanjem pogreškama.

Nakon što dođe do greške, oba Greška.Jasno i Uključena greška GoTo -1 može se koristiti za resetiranje Err.Broj do 0. No postoji jedna vrlo važna razlika: Greška.Jasno ne poništava samu stvarnu pogrešku, samo poništava Err.Broj.

Što to znači? KorištenjeGreška.Jasno, nećete moći promijeniti postavku rukovanja pogreškama. Da biste vidjeli razliku, isprobajte ovaj kôd i zamijenite ga Uključena greška GoTo -1 s Greška.Jasno:

123456789101112131415161718192021 Pod Err Primjeri ()O grešci GoTo errHandler:Pogreška "Aplikacija definirana"Pogreška (13)Izlaz iz podverrHandler:'Clear ErrorUključena greška GoTo -1O grešci Idi na errHandler2:Pogreška "Neusklađenost vrste"Pogreška (1034)Izlaz iz podverrHandler2:Debug.Print Err.OpisKraj podm

Obično preporučujem uvijek korištenje Uključena greška GoTo -1, osim ako nemate dobar razlog za upotrebu Greška.Jasno umjesto toga.

VBA On Error MsgBox

Možda biste htjeli prikazati i okvir s porukom o pogrešci. U ovom primjeru prikazat će se različiti okviri poruka ovisno o tome gdje se greška javlja:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg As StringUključeno Greška Idi na errHandler'Faza 1errMsg = "Došlo je do greške tijekom faze Copy & Paste."'Greška.Podigni (11)'Faza 2errMsg = "Došlo je do greške u fazi provjere valjanosti podataka."'Greška.Podigni (11)'Faza 3errMsg = "Došlo je do pogreške tijekom faze izgradnje P & L i kopiranja."Pogreška podizanja (11)'Faza 4errMsg = "Došlo je do greške pri pokušaju prijavljivanja uvoza na stranici za postavljanje"'Greška.Podigni (11)Idi na endProcerrHandler:MsgBox errMsgendProc:Kraj podm

Ovdje biste zamijenili Err.Raise (11) svojim stvarnim kodom.

VBA IsError

Drugi način rješavanja pogrešaka je testiranje istih pomoću VBA IsError funkcije. Funkcija IsError testira izraz na pogreške, vraća TRUE ili FALSE ako dođe do pogreške.

123 Pod IsErrorEx ()MsgBox IsErrror (raspon ("a7"). Vrijednost)Kraj podm

Ako greška VBA

Pogreške u VBA možete riješiti i pomoću funkcije Excel IfError. Funkciji IfError mora se pristupiti pomoću Klasa funkcije radnog lista:

1234567 Sub IfErrorEx ()Dim n As Longn = Funkcija radnog lista.IfError (Raspon ("a10"). Vrijednost, 0)MsgBox nKraj podm

Ovo će prikazati vrijednost raspona A10, ako je vrijednost pogreška, umjesto toga će se prikazati 0.

VBA vrste pogrešaka

Pogreške tijekom izvođenja

Kao što je gore navedeno:

VBA pogreške tijekom izvođenja greške su koje se javljaju tijekom izvršavanja koda. Primjeri grešaka za vrijeme izvođenja uključuju:

  • Pozivanje na nepostojeću radnu knjigu, radni list ili drugi objekt
  • Nevažeći podaci, npr. upućivanje na Excel ćeliju koja sadrži pogrešku
  • Pokušaj podjele s nulom

Greške tijekom izvođenja možete “obraditi pogreškom” pomoću prethodno opisanih metoda.

Pogreške sintakse

Pogreške sintakse VBA greške pri pisanju koda. Primjeri sintaksnih pogrešaka uključuju:

  • Pogrešno napisano
  • Nedostaju ili pogrešni interpunkcijski znakovi

VBA Editor identificira mnoge sintaksne pogreške s crvenim isticanjem:

VBA Editor također ima opciju "Automatske provjere sintakse":

Kad je to označeno, VBA Editor će generirati okvir s porukom upozoravajući vas na sintaktičke greške nakon što unesete redak koda:

Osobno smatram da je ovo krajnje neugodno i onemogućujem značajku.

Pogreške pri prevođenju

Prije nego što pokuša pokrenuti postupak, VBA će "sastaviti" postupak. Kompilacija pretvara program iz izvornog koda (koji možete vidjeti) u izvršni oblik (ne vidite).

Pogreške pri sastavljanju VBA greške su koje sprječavaju sastavljanje koda.

Dobar primjer greške pri prevođenju je deklaracija varijable koja nedostaje:

Drugi primjeri uključuju:

  • Za bez Sljedeći
  • Odaberi bez Kraj Odaberite
  • Ako bez Završi ako
  • Pozivanje a postupak to ne postoji

Pogreške sintakse (prethodni odjeljak) podskup su pogrešaka prevođenja.

Debug> Compile

Pogreške pri prevođenju pojavit će se kada pokušate pokrenuti Proceduru. U idealnom slučaju, identificirali biste pogreške pri prevođenju prije pokušaja pokretanja postupka.

To možete učiniti tako da unaprijed sastavite projekt. Da biste to učinili, idite na Debug> Compile VBA Project.

Prevoditelj će "otići" na prvu pogrešku. Nakon što ispravite tu pogrešku, ponovno sastavite projekt. Ponavljajte dok se sve pogreške ne isprave.

Možete reći da su sve pogreške ispravljene jer Sastavi VBA projekt bit će zasivljeno:

Pogreška prelijevanja

The Pogreška VBA prelijevanja javlja se kada pokušate unijeti vrijednost u preveliku varijablu. Na primjer, Cjelobrojne varijable može sadržavati samo vrijednosti između -32,768 do 32,768. Ako unesete veću vrijednost, primit ćete pogrešku preljeva:

Umjesto toga, trebali biste koristiti Duga varijabla za spremanje većeg broja.

Ostali uvjeti pogreške VBA

Pogreška hvatanja VBA

Za razliku od drugih programskih jezika, u VBA -i ne postoji Izjava o ulovu. Međutim, izjavu o ulovu možete replicirati pomoću Uključeno Slijedi nastavak greške i Ako je Err.Broj 0 Tada. Ovo je gore opisano u Rukovanju pogreškama s Err.brojem.

VBA pogreška zanemarivanja

Da biste zanemarili pogreške u VBA -i, jednostavno upotrijebite Uključeno Slijedi nastavak greške izjava:

1 Uključeno Slijedi nastavak greške

Međutim, kao što je gore spomenuto, trebali biste biti oprezni u korištenju ove izjave jer ne ispravlja pogrešku, već jednostavno zanemaruje redak koda koji sadrži pogrešku.

VBA Throw Error / Err.Raise

Da biste pogriješili u VBA, koristite Greška.Podigni metoda.

Ovaj redak koda će povećati grešku tijekom izvođenja '13': Neusklađenost tipa:

1 Pogreška podizanja (13)

Hvatanje grešaka VBA

Hvatanje grešaka VBA samo je još jedan izraz za VBA Error Handling.

VBA poruka o pogrešci

A VBA poruka o pogrešci izgleda ovako:

Kada kliknete "Otklanjanje pogrešaka", vidjet ćete redak koda koji prikazuje pogrešku:

Rukovanje pogreškama VBA

Najbolji način za rješavanje pogrešaka unutar petlje je upotreba Uključeno Slijedi nastavak greške zajedno s Err.Broj za otkrivanje je li došlo do pogreške (Ne zaboravite upotrijebiti Greška.Jasno za brisanje pogreške nakon svakog pojavljivanja).

Primjer u nastavku podijelit će dva broja (stupac A prema stupcu B) i ispisati rezultat u stupac C. Ako dođe do pogreške, rezultat će biti 0.

12345678910111213141516 Pod test ()Prigušena ćelija kao rasponUključeno Slijedi nastavak greškeZa svaku ćeliju u rasponu ("a1: a10")'Postavi vrijednost ćelijecell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Vrijednost'Ako je Cell.Value pogreška, zadano je 0Ako je Err.Broj 0 Tadaćelija.Offset (0, 2) .Vrijednost = 0Greška.JasnoZavrši akoSljedećiKraj podm

VBA rukovanje pogreškama u Accessu

Svi gornji primjeri rade potpuno isto u Access VBA kao i u Excel VBA.

123456789101112131415161718 Funkcija DelRecord (frm kao obrazac)'ova se funkcija koristi za brisanje zapisa u tablici iz obrascaUključeno Pogreška GoTo završavaS frmAko .Novi Zapisi Zatim.PoništiIzlazna funkcijaZavrši akoZavrši sS frm.RecordsetClone.Oznaka = frm.Oznaka.Izbrisatifrm.ZahtjevZavrši sIzlazna funkcijazavršetak:KrajZavršna funkcija

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave