Gestionarea erorilor Excel VBA - Tot ce trebuie să știți!

Indiferent cât de experimentat aveți în codarea VBA, erorile vor face întotdeauna parte din aceasta.

Diferența dintre un novice și un programator VBA expert este că programatorii experți știu cum să gestioneze și să utilizeze în mod eficient erorile.

În acest tutorial, vă voi arăta diferite moduri în care puteți utiliza pentru a gestiona în mod eficient erorile în Excel VBA.

Înainte de a intra în gestionarea erorilor VBA, să înțelegem mai întâi diferitele tipuri de erori pe care este posibil să le întâlniți atunci când programați în Excel VBA.

Tipuri de erori VBA în Excel

Există patru tipuri de erori în Excel VBA:

  1. Erori de sintaxă
  2. Erori de compilare
  3. Erori în timpul rulării
  4. Erori logice

Să înțelegem rapid care sunt aceste erori și când este posibil să le întâlniți.

Eroare de sintaxă

O eroare de sintaxă, așa cum sugerează și numele, apare atunci când VBA găsește ceva în neregulă cu sintaxa din cod.

De exemplu, dacă uitați o parte din instrucțiune / sintaxă care este necesară, atunci veți vedea eroarea de compilare.

În codul de mai jos, imediat ce apăs pe Enter după a doua linie, văd o eroare de compilare. Acest lucru se datorează faptului că Declarație IF trebuie să aibă „Apoi‘Comanda, care lipsește în codul de mai jos.

Notă: Când tastați un cod în Excel VBA, acesta verifică fiecare frază imediat ce ați apăsat Enter. Dacă VBA găsește ceva care lipsește în sintaxă, acesta afișează instantaneu un mesaj cu un text care vă poate ajuta să înțelegeți partea lipsă.

Pentru a vă asigura că vedeți eroarea de sintaxă ori de câte ori lipsește ceva, trebuie să vă asigurați că este activată verificarea autosintaxiei. Pentru a face acest lucru, faceți clic pe „Instrumente” și apoi faceți clic pe „Opțiuni”. În caseta de dialog cu opțiuni, asigurați-vă că opțiunea „Verificare sintaxă automată” este activată.

Dacă opțiunea „Auto Syntax Check” este dezactivată, VBA va evidenția în continuare linia cu eroarea de sintaxă în roșu, dar nu va afișa caseta de dialog de eroare.

Eroare la compilare

Erorile de compilare apar atunci când lipsește ceva care este necesar pentru a rula codul.

De exemplu, în codul de mai jos, imediat ce încerc să rulez codul, acesta va afișa următoarea eroare. Acest lucru se întâmplă întrucât am folosit instrucțiunea IF Then fără a o închide cu obligatoriu „Terminați dacă”.

O eroare de sintaxă este, de asemenea, un tip de eroare de compilare. O eroare de sintaxă apare imediat ce apăsați Enter și VBA identifică că lipsește ceva. O eroare de compilare poate apărea și atunci când VBA nu găsește nimic lipsă în timp ce tastați codul, dar se întâmplă atunci când codul este compilat sau executat.

VBA verifică fiecare linie în timp ce tastați codul și evidențiază eroarea de sintaxă imediat ce linia este incorectă și apăsați Enter. Erorile de compilare, pe de altă parte, sunt identificate numai atunci când întregul cod este analizat de VBA.

Mai jos sunt câteva scenarii în care veți întâlni eroarea de compilare:

  1. Utilizarea unei declarații IF fără IF IF
  2. Folosind instrucțiunea For cu Next
  3. Folosirea instrucțiunii Select fără a utiliza opțiunea End Select
  4. Nedeclararea variabilei (aceasta funcționează numai atunci când opțiunea Explicit este activată)
  5. Apelarea unei Sub / Funcții care nu există (sau cu parametri greșiți)
Notă despre „Opțiunea explicită”: Când adăugați „Option Explicit”, vi se va cere să declarați toate variabilele înainte de a rula codul. Dacă există o variabilă care nu a fost declarată, VBA ar afișa o eroare. Aceasta este o practică bună, deoarece arată o eroare în cazul în care aveți o variabilă ortografiată greșit. Puteți citi mai multe despre Option Explicit aici.

Erori de timp de rulare

Erorile de execuție sunt cele care apar atunci când codul rulează.

Erorile de timp de rulare vor apărea numai atunci când sunt luate în considerare toate erorile de sintaxă și compilare.

De exemplu, dacă rulați un cod care ar trebui să deschidă un registru de lucru Excel, dar acel registru de lucru nu este disponibil (fie șters, fie schimbat numele), codul dvs. vă va da o eroare de execuție.

Când apare o eroare de execuție, acesta va opri codul și vă va afișa caseta de dialog de eroare.

Mesajul din caseta de dialog Eroare în timpul rulării este puțin mai util. Încearcă să explice problema care vă poate ajuta să o corectați.

Dacă faceți clic pe butonul Depanare, acesta va evidenția partea din cod care duce la eroare.

Dacă ați corectat eroarea, puteți face clic pe butonul Executare din bara de instrumente (sau apăsați F5) pentru a continua să rulați codul de unde a plecat.

Sau puteți face clic și pe butonul End pentru a ieși din cod.

Important: În cazul în care faceți clic pe butonul End din caseta de dialog, acesta va opri codul la linia la care se întâlnește. Cu toate acestea, toate liniile de cod dinainte de aceasta ar fi fost executate.

Erori logice

Erorile logice nu vă vor opri codul, dar pot duce la rezultate greșite. Acestea ar putea fi, de asemenea, cele mai dificile tipuri de erori de depanat.

Aceste erori nu sunt evidențiate de compilator și trebuie abordate manual.

Un exemplu de eroare logică (cu care mă găsesc adesea blocat) se află într-o buclă nesfârșită.

Un alt exemplu ar putea fi atunci când dă un rezultat greșit. De exemplu, puteți ajunge să utilizați o variabilă greșită în cod sau să adăugați două variabile în care una este incorectă.

Există câteva moduri pe care le folosesc pentru a aborda erorile logice:

  1. Introduceți Caseta de mesaje într-un anumit loc din cod și evidențiați valorile / datele care vă pot ajuta să înțelegeți dacă tot ceea ce se întâmplă se așteaptă.
  2. În loc să rulați codul dintr-o dată, parcurgeți fiecare linie unul câte unul. Pentru a face acest lucru, faceți clic oriunde în cod și apăsați F8. ați observa că de fiecare dată când apăsați F8, se execută o linie. Acest lucru vă permite să parcurgeți codul rând pe rând și să identificați erorile logice.

Utilizarea depanării pentru a găsi erori de compilație / sintaxă

După ce ați terminat codul, este o practică bună să îl compilați mai întâi înainte de a rula.

Pentru a compila un cod, faceți clic pe opțiunea Debug din bara de instrumente și faceți clic pe Compile VBAProject.

Când compilați un proiect VBA, acesta trece prin cod și identifică erorile (dacă există).

În cazul în care găsește o eroare, vă va afișa o casetă de dialog cu eroarea. Acesta găsește erori unul câte unul. Deci, dacă găsește o eroare și ați corectat-o, trebuie să rulați compilarea din nou pentru a găsi alte erori (dacă există).

Când codul dvs. nu conține erori, opțiunea Compilați VBAProject va fi în gri.

Rețineți că Compilarea va găsi numai erori „Sintaxă” și erori „Compilare”. NU va găsi erorile de rulare.

Când scrieți cod VBA, nu doriți ca erorile să apară. Pentru a evita acest lucru, există multe metode de tratare a erorilor pe care le puteți utiliza.

În următoarele câteva secțiuni ale acestui articol, voi acoperi metodele pe care le puteți utiliza pentru gestionarea erorilor VBA în Excel.

Configurați setările de eroare (gestionate împotriva erorilor neprelucrate)

Înainte de a începe să lucrați cu codul dvs., trebuie să verificați o setare în Excel VBA.

Mergeți la bara de instrumente VBA și faceți clic pe Instrumente, apoi faceți clic pe Opțiuni.

În caseta de dialog Opțiuni, faceți clic pe fila General și asigurați-vă că, în cadrul grupului „Eroare de captare”, este bifată „Întreruperea erorilor nereglate”.

Permiteți-mi să explic cele trei opțiuni:

  1. Păstrează toate erorile: Aceasta vă va opri codul pentru toate tipurile de erori, chiar și atunci când ați folosit tehnicile pentru a gestiona aceste erori.
  2. Modul Break in Class: Aceasta vă va opri codul pentru toate erorile care nu au fost tratate și, în același timp, dacă utilizați obiecte precum Userforms, se va rupe și în acele obiecte și va evidenția linia exactă care cauzează eroarea.
  3. Descărcați erorile nesoluționate: Aceasta vă va opri codul numai pentru acele erori care nu sunt tratate. Aceasta este setarea implicită, deoarece vă asigură că orice erori nesoluționate sunt aduse la cunoștință. Dacă utilizați obiecte precum Userforms, aceasta nu va evidenția linia care provoacă eroarea în obiect, ci va evidenția doar linia care se referă la acel obiect.
Notă: Dacă lucrați cu obiecte precum Userforms, puteți schimba această setare la „Break on Class Modules”. Diferența dintre # 2 și # 3 este că atunci când utilizați modulul Break in Class, vă va duce la linia specifică din obiectul care cauzează eroarea. Puteți alege, de asemenea, să mergeți cu acest lucru în loc de „Păstrați erorile nesoluționate”.

Așadar, pe scurt - dacă tocmai începeți cu Excel VBA, asigurați-vă că este bifată opțiunea „Pauză la erori nesolicitate”.

Tratarea erorilor VBA cu declarațiile „On Error”

Când codul dvs. întâmpină o eroare, puteți face câteva lucruri:

  1. Ignorați eroarea și lăsați codul să continue
  2. Aveți la dispoziție un cod de gestionare a erorilor și executați-l atunci când apare o eroare

Ambele metode de tratare a erorilor se asigură că utilizatorul final nu va putea vedea o eroare.

Există câteva declarații „On Error” pe care le puteți utiliza pentru a le face.

La eroare Reluați în continuare

Când utilizați „On Error Resume Next” în cod, orice eroare întâlnită va fi ignorată și codul va continua să ruleze.

Această metodă de tratare a erorilor este utilizată destul de des, dar trebuie să fii precaut atunci când îl folosești. Deoarece ignoră complet orice eroare care poate apărea, este posibil să nu puteți identifica erorile care trebuie corectate.

De exemplu, dacă codul de mai jos este rulat, acesta va returna o eroare.

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

Acest lucru se întâmplă deoarece nu puteți împărți un număr la zero.

Dar dacă folosesc declarația „On Error Resume Next” în acest cod (așa cum se arată mai jos), va ignora eroarea și nu voi ști că există o problemă care trebuie corectată.

Sub AssignValues ​​() La eroare Reîncepeți Următorul x = 20/4 y = 30/0 Finalizați sub

On Error Resume Next trebuie utilizat numai atunci când știți în mod clar tipul de erori pe care se așteaptă să le arunce codul VBA și este bine să îl ignorați.

De exemplu, mai jos este codul evenimentului VBA care ar adăuga instantaneu valoarea datei și orei în celula A1 a unei foi introduse recent (acest cod este adăugat în foaia de lucru și nu într-un modul).

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Acum, "dd-mmm-aaaa hh: mm: ss") End Sub

Deși acest lucru funcționează excelent în majoritatea cazurilor, ar arăta o eroare dacă aș adăuga o foaie de diagramă în loc de o foaie de lucru. Deoarece o foaie de diagramă nu are celule, codul ar genera o eroare.

Deci, dacă folosesc declarația „On Error Resume Next” din acest cod, va funcționa așa cum era de așteptat cu foile de lucru și nu va face nimic cu foile de diagrame.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Reîncepeți următorul Sh.Range ("A1") = Format (Acum, "dd-mmm-aaaa hh: mm: ss") End Sub

Notă: La eroare, reluați următoarea declarație este cel mai bine utilizat atunci când știți ce tip de erori este posibil să întâlniți. Și apoi, dacă credeți că este sigur să ignorați aceste erori, îl puteți folosi.

Puteți duce acest cod la nivelul următor analizând dacă a existat o eroare și afișând un mesaj relevant pentru acesta.

Codul de mai jos va afișa o casetă de mesaj care ar informa utilizatorul că nu a fost inserată o foaie de lucru.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Acum, "dd-mmm-aaaa hh: mm: ss") Dacă Err.Number 0 Atunci MsgBox "Arată ca tine a introdus o foaie grafică "& vbCrLf &" Eroare - "& Err.Descriere Sfârșit Dacă Sfârșit Sub

„Err.Number” este utilizat pentru a obține numărul de eroare și „Err.Description” este utilizat pentru a obține descrierea erorii. Acestea vor fi tratate mai târziu în acest tutorial.

La eroare GoTo 0

„On Error GoTo 0” va opri codul de pe linia care provoacă eroarea și afișează o casetă de mesaj care descrie eroarea.

În termeni simpli, activează comportamentul implicit de verificare a erorilor și afișează mesajul de eroare implicit.

Atunci de ce chiar să-l folosești?

În mod normal, nu este necesar să utilizați „On Error Goto 0”, dar poate fi util atunci când îl utilizați împreună cu „On Error Resume Next”

Lasă-mă să explic!

Codul de mai jos ar selecta toate celulele goale din selecție.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Selectați End Sub

Dar ar arăta o eroare atunci când nu există celule goale în celulele selectate.

Deci, pentru a evita afișarea erorii, puteți utiliza On Error Resume (Continuare eroare următoare)

Acum, va afișa orice eroare atunci când rulați codul de mai jos:

Sub SelectFormulaCells () la eroare Reluați următoarea selecție. SpecialCells (xlCellTypeBlanks). Selectați End Sub

Până acum, bine!

Problema apare atunci când există o parte a codului în care poate apărea o eroare și, din moment ce utilizați „On Error Resume Next”, codul îl va ignora pur și simplu și va trece la următoarea linie.

De exemplu, în codul de mai jos, nu ar exista nicio solicitare de eroare:

Sub SelectFormulaCells () La eroare Reîncepeți următoarea selecție.SpecialCells (xlCellTypeBlanks). Selectați „… mai multe coduri care pot conține erori End Sub

În codul de mai sus, există două locuri în care poate apărea o eroare. Primul loc este locul în care selectăm toate celulele goale (folosind Selection.SpecialCells), iar al doilea este în codul rămas.

În timp ce prima eroare este de așteptat, orice eroare ulterioară nu este.

Aici vine On Error Goto 0 pentru salvare.

Când îl utilizați, resetați setarea de eroare la valoarea implicită, unde va începe să afișeze erori atunci când o întâlnește.

De exemplu, în codul de mai jos, nu ar exista nicio eroare în cazul în care nu există celule goale, dar ar exista un mesaj de eroare din cauza „10/0 ′

Sub SelectFormulaCells () On Error Reîncepeți următoarea selecție.SpecialCells (xlCellTypeBlanks). Selectați On Error GoTo 0 '… mai multe coduri care pot conține erori End Sub

On Error Goto [Label]

Cele două metode de mai sus - „On Error Resume Next” și „On Error Goto 0” - nu ne permit să gestionăm cu adevărat eroarea. Unul face ca codul să ignore eroarea, iar al doilea să reia verificarea erorilor.

On Error Go [Label] este o modalitate prin care puteți specifica ce doriți să faceți în cazul în care codul dvs. are o eroare.

Mai jos este structura de cod care utilizează acest instrument de gestionare a erorilor:

Sub Test () La eroare GoTo Label: X = 10/0 'această linie provoacă o eroare' …. codul tău rămas merge aici Exit Sub Label: 'cod pentru a gestiona eroarea End Sub

Rețineți că, înainte de eroarea care gestionează „Eticheta”, există un Exit Sub. Acest lucru asigură că, în cazul în care nu există erori, sub-ul este ieșit și codul „Etichetă” nu este executat. În cazul în care nu utilizați Exit Sub, acesta va executa întotdeauna codul „Label”.

În exemplul de cod de mai jos, când apare o eroare, codul sare și execută codul în secțiunea de gestionare (și afișează o casetă de mesaje).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Se pare că există o eroare" & vbCrLf & Err.Description End Sub

Rețineți că atunci când apare o eroare, codul a rulat deja și a executat liniile înainte de linia care a cauzat eroarea. În exemplul de mai sus, codul setează valoarea lui X ca 12, dar din moment ce eroarea apare în linia următoare, nu stabilește valorile pentru Y și Z.

Odată ce codul sare la codul de gestionare a erorilor (ErrMsg în acest exemplu), va continua să execute toate liniile din și sub codul de gestionare a erorilor și să părăsească sub-ul.

La Eroare Goto -1

Acesta este un pic complicat și, în majoritatea cazurilor, este puțin probabil să îl utilizați.

Dar voi acoperi în continuare acest lucru, deoarece m-am confruntat cu o situație în care era necesar acest lucru (nu ezitați să ignorați și să treceți la următoarea secțiune dacă căutați doar elementele de bază).

Înainte de a intra în mecanica acestuia, permiteți-mi să încerc să explic unde poate fi util.

Să presupunem că aveți un cod în care se întâlnește o eroare. Dar totul este bun, deoarece aveți un singur instrument de gestionare a erorilor. Dar ce se întâmplă când există o altă eroare în codul de gestionare a erorilor (da … oarecum ca filmul de început).

Într-un astfel de caz, nu puteți utiliza al doilea handler deoarece prima eroare nu a fost eliminată. Deci, în timp ce ați gestionat prima eroare, în memoria VBA există încă. Și memoria VBA are loc doar pentru o eroare - nu două sau mai mult decât atât.

În acest scenariu, puteți utiliza On Error Goto -1.

Șterge eroarea și eliberează memoria VBA pentru a gestiona următoarea eroare.

Destul de vorbit!

Să explic acum folosind exemple.

Să presupunem că am codul de mai jos. Aceasta va arunca o eroare deoarece există diviziune la zero.

Sub Errorhandler () X = 12 Y = 20/0 Z = 30 End Sub

Deci, pentru a-l gestiona, folosesc un cod de gestionare a erorilor (cu numele ErrMsg) așa cum se arată mai jos:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Se pare că există o eroare" & vbCrLf & Err.Description End Sub

Totul este bine acum din nou. De îndată ce apare eroarea, se folosește gestionarul de erori și afișează o casetă de mesaj așa cum se arată mai jos.

Acum, extind codul astfel încât să am mai mult cod în sau după gestionarea erorilor.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Se pare că există o eroare" & vbCrLf & Err.Descriere A = 10/2 B = 35/0 End Sub

Deoarece prima eroare a fost tratată, dar a doua nu a fost, văd din nou o eroare așa cum se arată mai jos.

Totul este bine. Codul se comportă așa cum ne-am așteptat.

Deci, pentru a gestiona a doua eroare, folosesc un alt gestionar de erori (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Se pare că există o eroare" & vbCrLf & Err.Descriere On Error GoTo ErrMsg2 A = 10/2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Se pare că există o eroare din nou" & vbCrLf & Err.Description End Sub

Și aici este locul nu funcționează așa cum era de așteptat.

Dacă rulați codul de mai sus, acesta vă va oferi totuși o eroare în timpul rulării, chiar și după ce a avut loc cel de-al doilea handler de eroare.

Acest lucru se întâmplă deoarece nu am eliminat prima eroare din memoria VBA.

Da, ne-am descurcat! Dar rămâne în memorie.

Și când VBA întâlnește o altă eroare, este încă blocat cu prima eroare și, prin urmare, nu este utilizat al doilea gestionar de erori. Codul se oprește la linia care a provocat eroarea și afișează solicitarea de eroare.

Pentru a șterge memoria VBA și a șterge eroarea anterioară, trebuie să utilizați „On Error Goto -1”.

Deci, dacă adăugați această linie în codul de mai jos și o rulați, aceasta va funcționa conform așteptărilor.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Se pare că există o eroare" & vbCrLf & Err.Descriere On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35/0 Exit Sub ErrMsg2: MsgBox "Se pare că există o eroare din nou" & vbCrLf & Err.Descriere End Sub
Notă: Eroarea se elimină automat la sfârșitul unui subrutină.Deci, „On Error Goto -1” poate fi util atunci când primiți două sau mai mult de două erori în același subprogram.

Obiectul Err

Ori de câte ori apare o eroare cu un cod, obiectul Err este folosit pentru a obține detalii despre eroare (cum ar fi numărul erorii sau descrierea).

Proprietățile obiectului Err

Obiectul Err are următoarele proprietăți:

Proprietate Descriere
Număr Un număr care reprezintă tipul de eroare. Când nu există nicio eroare, această valoare este 0
Descriere O scurtă descriere a erorii
Sursă Numele proiectului în care a apărut eroarea
HelpContext ID-ul contextului de ajutor pentru eroarea din fișierul de ajutor
HelpFile Un șir care reprezintă locația folderului și numele fișierului fișierului de ajutor

În timp ce, în majoritatea cazurilor, nu este nevoie să utilizați obiectul Err, uneori poate fi util în timp ce gestionați erorile în Excel.

De exemplu, să presupunem că aveți un set de date așa cum se arată mai jos și pentru fiecare număr, în selecție, doriți să calculați rădăcina pătrată din celula adiacentă.

Codul de mai jos îl poate face, dar din moment ce există un șir de text în celula A5, acesta arată o eroare de îndată ce apare acest lucru.

Sub FindSqrRoot () Dim rng As Range Set rng = Selecție pentru fiecare celulă În rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Celula următoare End Sub

Problema cu acest tip de mesaj de eroare este că nu vă oferă nimic despre ceea ce a greșit și unde a apărut problema.

Puteți utiliza obiectul Err pentru a face aceste mesaje de eroare mai semnificative.

De exemplu, dacă folosesc acum codul VBA de mai jos, acesta va opri codul imediat ce apare eroarea și va afișa o casetă de mesaj cu adresa celulei celulei în care există o problemă.

Sub FindSqrRoot () Dim rng As Range Set rng = Selection for Each cell In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Următoarea celulă ErrHandler: MsgBox "Error Number:" & Err .Number & vbCrLf & _ "Descriere eroare:" & Err.Description & vbCrLf & _ "Eroare la:" & cell.Address End Sub

Codul de mai sus vă va oferi mult mai multe informații decât simplul „Tip necorespunzător”, în special adresa celulei, astfel încât să știți unde a apărut eroarea.

Puteți rafina în continuare acest cod pentru a vă asigura că codul dvs. rulează până la sfârșit (în loc să se rupă la fiecare eroare) și apoi vă oferă o listă cu adresa celulei unde apare eroarea.

Codul de mai jos ar face acest lucru:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection for Each cell In 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 cell MsgBox "Error in the following cells" & ErrorCells Exit Sub End Sub

Codul de mai sus rulează până la sfârșit și dă rădăcina pătrată a tuturor celulelor care au numere în el (în coloana alăturată). Apoi afișează un mesaj care listează toate celulele în care a apărut o eroare (așa cum se arată mai jos):

Metode de obiecte Err

În timp ce proprietățile Err sunt utile pentru a afișa informații utile despre erori, există și două metode Err care vă pot ajuta cu gestionarea erorilor.

Metodă Descriere
clar Șterge toate setările de proprietate ale obiectului Err
A ridica Generează o eroare de execuție

Să aflăm rapid ce sunt acestea și cum / de ce să le folosim cu VBA în Excel.

Metoda de ștergere a erorilor

Să presupunem că aveți un set de date așa cum se arată mai jos și doriți să obțineți rădăcina pătrată a tuturor acestor numere în coloana alăturată.

Următorul cod va obține rădăcinile pătrate ale tuturor numerelor din coloana alăturată și va afișa un mesaj că a apărut o eroare pentru celulele A5 și A9 (deoarece acestea au text în ea).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection for Each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End Dacă celula următoare MsgBox "Eroare în următoarele celule" & ErrorCells End Sub

Rețineți că am folosit metoda Err.Clear în instrucțiunea If Then.

Odată ce a apărut o eroare și a fost blocată de condiția If, metoda Err.Clear resetează numărul de eroare la 0. Acest lucru asigură faptul că condiția IF captează numai erorile pentru celulele în care este ridicată.

Dacă nu aș fi folosit metoda Err.Clear, odată ce apare eroarea, aceasta ar fi întotdeauna adevărată în condiția IF, iar numărul erorii nu a fost resetat.

Un alt mod de a face acest lucru este folosind On Error Goto -1, care resetează complet eroarea.

Notă: Err.Clear este diferit de On Error Goto -1. Err.Clear șterge doar descrierea erorii și numărul erorii. nu îl resetează complet. Aceasta înseamnă că, dacă există o altă instanță de eroare în același cod, nu veți putea să o gestionați înainte de a o reseta (ceea ce se poate face cu „On Error Goto -1” și nu cu „Err.Clear”).

Metoda de creștere a erorilor

Metoda Err.Raise vă permite să ridicați o eroare de execuție.

Mai jos este sintaxa utilizării metodei Err.Raise:

Err.Raise [număr], [sursă], [descriere], [fișier de ajutor], [ajutorcontext]

Toate aceste argumente sunt opționale și le puteți utiliza pentru a face mesajul de eroare mai semnificativ.

Dar de ce ai vrea vreodată să ridici singur o eroare?

Buna intrebare!

Puteți utiliza această metodă atunci când există o instanță a unei erori (ceea ce înseamnă că oricum se întâmplă o eroare) și apoi utilizați această metodă pentru a spune utilizatorului mai multe despre eroare (în loc de mesajul de eroare mai puțin util pe care îl afișează VBA în mod implicit).

De exemplu, să presupunem că aveți un set de date așa cum se arată mai jos și doriți ca toate celulele să aibă numai valori numerice.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler For Each Cell in rng If Not (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Termină dacă următoarea celulă ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

Codul de mai sus ar afișa un mesaj de eroare care are descrierea specificată și fișierul context.

Personal, nu am folosit niciodată Err.Raise deoarece lucrez mai ales numai cu Excel. Dar pentru cineva care folosește VBA pentru a lucra cu Excel împreună cu alte aplicații precum Outlook, Word sau PowerPoint, acest lucru poate fi util.

Iată un articol detaliat despre metoda Err.Raise în cazul în care doriți să aflați mai multe.

Cele mai bune practici de gestionare a erorilor VBA

Indiferent cât de calificat obțineți un cod VBA de scriere, erorile vor face întotdeauna parte din acesta. Cei mai buni programatori sunt cei care au abilitățile de a gestiona corect aceste erori.

Iată câteva dintre cele mai bune practici pe care le puteți utiliza atunci când vine vorba de gestionarea erorilor în Excel VBA.

  1. Utilizați „On Error Go [Label]” la începutul codului. Acest lucru se va asigura că orice eroare care se poate întâmpla de acolo este tratată.
  2. Folosiți „On Error Resume Next” NUMAI când sunteți sigur de erorile care pot apărea. Folosiți-l numai cu eroarea așteptată. În cazul în care îl utilizați cu erori neașteptate, acesta îl va ignora pur și simplu și va merge mai departe. Puteți utiliza „On Error Resume Next” cu „Err.Raise” dacă doriți să ignorați un anumit tip de eroare și să prindeți restul.
  3. Când utilizați gestionare de erori, asigurați-vă că utilizați Exit Sub înainte de gestionare. Acest lucru vă va asigura că codul de gestionare a erorilor este executat numai atunci când există o eroare (altfel va fi întotdeauna executat).
  4. Utilizați mai multe gestionare de erori pentru a prinde diferite tipuri de erori. Având mai multe gestionare a erorilor, se asigură că o eroare este corectă. De exemplu, ați dori să gestionați o eroare „nepotrivire de tip” diferit de o eroare în timp de execuție „Divizare la 0”.

Sper că ați găsit util acest articol Excel!

Iată câteva tutoriale Excel VBA care vă pot plăcea:

  • Tipuri de date Excel VBA - Un ghid complet
  • Bucle VBA Excel - Pentru Următorul, Faceți În timp, Faceți până, Pentru fiecare
  • Evenimente Excel VBA - Un ghid ușor (și complet)
  • Excel Visual Basic Editor - Cum îl puteți deschide și utiliza în Excel

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave