Prinderea erori și codul de depanare VBA, Excel pentru toate

Foarte des începe lucrul la VBA se confruntă cu diverse erori care generează un cod în timpul rulării. Dacă nu știi ce să faci în acest caz - va fi foarte dificil să se stabilească rapid codul, și, uneori, chiar imposibil de a determina cauza erorii, fără ajutorul mai multor utilizatori „avansate“. Începătorii fac adesea modificări în mod aleatoriu care pot da naștere la alte erori, iar acest lucru la rândul său, face dificilă nu numai pentru a găsi eroarea inițială, dar, de asemenea, poate duce la incapacitatea de a stabili codul de la toate. Prin urmare, în acest articol am decis să descrie modul de a produce cod de depanare și de a identifica bug-uri.
Acest lucru este descris în articolul poate fi testate imediat în practică, Consiliul a descărca un exemplu:

Așa cum se va discuta:

În plus, la sfârșitul articolului, puteți descărca un fișier cu coduri de eroare VBA și semnificațiile lor.

datele inițiale
Să presupunem că aveți un tabel simplu

Și codul, care va avea loc pe fiecare rând, se înmulțește prețul (coloana preț) de numărul (elemente de coloană de vânzare), suma multiplicată de date și de ieșire suma rezultată în celula B17:

Pe fața codului este acum executat corect și eroarea cauza nu ar trebui. Cu toate acestea, dacă încercați să o facă din nou, pentru a primi o eroare - de data aceasta tipuri de date de eroare (Tip neadaptare):

La momentul apariției principalelor Debuger de presă. nu End (dacă există o dorință de a citi despre tipul de eroare este mai mult - de asemenea, puteți face clic Ajutor, textul este în limba engleză). VBA de calcul linie evidenția sau operație galben, care provoacă eroarea:

Acum, cel mai important pas - este necesar pentru a determina cauza erorii. Pe suprafața totul este în regulă - o celulă este înmulțită cu o alta. Fara experienta greu de înțeles imediat că aceasta este o greșeală de tipuri de date, chiar dacă VBA doar vorbesc despre ea (nepotrivire de tip - tradus ca „nepotrivire de tip“). Prin urmare, cel mai de încredere în acest caz - este de a determina valoarea fiecărei componente a liniei în care a apărut eroarea. În cazul codului de mai sus, puteți utiliza două metode:

Localnici și ceasuri de Windows
Doar pentru a ține evidența valorilor variabilelor sunt foarte convenabil de a utiliza fereastra Localnici și fereastra de ceasuri.
fereastra Locals
fereastra Locals afișează toate variabilele locale implicate în procedura de executare în prezent:

După cum se poate vedea în această fereastră arată numele variabilei, tipul și valoarea acesteia. Totul este bine, dar în această fereastră afișează doar variabilele locale declarate la nivelul modulului. Variabile alte module declarate publice, și utilizate în procedura actuală nu sunt afișate. Aflați mai multe despre vizibilitatea variabilelor pot fi găsite în articolul: Ce este o variabilă și cum să-l anunțe corect?

fereastră ceasuri
fereastra de ceasuri este de mare valoare - în această fereastră, puteți pur și simplu „drag and drop“, variabila sau obiectul dorit și toate datele cu privire la numele va fi reflectată în fereastra variabilei, tipul și valoarea curentă:

Acum, să ne uităm un pic mai mult ca drag and drop de date în fereastra. În exemplul de cod de mai sus:

  • Selectați Cells (i, 3) .value
  • Încă selectat mută mouse-ul peste această selecție
  • Țineți apăsat butonul din stânga al mouse-ului și fără a elibera muta cursorul oriunde în fereastra de ceasuri
  • Breack Apoi modifică valoarea. Dacă este setat, VBA va urmări valoarea acestei variabile și a opri codul cu orice modificare a valorii variabilei. Acest lucru este util pentru valorile de urmărire în cicluri
  • Breack Apoi Valoarea este adevărat - element este util pentru variabilele de tip boolean sau expresii logice. Odată ce variabila sau rezultatul expresiei va duce la True - codul va fi oprit pe această linie.
    De exemplu, codul trebuie oprită, dacă numărul liniei este egal cu 10 (adică. Lr variabilă va fi setat la 10). Apoi, expresia va arata ca:


Apoi, va fi necesar să se aloce într-un rând Dacă lr = 10 Apoi, foarte condițională expresie LR = 10. Ceasuri de mână muta în fereastra. Evidențiați în fereastra de ceasuri, cu această expresie, apăsați pe butonul din dreapta al mouse-ului și selectați Edit Watch. Selectați Breack Apoi valoare nu este caseta Adevărat. Acum, de îndată ce ajunge la 10 variabila LR (adică procesată va fi al 10-lea rând al tabelului.) - codul oprește și expresia șir este evidențiată în galben. Va fi posibil să se analizeze alte variabile sau să continue executarea de cod în modul etapa (a se vedea mai jos).

Pentru ce ar putea fi necesar?

  • Pentru a analiza codul altor oameni și să înțeleagă mai exact ceea ce făcea din interior, și nu numai vedea rezultatele punerii sale în aplicare
  • Dacă sunteți un programator novice, și de multe ori utilizarea makrorekorder (macro-uri de înregistrare) - depanare turn-based va ajuta să înțeleagă modul în care acțiunea execută fiecare linie. Acest lucru va ajuta să învețe rapid să înțeleagă codul și pentru a elimina din ea prea mult, precum și de a combina diferite coduri
  • În cazul în care codul este eroarea logica de execuție. Acest lucru este, probabil, cel mai dificil de eroare, deoarece în acest caz, VBA nu se oprește activitatea și nu spune eroarea. Codul se execută fără erori, dar rezultatul nu este același lucru cum era de așteptat. Aceasta înseamnă că o anumită variabilă se atribuie valoarea greșită, sau o stare efectuate incorect sau nu la momentul la care ar trebui. În general, de fapt, este bug-ul de dezvoltator, care duce la o eroare de sintaxă sau tipuri care VBA pot fi urmărite.

Cum să-și intensifice prin depanare? Este simplu: setați cursorul oriunde în codul și apăsați tasta F8 (sau selectați Degub -Pas meniul Into). Acum, de fiecare dată când este apăsată o tastă cod F8 se va efectua o singură linie de cod după altul în ordinea în care acestea sunt situate în procedura. Dacă în interiorul procedura se va apela o a doua procedură sau funcție - pas prin cod si executa-l, și apoi revine la procedura principală.
Vreau doar să dau câteva taste de comenzi rapide, care sunt ușor de utilizat, cu pas cu pas de depanare:

breakpoints
Dar mult mai des, pur și simplu nu au toate codul pentru a merge pas cu pas și de a începe pas cu pas doar la început cu o singură linie, astfel încât să nu înfășurați liniile de cod 40 (chiar și cu cicluri), în scopul de a realiza o anumită linie. Un alt punct de oprire sunt foarte utile pentru depanarea procedurilor de eveniment (cum ar fi Worksheet_Change, Worksheet_BeforeDoubleClick, evenimente formează elemente, etc.), ele conțin cea mai mare parte argumente și de a efectua la F8 lor este pur și simplu imposibil, iar acestea sunt efectuate numai la producerea evenimentului pe care acestea sunt proiectate să se ocupe.
VBA pentru a face clar ce linie va trebui să se oprească, trebuie să instalați cursorul mouse-ului oriunde pe linie și apăsați F9 dorit sau Debug -Toggle Breackpoint. Linia va fi evidențiate cu roșu închis.
De asemenea, este numit setarea de breakpoint. Eliminarea unui punct de întrerupere poate fi la fel cum a fost instalat - F9 sau Debug -Toggle Breackpoint. Doar punctul fundația poate fi setat cu ajutorul mouse-ului: este necesar în câmpul din stânga a ferestrei cu codul în fața liniei dorite odată ce faceți clic pe butonul din stânga al mouse-ului:

Acum puteți rula codul în orice mod convenabil (de depanare se face de obicei cu tasta F5 sau panoul de: Run -Run Sub / userform). Odată ce codul ajunge la punctul de întrerupere specificat se va opri, iar linia va fi evidențiat în galben. Apoi, puteți continua fie cu pas cu pas (prin apăsarea F8). sau (verifica valoarea variabilelor relevante și obiecte), apăsați F5 din nou și codul va continua să ruleze în mod automat, cu excepția cazului executate sau ajunge la un alt punct de întrerupere. Ei înșiși ca puncte de întrerupere poate fi orice număr, și pot fi situate în orice procedură sau funcție.
Trebuie amintit că, după închiderea fișierului cu valori critice de cod nu sunt salvate, iar data viitoare când deschideți registrul de lucru va trebui să fie reinstalat, dacă este necesar.

Nu există erori, dar codul nu este încă satisfăcută
De asemenea, doresc să adaug că erorile nu pot apărea întotdeauna, chiar dacă acestea sunt. De asemenea, se întâmplă că codul se execută fără erori, dar cu toate acestea, efectuate sau nu, sau nu face nimic. De obicei, din două motive: