Tipuri diferite de erori

În programare veți întâlni patru tipuri de erori de bază:

  • Erori de limbaj de programare
  • Erori de compilare
  • Erori la rulare
  • Erori de programare logică

Următoarele secțiuni descriu aceste tipuri de erori și modul de evitare al lor. Apoi sunt descrise instrumentele pe care le oferă VBA pentru depanare.

Erori de limbaj

Primul tip de eroare este o eroare de limbaj (cunoscută și sub numele de eroare de sintaxă). Când scrieți greșit un cuvânt în fereastra Code, faceți o greșeală de punctuație, greșiți o comandă sau omiteți sfârșitul unei construcții, aceasta este o eroare de limbaj. Erorile de limbaj sunt parte a procesului de învățare și scriere.

VBA vă ajută să eliminați multe erori de limbaj pe măsură ce le creați. Erorile de limbaj pe care editorul VBA nu le identifică în timpul tastării comenzilor, apar ca erori de compilare în timpul testării de execuție.

Erori de compilare

Erorile de compilare apar atunci când VBA nu poate compila o declarație corect - adică atunci când VBA nu poate transforma o comandă în cod viabil.

De exemplu, dacă în program i se indică VBA să utilizeze o anumită proprietate pentru un obiect care nu are acea proprietate, va rezulta o eroare de compilare. Compilarea este actul de transformare a codului sursă (programarea introdusă în editor) în comenzi de nivel inferior înțelese de către computer. De exemplu, atunci când se apasă F5 pentru a executa programul, VBA începe prin compilarea programului. Dacă găsește o problemă în timpul compilării, afișează un mesaj de eroare.

Vestea bună este că Editorul VBA detectează multe erori de limbaj și unele erori de compilare imediat ce mutați punctul de inserție de pe linia următoare. În multe cazuri nici nu trebuie apăsată tasta F5.

De exemplu, la introducerea afirmației următoare în fereastra Code și apăsarea tastei Enter pentru a crea o nouă linie (sau apăsând T sau 4 pentru a trece la o altă linie, sau clic pe mouse-ul pe o altă linie din macrocomandă):

If X > Y

Editorul VBA afișează eroarea de compilare "Expected: Then or GoTo" pentru a vă spune că lipsește un element important: comanda ar trebui să fie

If X > Y Then 

sau

If X > Y GoTo 

(Dacă nu vedeți mesajul de eroare, există două posibilități: fie ați dezactivat opțiunea de verificare automată a sintaxei Auto Syntax Check [Tools> Options], fie nu ați introdus-o manual și nu ați apăsat Enter.)

Editorul VBA ajută la depanarea codului, identificând multe erori de compilare, deoarece verifică declarațiile pe care le introduceți.

De fiecare dată când introduceți o linie de cod, Editorul examinează dacă această linie este completă și corectă. În acest exemplu, VBA știe că atunci când codul conține o comandă If, trebuie să existe o comandă Then sau GoTo. Altfel, editorul respinge linia și vă informează care este problema.

Această vigilență din partea editorului VBA vă împiedică să faceți erori de acest tip în cod.

Decideți-vă dacă doriți să folosiți caracteristica Auto Syntax Check

Lucrul din această secțiune presupune că păstrați activate funcția Verificare automată de sintaxă a VBA și alte funcții. Dacă debifați opțiunea Auto Syntax Check (Tools > Options > fila Editor), nu veți vedea mesajul de eroare afișat mai sus. În schimb, singurul avertisment pe care îl veți obține despre acea linie incompletă de cod va fi că Editorul VBA scrie linia cu roșu. Linia scrisă cu roșu este modul în care VBA vă spune că programul are o eroare. Puteți încerca să remediați eroarea chiar atunci sau să continuați codarea.

Unii dezvoltatori aleg să oprească Auto Syntax Check, deoarece nu doresc să fie atenționați pe măsură ce tastează codul lor - poate interfera cu concentrarea lor asupra obiectivelor mai mari ale programului pe care îl scriu. Unii programatori preferă lucrul fără verificarea automată a sintaxei. Iar alții consideră mesajele de eroare sâcâitoare.

Folosirea sau nu a Auto Syntax Check este o problemă de gust personal. De exemplu, unora le place să li se spună imediat dacă fac o eroare de ortografie într-un document Word; alții consideră că erorile de ortografie sunt problemele destul de obositoare și pot fi lăsate mai târziu în cursul unei etape de editare. Ei scriu, concentrându-se pe principalele puncte pe care încearcă să le facă, iar apoi, la un moment dat, pornesc corectorul ortografic și remediază eventualele greșeli de tipar și de punctuație. La fel ca atunci când se lucrează la aproape orice sarcină. De exemplu, la prelucrarea lemnului: agățați fiecare unealtă înapoi pe perete în locul potrivit atunci când terminați să o utilizați, sau este mai bine să lăsați ferăstraiele și șurubelnițele să se strângă în jurul vostru, așezându-le la final pe toate odată?

Editorul VBA observă erori de tipul If X> Y care sunt destul de ușoare, dar se pot face și erori de limbaj pe care Editorul VBA nu le poate identifica atunci când mutați punctul de inserție de pe linia pe care se află eroarea. În schimb, VBA identifică mai târziu aceste erori ca erori de compilare atunci când apăsați F5 și compilează codul.

De exemplu, dacă introduceți următoarea afirmație în fereastra Code atunci când lucrați cu Word, Editorul VBA nu va detecta nimic greșit. Dar când executați procedura apăsând F5, VBA va compila codul, va descoperi eroarea și va obiecta:

ActiveDocument.SaveAs FileMame:="My File.docm"

Această eroare este o eroare simplă - FileMame în loc de FileName - dar VBA nu va vedea acest tip de problemă specială până când execută codul și nu reușește să găsească nici o proprietate FileMame.

Editorul VBA ajută, uneori, indirect la observarea erorilor de acest fel în timp ce se scrie cod. Presupunem că încercați să introduceți o instrucțiune Docments.Close în Word și scrieți greșit, Docments în loc de Documents. În acest caz, Editorul VBA nu va afișa lista Proprietăți / Metode (Membri ai listei automate) așa cum se întâmplă în mod normal dacă aveți această caracteristică activată. Nu ați introdus un obiect valid. Prin urmare, VBA nu are o listă de membri care să fie afișată.

Dacă nu vedeți lista Proprietăți / Metode ar trebui să vă dați seama că ceva nu este în regulă. Dacă continuați oricum și introduceți instrucțiunea Docments.Close, Editorul VBA nu va detecta greșeala - va apărea ca mesaj „Run-time error 424: Object required” (dacă nu ați activat Option Explicit) când încercați să rulați procedura. (Dacă ați activat Option Explicit, veți primi în schimb o eroare de compilare „Variable not defined”.)

Editorul vă oferă încă un indiciu că Docments.Close este o eroare. Când apăsați Enter pentru a părăsi această linie de cod, vedeți acest lucru:

docments.Close

Vi se pare ciudat ceva aici? VBA va scrie automat cu litere mari numele obiectelor valide. Dar docments nu este scris cu majuscule.

Un alt tip de problemă este cauzat dacă specificați o proprietate sau o metodă pentru un obiect la care nu se aplică proprietatea sau metoda. În această situație, VBA afișează o eroare de compilare. De exemplu, spuneți că uitați că metoda corespunzătoare aici este Add și introduceți Documents.Create.

VBA evidențiază cuvântul greșit și dă eroarea de compilare „Method or data member not found”, care vă spune că nu există o metodă Create pentru colecția Documents. Acest mesaj este afișat numai în timpul rulării, nu și în timpul de proiectare (timpul de proiectare înseamnă timpul când introduceți linii de cod).

Eroarea "Method or data member not found'' indică faptul că ați utilizat o metodă sau o proprietate care nu este disponibilă pentru obiectul respectiv.

Erori la executarea codului - Runtime Errors

Al treilea tip de eroare este eroarea de rulare (runtime error), care apare în timpul executării codului. Eroarea de rulare apare la codul care obligă VBA să încerce să efectueze o operațiune imposibilă, cum ar fi deschiderea unui document care nu există, închiderea unui fișier atunci când nu este deschis un fișier sau executarea a ceva imposibil din punct de vedere matematic, cum ar fi împărțirea la zero.

Punctuația și sintaxa codului nu conțin erori, dar cereți VBA să facă ceva ce nu poate fi făcut. O eroare de execuție necontrolată (unhandled runtime error) are ca rezultat oprirea programului și afișarea unei casete de dialog Microsoft Visual Basic care afișează un număr de eroare de rulare.

Ca un exemplu de operație imposibilă, luați în considerare împărțirea la zero. Următoarele afirmații conțin un mesaj „Run-time error '11': Division by zero”:

Dim x As Integer x = 1 / 0

Este puțin probabil să introduceți ceva la fel de greșit ca acest lucru în cod.

O eroare unhandled runtime error face ca VBA să afișeze o casetă de mesaj, ca aceasta.

O linie de cod ca aceasta va produce inevitabil o eroare de împărțire la zero, deoarece divizorul este zero. Dar este ușor să introduceți o ecuație validă, cum ar fi PlataLunara = Salariu / Luna și să uitați să atribuiți o valoare pentru Luna (dacă o variabilă numerică este goală, este considerată valoarea zero) sau să produceți o valoare zero pentru Luna prin adunare sau o altă operație matematică. Sau utilizatorul poate tasta zero într-o casetă de dialog, iar codul încearcă ulterior să îl folosească ca divizor. Și așa mai departe.

O modalitate de a verifica erorile de rulare este de a urmări valorile variabilelor, utilizând fereastra Watch din VBA (discutată mai târziu). Pentru a evita posibile erori de introducere a utilizatorului, faceți ca codul să verifice intrarea acestora după închiderea casetei de dialog. Puteți, de exemplu, să afișați un mesaj care să explice că zero nu este o valoare acceptabilă și apoi să afișați din nou caseta de dialog, care să aștepte introducerea unei valori valabile.

Erori de logică din program

Al patrulea tip de eroare este eroarea de logică a programului. Codul este valid, dar produce totuși rezultate incorecte. Când programul are erori de logică, codul poate fi bun din punct de vedere tehnic. VBA este capabil să compileze și să-l ruleze fără a observa erori - dar veți obține un rezultat diferit decât ați intenționat. Aceste erori pot fi greu de remediat.

Erorile de logică ale programului se situează într-un domeniu de la relativ evident (cum ar fi lucrul într-un registru greșit din Excel, deoarece codul nu verifică ce fereastră este activă) până la subtile (cum ar fi extinderea unui interval la caracterul sau celula greșite ). În primul exemplu, probabil că procedura se desfășoară perfect, dar rezultatul din registru nu va semăna deloc cu ceea ce încercați să realizați. În cel de-al doilea exemplu, puteți obține un rezultat care este aproape corect - sau eroarea vă poate determina uneori să obțineți rezultate perfecte și alte rezultate ușor greșite.

Erorile de logică ale programului tind să fie erorile cel mai dificil de rezolvat. Pentru a le elimina, trebuie să urmăriți execuția codului și să identificați unde lucrurile încep să nu mai funcționeze. Pentru a face acest lucru, trebuie să utilizați aproape întotdeauna instrumentele de depanare discutate în secțiunea următoare.

Un prieten de-al meu a scris un program foarte frumos pentru formatarea și tipărirea formularelor. În timp ce îl testa, a observat că, după ce a lucrat bine de aproximativ cinci ori, a trimis brusc doar o treime din formularul imprimantei în timpul unei probe. Nu a reușit să repete acest comportament. Așa că a înconjurat codul cu o buclă și l-a lăsat să funcționeze continuu (aruncând formularul de probă în mod repetat într-un fișier jurnal, în loc să irosească hârtia imprimându-l din nou). El a descoperit că eroarea a apărut doar o dată la fiecare 256 de ori a rulat programul. Niciodată nu a putut localiza această eroare, dar când a dat programul altor oameni, le-a spus doar că a funcționat bine „aproape întotdeauna”.

Când erorile NU sunt din vina programatorului

Există alte două tipuri de erori care pot să apară.

Primul tip este acela în care Microsoft a documentat un articol VBA diferit decât funcționează el de fapt. Acest lucru nu ar trebui să se întâmple, dar din cauza complexității VBA, se mai întâmplă. Dacă codul nu va funcționa întotdeauna corect, chiar dacă urmărește documentația Microsoft, luați în considerare posibilitatea ca documentația să fie incorectă. Căutați pe web folosind cuvintele cheie VBA implicate pentru a afla dacă alții au întâmpinat această problemă și aflați cum au rezolvat-o.

Al doilea tip de eroare, o relație îndepărtată a primului tip, este aceea în care o versiune a VBA se comportă diferit față de o altă versiune. De exemplu, s-ar putea să creați o procedură care să funcționeze perfect în Word 2013, dar trebuie să o schimbați pentru a face să funcționeze cu Word 2016. Într-o lume ideală, acest lucru nu ar trebui să se întâmple - dar după cum știți, această lume este departe de ideal. Aceste două erori sunt destul de rare, pentru că VBA a fost utilizat pe scară largă de zeci de ani, deci este un limbaj foarte matur, cu puține surprize.