Odpravljanje napak v Excelu VBA - vse, kar morate vedeti!

Ne glede na to, kako izkušeni ste s kodiranjem VBA, bodo napake vedno del tega.

Razlika med začetnikom in izkušenim programerjem VBA je v tem, da znajo programerji učinkovito obvladovati in uporabljati napake.

V tej vadnici vam bom pokazal različne načine, s katerimi lahko učinkovito odpravite napake v Excelu VBA.

Preden se lotimo obravnave napak VBA, najprej razumemo različne vrste napak, na katere boste verjetno naleteli pri programiranju v Excelu VBA.

Vrste napak VBA v Excelu

V Excelu VBA obstajajo štiri vrste napak:

  1. Napake v sintaksi
  2. Napake pri sestavljanju
  3. Napake med izvajanjem
  4. Logične napake

Hitro ugotovimo, kaj so te napake in kdaj se boste z njimi srečali.

Napaka v sintaksi

Napaka v skladnji, kot že ime pove, se pojavi, ko VBA odkrije nekaj narobe s sintakso v kodi.

Če na primer pozabite na del stavka/skladnje, ki je potreben, boste videli napako pri prevajanju.

V spodnji kodi takoj, ko pritisnem enter po drugi vrstici, vidim napako pri sestavljanju. To je zato, ker Izjava IF mora imeti 'Potem‘Ukaz, ki manjka v spodnji kodi.

Opomba: Ko vnesete kodo v Excelu VBA, preveri vsak stavek takoj, ko pritisnete enter. Če VBA v sintaksi najde nekaj manjkajočega, takoj prikaže sporočilo z besedilom, ki vam lahko pomaga razumeti manjkajoči del.

Če želite, da se pri vsaki sinhronizaciji prikaže napaka v sintaksi, se prepričajte, da je omogočeno preverjanje samodejne sintakse. Če želite to narediti, kliknite »Orodja« in nato »Možnosti«. V pogovornem oknu z možnostmi se prepričajte, da je omogočena možnost »Samodejno preverjanje skladnje«.

Če je možnost »Samodejno preverjanje skladnje« onemogočena, bo VBA še vedno označila vrstico s sintaktično napako v rdeči barvi, vendar ne bo prikazala pogovornega okna za napako.

Napaka pri prevajanju

Napake pri sestavljanju se pojavijo, ko manjka nekaj, kar je potrebno za zagon kode.

Na primer, v spodnji kodi se bo takoj, ko poskusim zagnati kodo, prikazala naslednja napaka. To se zgodi, ko sem uporabil stavek IF Then, ne da bi ga zaprl z obveznim 'End If'.

Sintaksna napaka je tudi vrsta napake pri prevajanju. Napaka v sintaksi se pojavi takoj, ko pritisnete enter in VBA ugotovi, da nekaj manjka. Napaka pri sestavljanju se lahko pojavi tudi, ko VBA med tipkanjem kode ne najde ničesar, kar pa se zgodi, ko je koda sestavljena ali izvedena.

VBA med vnašanjem kode preverja vsako vrstico in označi sintaktično napako, takoj ko vrstica ni pravilna in pritisnete enter. Napake pri prevajanju pa se odkrijejo le, ko VBA analizira celotno kodo.

Spodaj je nekaj scenarijev, v katerih boste naleteli na napako pri prevajanju:

  1. Uporaba izjave IF brez konca IF
  2. Uporaba stavka For z Next
  3. Uporaba stavka Select brez uporabe End Select
  4. Ne deklariranje spremenljivke (to deluje samo, če je omogočena možnost Opcija Explicit)
  5. Klic pod -funkcije, ki ne obstaja (ali z napačnimi parametri)
Opomba o "opciji eksplicitno": Ko dodate »Option Explicit«, boste morali pred zagonom kode prijaviti vse spremenljivke. Če obstaja kakšna spremenljivka, ki ni bila deklarirana, bi VBA prikazal napako. To je dobra praksa, saj prikazuje napako, če imate spremenljivko, ki je napačno napisana. Več o možnostih Explicit si lahko preberete tukaj.

Napake v času izvajanja

Napake med izvajanjem so tiste, ki se pojavijo, ko se koda izvaja.

Napake v času izvajanja se bodo pojavile šele, ko bodo poskrbljene za vse napake v sintaksi in prevajanju.

Če na primer zaženete kodo, ki naj bi odprla Excelov delovni zvezek, vendar ta delovni zvezek ni na voljo (izbrisan ali ime spremenjeno), bi vam koda povzročila napako pri izvajanju.

Ko pride do napake med izvajanjem, bo kodo ustavil in prikazal pogovorno okno o napaki.

Sporočilo v pogovornem oknu Napaka med izvajanjem je nekoliko bolj koristno. Poskuša razložiti težavo, ki vam lahko pomaga odpraviti.

Če kliknete gumb Debug, bo označil del kode, ki vodi do napake.

Če ste napako odpravili, lahko kliknete gumb Zaženi v orodni vrstici (ali pritisnite F5), da nadaljujete z izvajanjem kode od tam, kjer je ostala.

Lahko pa tudi kliknete gumb Konec, da izstopite iz kode.

Pomembno: Če v pogovornem oknu kliknete gumb Končaj, se koda ustavi v vrstici, v kateri se pojavi. Vendar bi bile vse vrstice kode pred tem izvedene.

Logične napake

Logične napake ne bodo ustavile vaše kode, lahko pa vodijo do napačnih rezultatov. To so lahko tudi najtežje vrste napak za odpravljanje težav.

Prevajalnik teh napak ne poudari in jih je treba ročno odpraviti.

En primer logične napake (s katero se pogosto znajdem obtičal) je nalet na neskončno zanko.

Drug primer je lahko, ko poda napačen rezultat. Na primer, v kodi lahko uporabite napačno spremenljivko ali dodate dve spremenljivki, kjer je ena napačna.

Za odpravljanje logičnih napak uporabljam nekaj načinov:

  1. Vstavite polje za sporočila na neko mesto v kodi in označite vrednosti/podatke, ki vam lahko pomagajo razumeti, ali eberything poteka po pričakovanjih.
  2. Namesto da kodo izvajate naenkrat, pojdite skozi vsako vrstico eno za drugo. Če želite to narediti, kliknite kjer koli v kodi in pritisnite F8. opazili boste, da se vsakič, ko pritisnete F8, izvede ena vrstica. To vam omogoča, da greste skozi kodo eno za drugo in ugotovite logične napake.

Uporaba Debug za iskanje napak pri prevajanju/skladnji

Ko končate s kodo, je dobro, da jo najprej sestavite, preden zaženete.

Če želite sestaviti kodo, kliknite orodje Debug v orodni vrstici in kliknite Compile VBAProject.

Ko sestavite projekt VBA, gre skozi kodo in prepozna napake (če obstajajo).

Če odkrije napako, se vam prikaže pogovorno okno z napako. Napake najde eno za drugo. Če torej najde napako in ste jo odpravili, morate znova zagnati compile, da poiščete druge napake (če obstajajo).

Ko v vaši kodi ni napak, bo možnost Compile VBAProject zatemnjena.

Upoštevajte, da bodo pri sestavljanju našli samo napake »Sintaksa« in »Prevajanje«. Napake med izvajanjem NE bo našel.

Ko pišete kodo VBA, ne želite, da se napake pojavijo. Da bi se temu izognili, lahko uporabite veliko načinov za odpravljanje napak.

V naslednjih nekaj razdelkih tega članka bom obravnaval metode, ki jih lahko uporabite za obravnavo napak VBA v Excelu.

Konfiguriranje nastavitev napak (obravnavane napake proti obdelavi)

Preden začnete delati s kodo, morate v Excelu VBA preveriti eno nastavitev.

Pojdite v orodno vrstico VBA in kliknite Orodja ter nato Možnosti.

V pogovornem oknu Možnosti kliknite zavihek Splošno in se prepričajte, da je v skupini »Prestrezanje napak« označena možnost »Prekinitev pri neobdelanih napakah«.

Naj razložim tri možnosti:

  1. Prelom pri vseh napakah: To bo zaustavilo vašo kodo pri vseh vrstah napak, tudi če ste uporabili tehnike za odpravljanje teh napak.
  2. Modul Odmor v razredu: To bo zaustavilo vašo kodo pri vseh neobdelanih napakah, hkrati pa bo, če uporabljate predmete, kot so Userforms, tudi prelomilo znotraj teh predmetov in označilo natančno vrstico, ki povzroča napako.
  3. Prekinite pri neobdelanih napakah: To bo zaustavilo vašo kodo samo za tiste napake, ki niso obravnavane. To je privzeta nastavitev, saj zagotavlja, da ste obveščeni o vseh neobdelanih napakah. Če uporabljate predmete, kot so uporabniške oblike, to ne bo označilo vrstice, ki povzroča napako v objektu, ampak bo samo označila vrstico, ki se nanaša na ta predmet.
Opomba: Če delate s predmeti, kot so uporabniške oblike, lahko to nastavitev spremenite v »Prekinitev modulov razreda«. Razlika med #2 in #3 je v tem, da vas pri uporabi modula Break v razredu pripelje do določene vrstice v objektu, ki povzroča napako. Lahko se odločite tudi za to, namesto za »Prekinitev pri neobdelanih napakah«.

Na kratko - če šele začenjate z Excelom VBA, potrdite polje »Prekinitev pri neobdelanih napakah«.

Obravnavanje napak VBA z izjavami o napaki

Ko pride do napake v kodi, lahko naredite nekaj stvari:

  1. Napako prezrite in pustite, da se koda nadaljuje
  2. Vstavite kodo za odpravljanje napak in jo zaženite, ko pride do napake

Oba načina obravnavanja napak zagotavljata, da končni uporabnik ne bo videl napake.

Za to lahko uporabite nekaj izjav o napaki.

On Napaka Nadaljuj Naprej

Ko v kodi uporabite »On Error Resume Next«, se vsaka napaka, ki se pojavi, zanemari in koda se bo še naprej izvajala.

Ta način obravnave napak se uporablja precej pogosto, vendar morate biti pri uporabi previdni. Ker popolnoma ignorira morebitne napake, morda ne boste mogli prepoznati napak, ki jih je treba popraviti.

Če na primer zaženete spodnjo kodo, bo vrnila napako.

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

To se zgodi, ker številke ne morete deliti z ničlo.

Če pa v tej kodi uporabim stavek 'On Error Resume Next' (kot je prikazano spodaj), bo napako prezrl in ne bom vedel, da obstaja težava, ki jo je treba popraviti.

Sub AssignValues ​​() On Napaka Nadaljuj Naprej x = 20 /4 y = 30 /0 End Sub

On Error Resume Next je treba uporabiti le, če jasno veste, kakšne napake naj bi povzročila vaša koda VBA, in če jih ne upoštevate.

Spodaj je na primer koda dogodka VBA, ki bi takoj dodala vrednost datuma in časa v celico A1 na novo vstavljenega lista (ta koda je dodana na delovnem listu in ne v modulu).

Zasebni pod Delovni zvezek_novski list (ByVal Sh kot objekt) Sh.Range ("A1") = Format (Zdaj, "dd-mmm-llllll hh: mm: ss") Končni pod

Čeprav to v večini primerov deluje odlično, bi se prikazala napaka, če namesto delovnega lista dodam list grafikona. Ker list grafikona nima celic, bi koda povzročila napako.

Če torej v tej kodi uporabim stavek 'On Error Resume Next', bo deloval po pričakovanjih z delovnimi listi in ne bo storil ničesar s listi z grafikoni.

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

Opomba: Naslednjo izjavo o nadaljevanju napake je najbolje uporabiti, če veste, na kakšne napake boste verjetno naleteli. In potem, če menite, da je teh napak varno prezreti, ga lahko uporabite.

To kodo lahko dvignete na naslednjo stopnjo, tako da analizirate, ali je prišlo do napake, in prikaže ustrezno sporočilo zanjo.

Spodnja koda bi prikazala polje s sporočilom, ki bi uporabnika obvestilo, da delovni list ni vstavljen.

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 "Izgleda, da ste vi vstavil list z grafikonom "& vbCrLf &" Napaka - "& Err. Opis Konec, če je konec Sub

"Err.Number" se uporablja za pridobitev številke napake, "Err.Description" pa za opis napake. Te bodo obravnavane kasneje v tej vadnici.

Pri napaki Pojdi na 0

'On Error GoTo 0' ustavi kodo v vrstici, ki povzroči napako, in prikaže polje s sporočilom, ki opisuje napako.

Preprosto povedano, omogoča privzeto preverjanje napak in prikaže privzeto sporočilo o napaki.

Zakaj bi ga potem sploh uporabljali?

Običajno vam ni treba uporabljati možnosti »On Error Goto 0«, vendar je lahko uporabna, če jo uporabljate skupaj z »On Error Resume Next«

Naj razložim!

Spodnja koda bi izbrala vse prazne celice v izboru.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Izberite End Sub

Če pa v izbranih celicah ni praznih celic, bi se prikazala napaka.

Da ne bi prikazali napake, lahko uporabite On Error Resume next '

Zdaj bo prikazala tudi napako, ko zaženete spodnjo kodo:

Sub SelectFormulaCells () On Error Nadaljuj naslednji izbor.SpecialCells (xlCellTypeBlanks). Izberite End Sub

Zaenkrat, tako dobro!

Težava nastane, ko obstaja del kode, kjer lahko pride do napake, in ker uporabljate 'On Error Resume Next', bi jo koda preprosto prezrla in se premaknila v naslednjo vrstico.

Na primer, v spodnji kodi ne bo nobenega poziva za napako:

Sub SelectFormulaCells () On Error Nadaljuj naslednji izbor.SpecialCells (xlCellTypeBlanks). Izberite '… več kode, ki lahko vsebuje napako End Sub

V zgornji kodi lahko pride do napake na dveh mestih. Prvo mesto izberemo vse prazne celice (z uporabo Selection.SpecialCells), drugo pa v preostali kodi.

Medtem ko je prva napaka pričakovana, vsaka napaka po njej ne.

Tu pomaga On Error Goto 0.

Ko ga uporabite, ponastavite nastavitev napake na privzeto, kjer bo začela prikazovati napake, ko bo naletela nanjo.

Na primer, v spodnji kodi ne bi prišlo do napake, če ni praznih celic, bi pa prišlo do napake zaradi '10/0 '

Sub SelectFormulaCells () On Error Nadaljuj Next Selection.SpecialCells (xlCellTypeBlanks). Izberite On Error GoTo 0 '… več kode, ki lahko vsebuje napako End Sub

Pri napaki Pojdi na [Oznaka]

Zgornji dve metodi - 'On Error Resume Next' in 'On Error Goto 0' - nam ne omogočata, da bi napako resnično obravnavali. Eden naredi, da koda prezre napako, drugi pa nadaljuje preverjanje napak.

On Error Go [Label] je način, s katerim lahko določite, kaj želite storiti, če pride do napake v vaši kodi.

Spodaj je struktura kode, ki uporablja ta rokovalnik napak:

Sub Test () On Error GoTo Label: X = 10 /0 "ta vrstica povzroča napako" … vaša preostala koda gre tukaj Exit Sub Label: "koda za obravnavo napake End Sub

Upoštevajte, da je pred napako pri obdelavi oznake »Exit Sub«. To zagotavlja, da se v primeru, da ni napak, pod izstopi in koda „Label“ ne izvede. Če ne uporabljate Exit Sub, bo vedno izvedel kodo "Label".

V spodnjem primeru kode, ko pride do napake, koda skoči in izvede kodo v razdelku za obdelavo (in prikaže polje s sporočilom).

Sub Errorhandler () On Error Pojdi ErrMsg X = 12 Y = 20 /0 Z = 30 Izhod iz Sub ErrMsg: MsgBox "Zdi se, da je napaka" & vbCrLf & Err.

Upoštevajte, da je koda prišlo do napake, koda je že zagnala in izvedla vrstice pred vrstico, ki je povzročila napako. V zgornjem primeru koda nastavi vrednost X na 12, ker pa se napaka pojavi v naslednji vrstici, ne nastavi vrednosti za Y in Z.

Ko koda skoči na kodo upravljalca napak (v tem primeru ErrMsg), bo nadaljevala z izvajanjem vseh vrstic v kodi za obdelavo napak in pod njo ter izstopila iz podmenije.

Pri napaki Pojdi na -1

Ta je nekoliko zapleten in v večini primerov tega verjetno ne boste uporabili.

Ampak vseeno bom to pokrival, saj sem se srečal s situacijo, ko je bilo to potrebno (ne upoštevajte in skočite na naslednji razdelek, če iščete samo osnove).

Preden se lotim mehanike, naj poskusim razložiti, kje je to lahko koristno.

Recimo, da imate kodo, pri kateri je prišlo do napake. Ampak vse je v redu, saj imate nameščen en obravnavalec napak. Kaj pa se zgodi, ko pride do druge napake v kodi za obdelavo napak (ja … nekoliko podobno filmu za začetek).

V takem primeru drugega upravljalnika ne morete uporabiti, saj prva napaka ni bila odpravljena. Torej, medtem ko ste obravnavali prvo napako, v spominu VBA še vedno obstaja. V pomnilniku VBA je prostora samo za eno napako - ne dve ali več.

V tem scenariju lahko uporabite On Error Goto -1.

Počisti napako in sprosti pomnilnik VBA za obravnavo naslednje napake.

Dovolj govora!

Naj zdaj razložim z uporabo primerov.

Recimo, da imam spodnjo kodo. To bo povzročilo napako, saj obstaja deljenje z ničlo.

Sub Erhandler () X = 12 Y = 20 /0 Z = 30 Konec pod

Zato za ravnanje uporabljam kodo za obdelavo napak (z imenom ErrMsg), kot je prikazano spodaj:

Sub Errorhandler () On Error Pojdi ErrMsg X = 12 Y = 20 /0 Z = 30 Izhod iz Sub ErrMsg: MsgBox "Zdi se, da je napaka" & vbCrLf & Err.

Zdaj je spet vse v redu. Takoj, ko pride do napake, se uporabi obravnavalec napak in prikaže polje s sporočilom, kot je prikazano spodaj.

Zdaj razširim kodo, tako da imam več kode v ali po upravljalniku napak.

Sub Errorhandler () On Error Pojdi ErrMsg X = 12 Y = 20 /0 Z = 30 Izhod iz Sub ErrMsg: MsgBox "Zdi se, da je napaka" & vbCrLf & Err.Opis A = 10 /2 B = 35 /0 End Sub

Ker je bila prva napaka obravnavana, druga pa ne, spet vidim napako, kot je prikazano spodaj.

Še vedno vse dobro. Koda se obnaša tako, kot smo pričakovali.

Za obravnavo druge napake uporabljam drugo orodje za obdelavo napak (ErrMsg2).

Sub Errorhandler () On Error Pojdi ErrMsg X = 12 Y = 20 /0 Z = 30 Izhod iz Sub ErrMsg: MsgBox "Zdi se, da je napaka" & vbCrLf & Err.Opis o napaki GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Zdi se, da je spet napaka" & vbCrLf & Err. Opis End Sub

In tukaj je to ne deluje po pričakovanjih.

Če zaženete zgornjo kodo, vam bo še vedno povzročila napako med izvajanjem, tudi če je nameščen drugi obravnavalec napak.

To se zgodi, saj prve napake nismo izbrisali iz pomnilnika VBA.

Ja, to smo rešili! A še vedno ostaja v spominu.

In ko VBA naleti na drugo napako, se še vedno zatakne pri prvi napaki, zato se drugi upravljavec napak ne uporablja. Koda se ustavi pri vrstici, ki je povzročila napako, in prikaže poziv za napako.

Če želite počistiti pomnilnik VBA in počistiti prejšnjo napako, morate uporabiti "On Error Goto -1".

Če torej dodate to vrstico v spodnjo kodo in jo zaženete, bo delovala po pričakovanjih.

Sub Errorhandler () On Napaka GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Izhod iz Sub ErrMsg: MsgBox "Zdi se, da je napaka" & vbCrLf & Err. / 2 B = 35 /0 Exit Sub ErrMsg2: MsgBox "Zdi se, da je spet napaka" & vbCrLf & Err.
Opomba: Napaka se samodejno odpravi, ko se podprogram konča.Torej, 'On Error Goto -1' je lahko uporaben, če dobite dve ali več kot dve napaki v isti podprogramu.

Objekt Err

Kadar koli pride do napake s kodo, se za podatke o napaki (na primer številko napake ali opis) uporabi predmet Err.

Err Lastnosti objekta

Objekt Err ima naslednje lastnosti:

Lastnina Opis
Številka Številka, ki predstavlja vrsto napake. Če ni napake, je ta vrednost 0
Opis Kratek opis napake
Vir Ime projekta, v katerem je prišlo do napake
HelpContext ID konteksta pomoči za napako v datoteki pomoči
Datoteka za pomoč Niz, ki predstavlja lokacijo mape in ime datoteke datoteke za pomoč

Čeprav vam v večini primerov ni treba uporabljati predmeta Err, je včasih lahko koristen pri obravnavi napak v Excelu.

Recimo, da imate nabor podatkov, kot je prikazano spodaj, in za vsako številko v izboru želite izračunati kvadratni koren v sosednji celici.

Spodnja koda lahko to stori, ker pa je v celici A5 besedilni niz, se takoj prikaže napaka.

Sub FindSqrRoot () Dim rng As Range Set rng = Izbor za vsako celico v celici rng. Offset (0, 1) .Value = Sqr (cell.Value) Naslednja celica End Sub

Težava s to vrsto sporočila o napaki je, da vam ne pove nič o tem, kaj je šlo narobe in kje je prišlo do težave.

S predmetom Err lahko ta sporočila o napakah naredite bolj smiselna.

Če na primer zdaj uporabim spodnjo kodo VBA, bo kodo ustavil takoj, ko pride do napake, in prikazal polje s sporočilom z naslovom celice celice, kjer je težava.

Sub FindSqrRoot () Dim rng As Range Set rng = Izbor za vsako celico In rng On Napaka Pojdi na ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Naslednja celica ErrHandler: MsgBox "Številka napake:" & Err .Number & vbCrLf & _ "Opis napake:" & Err.Description & vbCrLf & _ "Napaka pri:" & cell.Address End Sub

Zgornja koda bi vam dala veliko več informacij kot preprosta vrsta neskladja, zlasti naslov celice, tako da veste, kje je prišlo do napake.

To kodo lahko še dodatno izboljšate, da zagotovite, da se koda izvaja do konca (namesto da se zlomi pri vsaki napaki), nato pa vam prikaže seznam naslova celice, kjer se napaka pojavi.

Spodnja koda bi to naredila:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Izbor za vsako celico v celici rng. Offset (0, 1) .Varnost = Sqr (cell.Value) Če je Err.Number 0 Potem je ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next celica MsgBox "Napaka v naslednjih celicah" & ErrorCells Exit Sub End Sub

Zgornja koda deluje do konca in daje kvadratni koren vseh celic, ki vsebujejo številke (v sosednjem stolpcu). Nato prikaže sporočilo, ki navaja vse celice, kjer je prišlo do napake (kot je prikazano spodaj):

Err Object Methods

Čeprav so lastnosti Err uporabne za prikaz koristnih informacij o napakah, obstajata tudi dve metodi Err, ki vam lahko pomagata pri obravnavi napak.

Metoda Opis
Jasno Počisti vse nastavitve lastnosti predmeta Err
Dvignite Ustvari napako med izvajanjem

Hitro se naučimo, kaj so to in kako/zakaj jih uporabljati z VBA v Excelu.

Err Clear Method

Recimo, da imate nabor podatkov, kot je prikazano spodaj, in želite dobiti kvadratni koren vseh teh številk v sosednjem stolpcu.

Naslednja koda bo dobila kvadratne korenine vseh številk v sosednjem stolpcu in prikazala sporočilo, da je prišlo do napake v celicah A5 in A9 (saj imata v njih besedilo).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Izbor za vsako celico v celici rng. Offset (0, 1) .Varnost = Sqr (cell.Value) Če je Err.Number 0 Potem je ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next celica MsgBox "Napaka v naslednjih celicah" & ErrorCells End Sub

Upoštevajte, da sem uporabil metodo Err.Clear v stavku If Then.

Ko pride do napake in jo ujame pogoj If, metoda Err.Clear ponastavi številko napake nazaj na 0. To zagotavlja, da pogoj IF ujame napake samo za celice, kjer je dvignjena.

Če ne bi uporabil metode Err.Clear, bi bila, ko pride do napake, v stanju IF vedno res, številka napake pa ni bila ponastavljena.

Drug način za to je, da uporabite On Error Goto -1, ki napako popolnoma ponastavi.

Opomba: Err.Clear se razlikuje od On Error Goto -1. Err.Clear počisti samo opis napake in številko napake. ga ne ponastavi v celoti. To pomeni, da če je v isti kodi še en primerek napake, je ne boste mogli obravnavati, preden jo ponastavite (kar je mogoče storiti z "On Error Goto -1" in ne z "Err.Clear").

Metoda dviga Err

Metoda Err.Raise vam omogoča, da prikažete napako med izvajanjem.

Spodaj je sintaksa uporabe metode Err.Raise:

Err.Raise [število], [vir], [opis], [datoteka pomoči], [kontekst pomoči]

Vsi ti argumenti so neobvezni in jih lahko uporabite, da bo vaše sporočilo o napaki bolj smiselno.

Toda zakaj bi kdaj sami želeli prikazati napako?

Dobro vprašanje!

To metodo lahko uporabite, ko pride do napake (kar pomeni, da bo vseeno prišlo do napake), nato pa uporabite to metodo, da uporabniku poveste več o napaki (namesto manj koristnega sporočila o napaki, ki ga prikaže VBA privzeto).

Recimo, da imate nabor podatkov, kot je prikazano spodaj, in želite, da imajo vse celice samo številske vrednosti.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error Pojdi na ErrHandler za vsako celico v rng Če ni (IsNumeric (Cell.Value)) Nato Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Zgornja koda bi prikazala sporočilo o napaki z določenim opisom in kontekstno datoteko.

Osebno nikoli nisem uporabljal Err.Raise, saj večinoma delam samo z Excelom. Toda za nekoga, ki uporablja VBA za delo z Excelom skupaj z drugimi aplikacijami, kot so Outlook, Word ali PowerPoint, je to lahko koristno.

Tukaj je podroben članek o metodi Err.Raise, če želite izvedeti več.

Najboljše prakse ravnanja z napakami VBA

Ne glede na to, kako spretni ste pri pisanju kode VBA, bodo napake vedno del tega. Najboljši koderji so tisti, ki imajo veščine, kako pravilno odpraviti te napake.

Tukaj je nekaj najboljših praks, ki jih lahko uporabite pri obravnavi napak v Excelu VBA.

  1. Na začetku kode uporabite "On Error Go [Label]". Tako boste zagotovili odpravo morebitnih napak, ki se lahko pojavijo od tam.
  2. Uporabite "On Error Resume Next" SAMO, ko ste prepričani o napakah, ki se lahko pojavijo. Uporabljajte ga le s pričakovano napako. Če ga uporabite z nepričakovanimi napakami, ga preprosto prezre in se premakne naprej. Če želite naslednjo vrsto napake prezreti in uloviti preostalo, lahko uporabite možnost »V nadaljevanju nadaljevanja napake«.
  3. Ko uporabljate rokovalnike napak, se pred obdelavo prepričajte, da uporabljate Exit Sub. To bo zagotovilo, da se koda upravljalnika napak izvede le, če pride do napake (sicer bo vedno izvedena).
  4. Uporabite več obravnavalcev napak, da ujamete različne vrste napak. Večkratni upravljavec napak zagotavlja, da je napaka pravilno odpravljena. Na primer, napako »neusklajenost tipa« bi morali obravnavati drugače kot napako med izvajanjem »deljenje z 0«.

Upam, da vam je bil ta članek v Excelu koristen!

Tukaj je še nekaj vaj za Excel VBA, ki vam bodo morda všeč:

  • Podatkovni tipi Excel VBA - Popoln vodnik
  • Zanke VBA v Excelu - za naslednje, naredi medtem, naredi do, za vsako
  • Dogodki Excel VBA - enostaven (in popoln) vodnik
  • Urejevalnik Excel Visual Basic - Kako ga odpreti in uporabiti v Excelu

Vam bo pomagal razvoj spletnega mesta, ki si delijo stran s svojimi prijatelji

wave wave wave wave wave