VBA On Error - Cele mai bune practici de gestionare a erorilor

Foaie de trișare a erorilor VBA

Erori

DescriereCodul VBAOn Error - Opriți codul și afișați eroareaLa Eroare Goto 0On Error - Omiteți eroarea și continuați să rulațiLa eroare Reluați în continuareOn Error - Accesați o linie de cod [Etichetă]On Error Goto [Label]Eroare de ștergere (resetare)La eroare GoTo -1Afișați numărul de eroareMsgBox Err.NumberAfișează descrierea eroriiMsgBox Err. DescriereFuncția de a genera propria eroareErr.Ridică

Vedeți mai multe „Foi de cheat” VBA și descărcări PDF gratuite

Tratarea erorilor VBA

Tratarea erorilor VBA se referă la procesul de anticipare, detectare și rezolvare a erorilor VBA Runtime. Procesul de gestionare a erorilor VBA are loc la scrierea codului, înainte să apară efectiv erori.

VBA Runtime Erori sunt erori care apar în timpul executării codului. Exemple de erori în timpul rulării includ:

  • Referirea la un registru de lucru, foaie de lucru sau alt obiect inexistent
  • Date nevalide ex. referindu-se la o celulă Excel care conține o eroare
  • Încercarea de a împărți la zero

Declarație de eroare VBA

Majoritatea gestionării erorilor VBA se face cu Declarație de eroare. Declarația On Error spune VBA ce trebuie să facă dacă întâmpină o eroare. Se află trei În declarațiile de eroare:

  • La eroare GoTo 0
  • La eroare Reluați în continuare
  • La eroare GoTo Linia

La eroare GoTo 0

La eroare GoTo 0 este setarea implicită a VBA. Puteți restabili această setare implicită adăugând următoarea linie de cod:

1 La eroare GoTo 0

Când apare o eroare cu La eroare GoTo 0, VBA va opri executarea codului și va afișa caseta sa de mesaje de eroare standard.

Adesea veți adăuga un La eroare GoTo 0 după adăugare La eroare Reluați în continuare tratarea erorilor (secțiunea următoare):

123456789 Sub ErrorGoTo0 ()La eroare Reluați în continuareActiveSheet.Shapes („Start_Button”). ȘtergețiLa eroare GoTo 0„Rulați mai multe coduriSfârșitul Sub

La eroare Reluați în continuare

La eroare Reluați în continuare îi spune lui VBA să sări peste orice linie de cod care conține erori și să treacă la următoarea linie.

1 La eroare Reluați în continuare

Notă: La eroare Reluați în continuare nu remediază o eroare sau nu o rezolvă în alt mod. Pur și simplu îi spune VBA să continue ca și cum linia de cod care conține eroarea nu ar exista. Utilizarea necorespunzătoare a La eroare Reluați în continuare poate duce la consecințe neintenționate.

Un moment minunat de folosit La eroare Reluați în continuare este atunci când se lucrează cu obiecte care pot sau nu să existe. De exemplu, doriți să scrieți un cod care va șterge o formă, dar dacă rulați codul când forma este deja ștearsă, VBA va arunca o eroare. În schimb, puteți utiliza La eroare Reluați în continuare pentru a spune VBA să șteargă forma dacă există.

123 La eroare Reluați în continuareActiveSheet.Shapes („Start_Button”). ȘtergețiLa eroare GoTo 0

Observați că am adăugat La eroare GoTo 0 după linia de cod care conține eroarea potențială. Aceasta resetează gestionarea erorilor.

În secțiunea următoare vă vom arăta cum să testați dacă a apărut o eroare folosind Err.Number, oferindu-vă opțiuni mai avansate de gestionare a erorilor …

Err.Number, Err.Clear și erori de captare

În loc de a trece peste o linie care conține o eroare, putem prinde eroarea folosind La eroare Reluați în continuare și Err.Number.

Err.Number returnează un număr de eroare corespunzător tipului de eroare detectat. Dacă nu există nicio eroare, Err.Number = 0.

De exemplu, această procedură va returna „11” deoarece eroarea care apare este Eroare în timpul rulării „11”.

1234567 Sub ErrorNumber_ex ()La eroare Reluați în continuareActiveCell.Value = 2/0MsgBox Err.NumberSfârșitul Sub

Tratarea erorilor cu Err.Number

Adevărata putere a Err.Number constă în capacitatea de a detecta dacă a apărut o eroare (Err.Number 0). În exemplul de mai jos, am creat o funcție care va testa dacă există o foaie utilizând Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist („test”)Sfârșitul SubFuncția DoesWSExist (wsName As String) ca BooleanDim ws Ca foaie de lucruLa eroare Reluați în continuareSet ws = Sheets (wsName)„Dacă eroarea WS nu existăDacă Err.Number 0 AtunciDoesWSExist = FalseAltfelDoesWSExist = AdevăratEnd IfLa eroare GoTo -1Funcția de sfârșit

Notă: am adăugat un La eroare GoTo -1 până la sfârșitul care resetează Err.Number la 0 (vezi două secțiuni în jos).

Cu La eroare Reluați în continuare și Err.Number, puteți replica fișierul "Încearcă să prinzi" funcționalitatea altor limbaje de programare.

La eroare GoTo Linia

La eroare GoTo Linia îi spune VBA să „du-te la” o linie de cod etichetată atunci când se întâlnește o eroare. Declarați declarația Go To astfel (unde errHandler este eticheta de linie la care mergeți):

1 On Error GoTo errHandler

și creați o etichetă de linie ca aceasta:

1 errHandler:

Notă: Aceasta este aceeași etichetă pe care ați utiliza-o cu o declarație obișnuită VBA GoTo.

Mai jos vom demonstra folosind La eroare GoTo Linia pentru a ieși dintr-o procedură.

On Error Exit Sub

Puteți utiliza On Error GoTo Line pentru a ieși dintr-un sub atunci când apare o eroare.

Puteți face acest lucru plasând eticheta liniei de gestionare a erorilor la sfârșitul procedurii:

12345678 Sub ErrGoToEnd ()On Error GoTo endProc- Un codendProc:Sfârșitul Sub

sau folosind comanda Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()On Error GoTo endProc- Un codGoTo skipExitendProc:Ieșiți din SubskipExit:- Mai mult codSfârșitul Sub

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

După ce se tratează o eroare, trebuie să ștergeți în general eroarea pentru a preveni problemele viitoare cu gestionarea erorilor.

După apariția unei erori, ambii Err.Clar și La eroare GoTo -1 poate fi folosit pentru a reseta Err.Number la 0. Dar există o diferență foarte importantă: Err.Clar nu resetează eroarea propriu-zisă, ci doar resetează Err.Number.

Ce înseamnă asta? FolosindErr.Clar, nu veți putea modifica setarea de gestionare a erorilor. Pentru a vedea diferența, testați acest cod și înlocuiți-l La eroare GoTo -1 cu Err.Clar:

123456789101112131415161718192021 Sub ErrExamples ()On Error GoTo errHandler:'Eroare „definită de aplicație”Eroare (13)Ieșiți din SuberrHandler:„Ștergeți eroareaLa eroare GoTo -1On Error GoTo errHandler2:Eroare „Tip de nepotrivire”Eroare (1034)Ieșiți din SuberrHandler2:Debug.Print Err.DescriptionSfârșitul Sub

De obicei, recomand să folosiți întotdeauna La eroare GoTo -1, cu excepția cazului în care aveți un motiv întemeiat de utilizare Err.Clar in schimb.

VBA On Error MsgBox

De asemenea, este posibil să doriți să afișați o casetă de mesaje în caz de eroare. Acest exemplu va afișa diferite casete de mesaj în funcție de locul în care apare eroarea:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg As StringOn Error GoTo errHandler„Etapa 1errMsg = "A apărut o eroare în timpul etapei Copiere și lipire."'Err.Raise (11)„Etapa 2errMsg = "A apărut o eroare în timpul etapei de validare a datelor."'Err.Raise (11)„Etapa 3errMsg = "A apărut o eroare în timpul etapei P&L-Building și Copy-Over."Err.Raise (11)„Etapa 4errMsg = "A apărut o eroare la încercarea de înregistrare a importului pe pagina de configurare"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Sfârșitul Sub

Aici ați înlocui Err.Raise (11) cu codul dvs. real.

VBA IsError

O altă modalitate de a gestiona erorile este să le testați cu funcția VBA IsError. Funcția IsError testează o expresie pentru erori, returnând TRUE sau FALSE dacă apare o eroare.

123 Sub IsErrorEx ()MsgBox IsError (Range ("a7"). Valoare)Sfârșitul Sub

Dacă Eroare VBA

De asemenea, puteți gestiona erorile în VBA cu funcția Excel IfError. Funcția IfError trebuie accesată utilizând Foaie de lucru Clasa de funcții:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Range ("a10"). Valoare, 0)MsgBox nSfârșitul Sub

Aceasta va afișa valoarea Gama A10, dacă valoarea este o eroare, va genera în schimb 0.

Tipuri de erori VBA

Erori de rulare

După cum sa menționat mai sus:

VBA Runtime Erori sunt erori care apar în timpul executării codului. Exemple de erori în timpul rulării includ:

  • Referirea la un registru de lucru, foaie de lucru sau alt obiect inexistent
  • Date nevalide ex. referindu-se la o celulă Excel care conține o eroare
  • Încercarea de a împărți la zero

Puteți „gestiona erorile” erorilor de rulare folosind metodele discutate mai sus.

Erori de sintaxă

Erori de sintaxă VBA sunt erori la scrierea codului. Exemple de erori de sintaxă includ:

  • Mispelling
  • Punctuație lipsă sau incorectă

Editorul VBA identifică multe erori de sintaxă cu evidențierea roșie:

Editorul VBA are, de asemenea, o opțiune pentru „Auto Syntax Check”:

Când acest lucru este bifat, Editorul VBA va genera o casetă de mesaj care vă avertizează erorile de sintaxă după ce ați introdus o linie de cod:

Personal, mi se pare extrem de enervant și dezactivez funcția.

Compilați erorile

Înainte de a încerca să ruleze o procedură, VBA va „compila” procedura. Compilarea transformă programul din codul sursă (pe care îl puteți vedea) în formă executabilă (nu puteți vedea).

Erori de compilare VBA sunt erori care împiedică compilarea codului.

Un bun exemplu de eroare de compilare este o declarație de variabilă lipsă:

Alte exemple includ:

  • Pentru fără Următorul
  • Selectați fără Selectare sfârșit
  • Dacă fără End If
  • Apelarea unui procedură asta nu există

Erorile de sintaxă (secțiunea anterioară) sunt un subset de erori de compilare.

Depanare> Compilare

Erorile de compilare vor apărea atunci când încercați să rulați o procedură. Dar, în mod ideal, ați identifica erorile de compilare înainte de a încerca să rulați procedura.

Puteți face acest lucru compilând proiectul din timp. Pentru a face acest lucru, mergeți la Depanare> Compilați proiectul VBA.

Compilatorul va „merge la” prima eroare. După ce remediați acea eroare, compilați din nou proiectul. Repetați până când toate erorile sunt remediate.

Puteți spune că toate erorile sunt remediate deoarece Compilați proiectul VBA va fi gri:

Eroare OverFlow

The Eroare VBA OverFlow apare atunci când încercați să puneți o valoare într-o variabilă care este prea mare. De exemplu, Variabile întregi poate conține numai valori cuprinse între -32.768 și 32.768. Dacă introduceți o valoare mai mare, veți primi o eroare de depășire:

În schimb, ar trebui să utilizați Variabilă lungă pentru a stoca numărul mai mare.

Alți termeni de eroare VBA

Eroare de captură VBA

Spre deosebire de alte limbaje de programare, în VBA nu există Declarație de captură. Cu toate acestea, puteți replica o declarație de captură folosind La eroare Reluați în continuare și Dacă Err.Number 0 Atunci. Acest lucru este acoperit mai sus în Tratarea erorilor cu Err.Number.

VBA Ignore Error

Pentru a ignora erorile din VBA, pur și simplu utilizați La eroare Reluați în continuare afirmație:

1 La eroare Reluați în continuare

Cu toate acestea, așa cum s-a menționat mai sus, ar trebui să aveți grijă să utilizați această afirmație, deoarece nu remediază o eroare, pur și simplu ignoră linia de cod care conține eroarea.

VBA Throw Error / Err.Raise

Pentru a trece printr-o eroare în VBA, utilizați Err.Ridică metodă.

Această linie de cod va crește eroarea de rulare „13”: necorespundere tip:

1 Err.Raise (13)

VBA Error Trapping

VBA Error Trapping este doar un alt termen pentru VBA Error Handling.

Mesaj de eroare VBA

A Mesaj de eroare VBA arata asa:

Când faceți clic pe „Depanare”, veți vedea linia de cod care generează eroarea:

Tratarea erorilor VBA într-o buclă

Cel mai bun mod de a gestiona erorile într-un Loop este prin utilizarea La eroare Reluați în continuare împreună cu Err.Number pentru a detecta dacă a apărut o eroare (nu uitați să utilizați Err.Clar pentru a șterge eroarea după fiecare apariție).

Exemplul de mai jos va împărți două numere (Coloana A la Coloana B) și va afișa rezultatul în Coloana C. Dacă există o eroare, rezultatul va fi 0.

12345678910111213141516 Subtest ()Dim celula ca intervalLa eroare Reluați în continuarePentru fiecare celulă din interval ("a1: a10")„Setați valoarea celuleicell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value„Dacă Cell.Value este eroare, atunci implicit la 0Dacă Err.Number 0 Atuncicell.Offset (0, 2). Valoare = 0Err.ClarEnd IfUrmătorulSfârșitul Sub

Tratarea erorilor VBA în acces

Toate exemplele de mai sus funcționează exact la fel în Access VBA ca în Excel VBA.

123456789101112131415161718 Funcția DelRecord (frm As Form)„această funcție este utilizată pentru a șterge o înregistrare dintr-un tabel dintr-un formularLa sfârșitul Eroare GoToCu frmDacă .NewRecord Apoi.AnulaFuncția de ieșireEnd IfSe termina cuCu frm.RecordsetClone.Marcaj = frm.Marcaj.Ștergefrm.CerereSe termina cuFuncția de ieșirefinal:SfârșitFuncția de sfârșit

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

wave wave wave wave wave