Despre depanarea codului VBA

Închis
Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Despre depanarea codului VBA

Mesaj de dinu » Dum Aug 15, 2010 2:50 pm

Buna ziua,

Pentru ca asa de putina lume stie sau e interesata de ce se afla in spatele optiunii Tools > Macro din meniul Excel, mi-am propus sa prezint unele aspecte in legatura cu programarea VBA. Am scris despre formularele MSForms, acum despre depanarea codului.
Ca de obicei, este o prezentare generala. Informatii mai detaliate despre cele prezentate se gasesc in Help. Voi incerca sa prezint toate elementele cu care se lucreaza, si toate informatiile cele mai interesante si utile, cat mai concentrat.
Orice noua informatie/precizare sau intrebare este bine venita. Nu sant tocmai un expert, dar asta e si ideia, de acoperi o problematica cat mai larga intr-un spatiu folosit cat mai economic. Eu incerc sa deschid o discutie mai mult filozofica ca sa zic asa, in legatura cu modul in care se pot realiza diferite lucruri in acest domeniu.

Depanarea codului se refera la activitatea prin care se incearca aflarea motivelor pentru care o aplicatie VBA nu functioneaza asa cum se deoreste.
In continuare voi numi proceduri, procedurile, functiile, si proprietatile Set/Let/Get.

Context - multimea de variabile recunoscute la un moment dat impreuna cu valorile lor.
Initializare - stabilirea unui anumit context.
Resetare - stabilirea contextului default de sistem.

Rularea unei aplicatii - pornirea, intreruperea, si oprirea sau resetarea
Pornirea
O aplicatie VBA poate fi pornita din diferite locuri, dar numai dupa ce a terminat tot ce avea de facut la o eventuala pornire anterioara.

Intre doua rulari aplicatia nu face nimic, dar conteaza cum a luat sfarsit ultima rulare, pentru ca variabilele globale in mod normal nu si-ar pierde valorile lor curente. Daca aplicatia foloseste variabile globale poate fi foarte importanta starea lor. Se spune ca aplicatia este resetata daca acestea incep din nou de la valorile lor initiale atribuite de VBA, si nu au fost initializate intr-un mod corespunzator.

O aplicatie este conceputa sa ruleze proceduri ca urmare a unor interactiuni cu utilizatorul. Acestea pot fi:
1) Niste Macro-uri, accesibile din Excel prin scurtaturi de taste, butoane de pe barele de butoane, optiuni din meniuri.
2) Proceduri care trateaza producerea diferitelor evenimente ale unor obiecte care genereaza evenimente.
In Editorul VBA mai sunt disponibile doua modalitati:
3) O procedura de tip Macro (dintr-un modul Basic) poate fi lansata in executie facand click in interiorul ei si apasand F5, F8, sau apasand pe butonul Run Sub/UserForm.
4) O fereastra poate fi afisata/pornita - incepand cu o eventuala tratare a unor evenimente ale formuarului - daca este activata fereastra de cod sau design a formularului si se apasa F5, F8, sau butonul Run Sub/UserForm.

Intreruperea (stoparea)
In timpul rularii ei o aplicatie poate avea intreruperi (opriri/pauze). Aceastea sunt de doua feluri:
Normale, atunci cand este deschisa o fereastra modala sau un MsgBox. Codul se opreste la statementul care a deschis fereastra si continua numai dupa ce fereastra a fost inchisa.

In vederea depanarii. In acest caz se deschide Editorul VBA in ceea ce se numeste break mode, la linia de cod unde aplicatia VBA a fost oprita, cu optiunile de a vedea ce se intampla si de a o o rula contolat mai departe. Se intampla atunci cand:
1) Este intalnit un Breakpoint. Exista posibilitatea de a marca anumite linii de cod, inainte de a rula aplicatia sau in timpul unei intreruperi, pentru ca executia sa se opreasca la ele. Se face acest lucru facand click in stanga ferestrei de cod in dreptul liniei respective, sau plasand cursorul pe linie si apasand pe butonul Toggle Breakpoint de pe bara Standard.
2) Este intalnit un statement Stop - se deschide Editorul VBA in modul debug la linia respectiva.
3) Se intampla o eroare si apare fereastra respectiva cu optiunile End si Debug. End reseteaza aplicatia.
4) Se apasa Ctrl-Break si apare o fereastra ca cea de eroare.
5) Cand a fost stabilit un Watch care sa urmareasca o expresie, si care (optional) sa intrerupa aplicatia atunci cand valoarea ei este evaluata ca True, sau cand valoarea acesteia se schimba.

Oprirea si resetarea
Aplicatia se opreste atunci cand aplicatia termina tot ce avea de facut.
Aplicatia este resetata atunci cand:
1) Este deschis fisierul Excel, pana la executia vreunei proceduri care ar initializa variabilele globale.
2) Cand este intalnit un statement End.
3) Cand este apasat butonul Reset in timpul unei sesiuni de depanare.

O aplicatie poate sa nu se mai termine niciodata, daca intra intr-o bucla infinita (de apasat Ctrl-Break). Si poate sa mearga mai greu din cauza declansarii neprevazute a unor evenimente (tratate) - de folosit Application.EnableEvents care nici nu are efect intotdeauna dar a carui valoare poate fi testata la intrarea intr-o procedura de tratare. Este nevoie de o verificare temeinica a cestor aspecte.
Ultima oară modificat Lun Aug 16, 2010 8:16 am de către dinu, modificat de 2 ori în total.

Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Despre depanarea codului

Mesaj de dinu » Dum Aug 15, 2010 3:04 pm

Metode de supraveghere si interventie la intreruperi
Ferestrele amintite mai jos sunt accesibile in Editorul VBA din meniul View si de pe bara Debug.

ToolTips
Daca se trece cu mouse-ul peste numele unor variabile, functii, expresii selectate, este afisata intr-un ToolTip valoarea lor.
Nu merge intotdeauna, pentru unele expresii mai greu de evaluat.

Fereastra Imediate Window
Este folosita in doua feluri:
1) Pentru a scrie ceva in ea din program cu Debug.Print Expresie. Expresiile sunt scrise una sub alta incepand din locul unde se afla cursorul.
2) Pe orice rand poate fi scris un statement de cod de un rand. Care daca este pozitionat cursorul la sfarsitul lui si se apasa Enter, este executat in contextul intreruperii din program.

Fereastra Locals Window
Este similara cu fereastra Watch Window.
Prezinta toate variabilele de la nivelul procedurii si al modulului la momentul intreruperii.
Permite modificarea valorilor acolo in lista.

Fereastra Watch Window
Un Watch este o expresie sau o variabila a carei valoare se doreste a fi urmarita si supravegheata. Ele sunt disponibile in fereastra Watch Window.
Un Watch poate fi adagat cu optiunea Add Watch... din diferite meniuri contextuale, cum ar fi pe expresia selectata din cod.
Permite modificarea valorilor acolo in lista.

Fereastra Stack
Prezinta stiva apelurilor de proceduri (procedurile care s-au apelat unele pe altele) si permite navigarea intre ele. In cod, o linie de unde a avut loc un apel inregistrat in stiva, este marcata distinct.

Editarea codului
De cele mai multe ori este permisa editarea codului fara a fi necesara resetarea aplicatiei.

Pot fi prevazute in cod constructii special pentru depanare, constand in printari in Imediate Window, afisare de mesaje cu MsgBox, tratarea erorilor, cate un Stop (conditionat), etc.
La un MsgBox se poate apasa (sau nu) Ctrl-Break.

Controlarea executiei codului
Urmatoarele comenzi sunt disponibile si in meniul Debug si bara Debug.
F8 - Executa codul pas cu pas.
F5 - Da liber codului sa execute pana se opreste singur.

Shift-F8 - Ca si F8, numai ca nu patrunde in alte proceduri apelate - pe care le executa din prima - ci ramane in cadrul aceleiasi proceduri.
Ctrl-Shift-F8 - Daca cu F8 sa intrat in cadrul unei sub-proceduri, executa procedura pana la capat, iese din ea, si se opreste la statementul urmator celui care a apelat procedura.

Ctrl-F8 - In cadrul unei proceduri se pozitioneaza cursorul pe una din liniile care urmeaza celei curente de executie. Dupa care daca este apasata aceasta combinatie, executia continua pana la linia pe care a fost plasat cursorul.

Cursorul din stanga ferestrei de cod - care marcheaza linia curenta de executie - poate fi tras cu mouse-ul pentru a muta executia in alta parte in cadrul aceleiasi proceduri.


Imi cer scuze ca nu am folosit o terminologie tocmai profesionala, asa era frumos.

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: Despre depanarea codului VBA

Mesaj de adof » Sâm Feb 17, 2018 9:02 am

Multumim pentru explicatii

se poate da ceva exemple privind
Fereastra Watch Window
Un Watch este o expresie sau o variabila a carei valoare se doreste a fi urmarita si supravegheata. Ele sunt disponibile in fereastra Watch Window.
Un Watch poate fi adagat cu optiunea Add Watch... din diferite meniuri contextuale, cum ar fi pe expresia selectata din cod.
Permite modificarea valorilor acolo in lista.

Închis

Înapoi la “Visual Basic for Application (VBA) cu Excel - Intrebari tehnice”