Lucrul cu variabile

Variabilele sunt utilizate în aproape toate programele de calculator, chiar și programele scurte precum macrocomenzile. Variabila poate fi considerată ca o zonă cu nume în memoria computerului care se folosește pentru stocarea datelor în timp ce se execută o procedură. De exemplu, o variabilă care a stocat un șir simplu de text care apoi a fost afișat într-o casetă de mesaje:

myVariable = "Variabila text"
MsgBox myVariable

Prima instrucțiune folosește o zonă din memorie, o denumește myVariable și îi atribuie șirul de caractere Variabila text.

A doua instrucțiune preia din memorie conținutul (numit valoare) al variabilei myVariable și folosește funcția MsgBox pentru a o afișa într-o casetă de mesaje.

Conținutul variabilei myVariable rămâne în memorie, astfel încât valoarea sa să poată fi folosită din nou, dacă este necesar, în timp ce rulează macrocomanda. Sau chiar i se poate modifica conținutul. Cu alte cuvinte, valoarea unei variabile poate fi modificat în timp ce rulează programul. O constantă, dimpotrivă, nu se modifică în timpul execuției programului.

Alegerea de nume pentru Variabile

VBA impune mai multe constrângeri asupra modului în care pot fi denumite variabilele:

  • Numele variabilelor trebuie să înceapă cu o literă și pot avea o lungime de până la 255 de caractere. De obicei, ele sunt mult mai scurte, pentru a le putea introduce cu ușurință în cod și astfel liniile de cod să nu ajungă rapid la lungimi incomode.

Caracteristica AutoComplete a Editorului Visual Basic ajută ca numele de variabile lungi să fie mult mai ușor de gestionat, tastând suficiente caractere din numele variabilei pentru a o distinge de orice alt cuvânt cheie și alte nume de variabile și apăsând Ctrl + bara de spațiu. Dacă au fost tastate suficiente litere pentru a identifica în mod unic variabila, editorul Visual Basic introduce automat numele ei; dacă nu, editorul Visual Basic afișează o listă verticală de cuvinte cheie și nume care încep cu acele litere.

  • Numele variabilelor nu pot conține anumite caractere, cum ar fi punctele, semnele de exclamare, operatorii matematici (+, -, /, *) sau operatorii de comparare (=, <>,>,> =, <, <=) nici caracterele de tip declarație (@, &, $, #).
  • Numele de variabile nu pot conține spații, dar pot conține caracterul underscore, care poate fi folosit pentru a face numele de variabile mai clare prin combinarea cuvintelor. De exemplu, Raspuns_Utilizator. Cu toate acestea, mai frecvent se omite caracterul underscore și se folosește literă mare la începutul fiecărui cuvânt, ca în RaspunsUtilizator (scrierea CamelCase).

Ca regulă generală, se recomandă folosirea de caractere alfanumerice simple, la care se poate adăuga ocazional underscore.

De exemplu, toate numele de variabile care urmează sunt corecte, deși ultima este cam lungă:

  • i
  • Ion
  • VariabilaMea
  • ParametriiMisiunii
  • Sirul_introdus_de_utilizator_in_caseta_Input_Box

Pe de altă parte, următoarele nume de variabile nu sunt corecte:

  • Variabila Mea - Conține un spațiu
  • Variabila!Mea - Conține semnul exclamării
  • Time@Tide - Conține un caracter de tip declarație (@)
  • 1_String - Nu trebuie să înceapă cu o literă

Fiecare nume de variabilă trebuie să fie unic în domeniul în care operează (pentru ca VBA să nu o confunde cu orice altă variabilă). De obicei, domeniul în care funcționează o variabilă este o procedură, dar dacă se declară variabila ca fiind publică sau privată (discutată mai târziu în acest capitol), domeniul său de aplicare este mai larg.

Cealaltă constrângere privind numele de variabile este aceea că trebuie să se evite atribuirea unei variabile unui nume pe care VBA îl folosește deja în propriul limbaj de programare sau numele unei funcții încorporate, a unei instrucțiuni sau a unui element de obiect - se numește umbrirea (shadowing) unui cuvânt cheie VBA.

Acest lucru nu provoacă neapărat probleme, dar poate împiedica la folosirea acelei funcții, instrucțiuni sau metode fără a o identifica în mod specific cu VBA, prefațându-i numele cu VBA. De exemplu, în loc de Date, ar trebui folosit VBA.Date - nu este mare lucru, dar se recomandă evitarea acestor lucruri. La urma urmei, de ce să se adauge această complexitate atunci când este mai simplu să fie concepute propriile nume de variabile unice? Aceste lucruri nu oferă nici un beneficiu real și au dezavantaje, de exemplu codul devine mai greu să citit. În plus, dacă se uită prefațarea cu VBA, umbrirea poate provoca probleme.

Nu există niciun motiv pentru a umbri un cuvânt cheie VBA, dar VBA are foarte multe cuvinte cheie și este posibil ca să se facă acest lucru. În cazul creării accidentale a unui nume de variabilă care încalcă una dintre regulile enumerate în această secțiune, VBA va afișa un mesaj de eroare la utilizarea @ sau dacă numele variabilei începe cu 6 sau se fac alte mișcări ilegale. VBA va raporta fie " Invalid Character ", fie va separa numele variabilei în mai multe cuvinte, cum ar fi schimbarea numelui 56nin în 56 nin, considerând că se dorește utilizarea de numere de linie în cod (Liniile de cod pot fi numerotate și VBA va executa codul prin ignorarea numerelor de linie.

Declararea unei Variabile

VBA permite declararea de variabile fie implicit, fie explicit. Fiecare abordare are argumente pro și contra. Cu toate acestea, declarațiile explicite sunt aproape întotdeauna cea mai bună abordare, iar la lucrul cu VBA chiar și pentru puțin timp, se recomandă declararea explicită. Din acest motiv, este bine ca variabilele să fie declarate de la început în mod explicit. Acest capitol ilustrează și modul în care se fac declarații implicite.

Declararea implicită a unei Variabile

Declararea implicită a unei variabile înseamnă că va fi folosită doar în propriul cod, fără a o declara în mod explicit. Când se declară implicit o variabilă, se verifică în VBA pentru a vedea dacă nu există deja o variabilă cu acest nume. Se creează apoi automat o variabilă cu acel nume și i se atribuie tipul de date Variant, care poate conține orice tip de date, cu excepția unui șir de lungime fixă.

De exemplu, se poate declara variabila myVariable utilizând următoarea declarație implicită:

myVariable = "Variabila text"

Aici, variabila myVariable este declarată implicit ca o variabilă - deoarece este folosită într-o declarație, în loc să fie declarată în mod explicit (de obicei cu comanda Dim, descrisă mai jos).

La variabilele declarate implicit, VBA le atribuie tipul de date Variant, care are o duzină de subtipuri. În exemplul anterior, subtipul variabilei este șir (string) deoarece conține text. De obicei, atunci când VBA creează o nouă variabilă de tip Variant, îi atribuie valoarea Empty (o valoare specială folosită pentru a indica variabilele Variant care nu au fost încă utilizate în timpul execuției), dar în exemplul de mai sus variabila primește imediat o valoare (deoarece șirul de text este alocat la aceasta). Apoi VBA atribuie tipul șir (string) deoarece poate vedea că în variabilă este stocat un șir.

Avantajul declarării unei variabile implicite este că se scrie mai puțin cod. Când se dorește o variabilă, ea poate fi declarată pur și simplu la fața locului, folosind-o într-o declarație. Dar declararea implicită a unei variabile are și câteva dezavantaje destul de grave:

  • Este mai ușor să se facă o greșeală atunci când se introduce numele variabilei în altă parte a codului. De exemplu, când se declară implicit variabila FilesToCreate și apoi se tastează FllesToCreate. VBA nu interoghează cea de-a doua ortografie (cu doi de l). Nu sunt afișate mesaje de eroare. VBA creează doar o altă variabilă nouă, diferită, cu numele ll.

La lucrul cu mai multe variabile, poate fi dificil și durează timp să se găsească mici greșeli ca aceasta. O astfel de greșeală (având două variabile atunci când se dorește doar una) cauzează erori. Problema din acest exemplu este că referirea nu se mai face la variabila FilesToCreate. VBA poate detecta acest tip de eroare, dar numai dacă se aplică o declarație explicită. (Aici aplică înseamnă că, dacă se încearcă folosirea unei variabile nedeclarate, editorul Visual Basic afișează un mesaj de eroare și oprește execuția.)

  • Tipul variabilei Variant ocupă mai multă memorie decât alte tipuri de variabile, deoarece trebuie să stocheze diverse tipuri de date. Această diferență este neglijabilă în cele mai multe circumstanțe normale, mai ales dacă se folosesc doar câteva variabile sau dacă se scriu doar proceduri scurte. În cazul în care se folosesc mai multe variabile într-un program uriaș care rulează pe un computer cu memorie limitată, memoria suplimentară folosită de variabilele Variant ar putea încetini o procedură sau chiar ar putea folosi toată memoria computerului. Ceea ce este mai important pe un calculator cu memorie limitată, este faptul că manipularea variabilelor Variant durează mai mult decât manipularea celorlalte tipuri de date. Acest lucru se datorează faptului că VBA trebuie să continue să verifice pentru a vedea ce tip de date există în variabilă. Memoria și viteza sunt probleme mai puțin importante decât au fost, dar pe unele computere cu destinație specială (construite pentru un stivuitor, de exemplu) pot deveni mici și lente chiar și astăzi.

Acest al doilea dezavantaj poate fi evitat în două moduri: în primul rând, folosind un caracter typedeclaration pentru a specifica tipul de date atunci când se declară o variabilă implicit sau, în al doilea rând, prin simpla informare a VBA să oblige declararea explicită a variabilelor și să afișeze un mesaj de eroare în caz contrar. Cu toate acestea, această tehnică este rar utilizată.

Un caracter de tip declarație este un caracter care se adaugă la sfârșitul denumirii unei variabile într-o declarație implicită pentru a spune VBA ce tip de date să utilizeze pentru acea variabilă.

Variabila UserName poate fi declarată implicit ca String folosind următoarea instrucțiune, care atribuie valoarea Ion Ionescu la acea variabilă:

UserName$ = "Ion Ionescu"

Variabila pentru prețul unei valori poate fi declarată implicit folosind instrucțiunea:

Pret@ = Cost * Adaos

Caracterul de declarație tip se folosește numai atunci când se declară variabila. Ulterior, se poate face referire la acea variabilă folosind UserName și Pret, pentru exemplele anterioare.

Declararea explicită a unei Variabile

Declararea explicită a unei variabile este cea mai bună practică. Aplicației VBA i se indică că există o variabilă înainte de a o folosi. VBA alocă spațiu de memorie acelei variabile și o înregistrează ca pe o cantitate cunoscută. De asemenea, în același timp, se poate declara tipul de variabilă, ceea ce este o idee bună, dar nu obligatorie.

O variabilă poate fi declarată explicit în orice loc al codului, înainte de a o utiliza, dar se recomandă ca toate variabilele să fie declarate la începutul procedurii care le folosește. (Sau, pentru a oferi variabilei un domeniu de aplicare mai mare, ea se declară în zona General Declarations din partea de sus a ferestrei Code. Domeniul de aplicare - scope - este descris mai târziu.)

Localizarea tuturor declarațiilor în partea de sus a unei proceduri le face ușor de găsit și ajută pe oricine să citească codul mai ușor.

Declararea variabilelor în mod explicit oferă următoarele avantaje:

  • Codul este mai ușor de citit și de depanat, pentru alți programatori. Acesta este un aspect important atunci când se scrie cod complex.
  • Efectuarea aplicării de către Editor a declarațiilor variabile explicite se realizează prin adăugarea unei instrucțiuni Explicit opțional în partea de sus a unui modul - în secțiunea General Declarations din fereastra Code. Această aplicare vă împiedică să creați noi variabile neintenționate.
  • Este mai dificil să ștergeți neintenționat conținutul unei variabile existente atunci când încercați să creați o nouă variabilă.
  • VBA poate detecta unele erori de tip de date la momentul scrierii codului sau timpul de compilare care, cu declarația implicită, nu s-ar putea suprapune până la execuție.
  • Codul este mai ușor de citit sau depanat, atât pentru autor, cât și pentru alți programatori. La scrierea de cod complex, acest lucru este important.
  • Prin adăugarea în secțiunea General Declarations din fereastra Code a unei instrucțiuni Option Explicit la începutul modulului, Editorul este forțat să accepte declarații explicite de variabile. Acest lucru îngreunează crearea neintenționată de noi variabile prin scrierea greșită a numelor variabilelor existente.
  • Este mai dificilă ștergerea conținutului unei variabile existente atunci când se crează o nouă variabilă.
  • VBA poate detecta unele erori de tip de date la momentul scrierii codului sau în timpul compilării care, cu declarația implicită, nu se pot suprapune până la execuție.

Stocarea în variabilă a tipului corect de valoare

O eroare de introducere de date apare atunci când unei variabile i se atribuie o informație greșită. De exemplu, dacă se declară o variabilă de tip Integer și apoi i se atribuie un șir de text, VBA vă afișează un mesaj de eroare deoarece nu poate stoca informații de tip șir de caractere într-o variabilă Integer.

  • Codul este executat mai rapid, deoarece VBA nu va trebui să determine tipul fiecărei variabile în timpul executării codului.

Dezavantajul declarării variabilelor în mod explicit este că necesită un pic mai mult timp, efort și gândire. Pentru majoritatea codurilor, totuși, acest dezavantaj este cu mult depășit de avantaje.

Pentru a declara explicit o variabilă, se utilizează una dintre următoarele cuvinte cheie: Dim, Private, Public sau Static.

De exemplu, următoarea declarație declară variabila MyValue:

Dim MyValue

Dim este cuvântul cheie cel mai obișnuit care trebuie folosit pentru declararea unei variabile și este utilizat la majoritatea declarațiilor pentru variabile. Celelalte cuvinte cheie se folosesc pentru a specifica un domeniu diferit, durata de viață și tipul de date pentru variabila din declarație. În exemplul anterior, variabila MyValue primește domeniul implicit, durata de viață prestabilită și tipul de date Variant, ceea ce o face potrivită pentru utilizarea generală.

De asemenea, se pot declara mai multe variabile pe aceeași linie separând declarațiile de variabile cu virgule:

Dim Supervisor As String, ControllerCode As Long

Acest lucru poate ajuta la reducerea numărului de linii de declarații din cod, dar face declarațiile mai greu de citit, deci de obicei nu este o idee bună.

De reținut faptul că la declararea mai multor variabile pe aceeași linie, trebuie specificat tipul de date pentru fiecare, ca în exemplul anterior. În unele cazuri, declararea de variabile se poate scurta:

Dim strManager, strReportingEmployee As String

Această instrucțiune nu creează două variabile de tip String: strReportingEmployee este variabilă de tip String, dar strManager este de tip Variant pentru că partea As String din cod se aplică doar la strReportingEmployee.

Alegerea domeniului (Scope) și a duratei de viață pentru o variabilă

Domeniul de aplicare al unei variabile (Scope) este sfera de acțțiune în care poate funcționa. Poate fi comparat ca fiind similar cu un domeniu de activitate de la locul de muncă: locul în care se îndeplinesc sarcini și locurile în care nu se face acest lucru. Domeniul de aplicare ar putea fi zona de birouri a clădirii, dar nu și alte zone, care nu fac parte din descrierea postului.

Domeniul implicit al unei variabile este procedura în care această variabilă este declarată. Cu alte cuvinte, domeniul de aplicare este între Sub și End Sub (sau Function și End Function) care definesc începutul și sfârșitul unei proceduri date. Macrocomenzile sunt adesea destul de scurte; prin urmare, de obicei, codul lor este conținut într-o singură procedură. Pentru macrocomanda tipică, nu există niciun motiv pentru ca o variabilă să aibă un domeniu de aplicare mai mare decât propria ei procedură.

Iată un exemplu de domeniu de aplicare la nivel de procedură. Să presupunem că aveți două macrocomenzi numite Tabel_Rentabilitate și Tabel_Analiza_Profit. Ar exista o problemă pentru VBA dacă ați folosit o variabilă denumită Cheltuieli în ambele proceduri? Nu. Variabilele fiecărei proceduri sunt diferite de variabilele celeilalte proceduri, astfel încât nu există niciun pericol ca VBA să confunde cele două proceduri când se execută macrocomenzile. Fiecare instanță a Cheltuielilor este închisă, domeniul său de aplicare este limitat la propriile sale proceduri. Nu se folosește în alte proceduri. Se spune că variabila este locală (local) pentru procedura în care se află.

Durata de viață a unei variabile este perioada de timp în care VBA își amintește valoarea variabilei (altfel zis, perioada în care variabila există). În funcție de scopul în care sunt folosite, variabilele pot avea durate de viață diferite. Durata de viață a unei variabile este legată de domeniul său de aplicare. Aici, durata de viață se referă la cât timp există variabila în timpul execuției programului.

Variabilele declarate în cadrul unei proceduri au cea mai scurtă durată de viață: ele există numai în timpul executării acestei proceduri. Cu toate acestea, pentru majoritatea macrocomenzilor, aceasta este durata de viață obișnuită, deoarece macrocomenzile sunt în mod tipic autonome și nu trebuie să treacă date altor macrocomenzi.

Uneori, variabila trebuie accesată din afara procedurii în care este declarată. În aceste cazuri, pentru acea variabila trebuie declarat un domeniu de aplicare diferit, mai larg. Puteți face acest lucru declarând o variabilă sus, deasupra primei proceduri din modul. O astfel de variabilă se spune că are o dimensiune globală în loc de locală. Astfel, o variabilă globală există mai mult decât oricare dintre procedurile din cadrul modulului - durata sa de viață este mai mare decât a unei variabile locale.

Cu toate acestea, în practică avem de-a face cu macrocomenzi care rareori acționează alături de alte macrocomenzi, astfel încât nevoia unei variabile globale care să comunice date altor macrocomenzi este la fel de rară. De fapt, pentru a trimite date de la o macrocomandă la alta se folosesc funcțiile. Funcțiile sunt concepute pentru a transmite date în afara procedurii proprii.

Solicitarea declarațiilor explicite pentru variabile

Majoritatea experților recomandă declararea variabilelor în mod explicit. VBA poate fi instruit să solicite declararea de variabile în mod explicit. Majoritatea programatorilor și dezvoltatorilor consideră că această caracteristică este utilă deoarece împiedică declararea implicită a variabilelor, intenționat sau altfel.

Pentru a solicita declararea de variabile la nivel global – pentru ca o declarație explicită să fie implementată automat în orice modul nou creat – se alege Tools > Options din Editorul Visual Basic pentru a afișa caseta de dialog Opțiuni, în care se selectează caseta de selectare Cerere variabilă declarare (Require Variable Declaration) din zona Setări cod și apoi faceți clic pe butonul OK. (Caseta Require Variable Declaration este debifată în mod implicit, permițând declararea implicită de variabile, care este cel mai simplu mod de a învăța cum se lucrează cu variabilele.) Editorul Visual Basic adaugă apoi o instrucțiune Option Explicit fiecărui modul nou creat. Această instrucțiune impune declararea de variabile explicite pentru modulul în care se află.

La bifarea casetei Require Variable Declaration, editorul Visual Basic nu adaugă instrucțiunea Option Explicit la modulele existente deja. În acest caz, pentru a forța folosirea de declarații explicite în modulele existente, trebuie tastată manual instrucțiunea Option Explicit.

Pentru a solicita declarații de variabile numai pentru modulele specificate, se pune instrucțiunea Option Explicit la începutul fiecărui modul pentru care doriți să solicitați declarații. Instrucțiunea Option Explicit se pune înaintea instrucțiunii Sub sau Function pentru prima procedură din modul - dacă se pune într-o procedură sau între proceduri, VBA afișează o eroare când se încearcă executarea oricărui cod din modul. Această zonă – de deasupra primei proceduri dintr-un modul – se numește zona Declarații generale (General Declarations).

Dacă s-a setat Option Explicit fie global, fie pentru un modul individual, VBA testează procedura înainte de a o executa. Mai exact, VBA protestează când încearcă să compileze codul și descoperă că nu au fost declarate una sau mai multe dintre variabile și atenționează dacă o variabilă nu este declarată explicit, după cum se arată aici în această captură de ecran. De asemenea, VBA marchează variabila din cod.

Dacă apare această casetă de mesaje, problema se poate rezolva fie declarând variabila, fie dezactivând cerința de declarații variabile pentru acel modul. Pentru a dezactiva această cerință, se elimină instrucțiunea Option Explicit din modul selectând și ștergând linia care o conține sau comentând această linie, introducând simbolul apostrof (') la începutul liniei.

O variabilă poate avea trei tipuri de domenii de aplicare (scope):

  • Procedure
  • Private
  • Public

Domeniul de aplicare Procedure

O variabilă care are domeniul de aplicare Procedure scope (domeniu de aplicare la nivel de procedură sau domeniu de aplicare locallocal scope) este disponibilă numai în procedura care o conține. Ca rezultat, durata de viață a unei variabile locale este limitată la durata procedurii care o declară. Imediat ce procedura se oprește, VBA elimină toate variabilele locale din memorie și recuperează memoria în care le-a stocat. Acest lucru este valabil chiar dacă mai târziu aceeași procedură este executată din nou. Variabilele locale nu persistă dacă execuția se mută în afara procedurii. Din nou, macrocomenzile sunt de obicei doar o singură procedură, deci variabilele locale sunt de obicei suficiente.

Domeniul de aplicare Procedure este suficient pentru variabilele care funcționează numai în procedura în care sunt declarate. De exemplu, la declararea unei variabile Variant numită Supervisor, după cum urmează:

Dim Supervizor = "George Georgescu"

Apoi, se poate utiliza variabila Supervizor în restul procedurii - de exemplu, preluarea textului stocat în aceasta sau schimbarea textului respectiv. Dar când procedura nu mai funcționează, VBA elimină variabila. VBA o uită.

Variabilele declarate implicit sunt întotdeauna Variabile Locale.

La declararea implicită a unei variabile, acesteia i se atribuie automat domeniul de aplicare Procedure.

Pentru a declara în mod explicit o variabilă locală, se folosește cuvântul cheie Dim și declarația se plasează în interiorul procedurii, cum ar fi:

Sub Creare_Raport_Saptamanal()
Dim strSupervizor As String 
Dim lngController As Long
End Sub

Aici, a doua linie declară variabila strSupervizor ca tip de date String, iar a treia linie declară variabila lngController ca tip de date Long.

Pe de altă parte, pentru a transmite o variabilă unei alte proceduri pe care o apelați din procedura curentă, nu este suficient domeniul de aplicare Procedure - trebuie utilizat fie domeniul de aplicare Private, fie domeniul de aplicare Public.

Domeniul de aplicare Private

O variabilă declarată cu domeniul de aplicare Private este disponibilă pentru toate celelalte proceduri din modulul care o conține, dar nu pentru procedurile din alte module. Utilizarea variabilelor private permite transmiterea valorii unei variabile de la o procedură la alta. Spre deosebire de variabilele locale, care își păstrează valoarea numai atâta timp cât procedura care le conține este rulată, variabilele private își păstrează valoarea atâta timp cât este executată orice procedură din proiectul (modulul) care le conține.

Pentru a declara o variabilă cu domeniul de aplicare Private, se poate utiliza fie cuvântul cheie Dim, fie cuvântul cheie Private, dar se folosește la începutul unui modul, înaintea instrucțiunii Sub pentru prima procedură din modul, cum ar fi:

Dim strSupervizor As String
Private blnConsultantAssigned As Boolean
Sub Assign_Personnel()
 
End Sub

Editorul Visual Basic afișează declarațiile private deasupra liniei de divizare care apare între zona Declarații generale și codul de dedesubt.

Se poate observa că instrucțiunea Dim utilizează exact aceeași sintaxă ca și declarația anterioară pentru variabila locală. Singura diferență este că aici se plasează declarația Dim în zona declarațiilor unui modul (partea de sus), în loc sa fie plasată în cadrul unei proceduri.

Deoarece declarația Private are același efect ca și instrucțiunea Dim pentru declararea variabilelor private și nu poate fi folosită în cadrul unei proceduri, se poate folosi instrucțiunea Private în locul instrucțiunii Dim pentru a declara variabilele private. (Termenul Private are sens de particular pentru acel modul.)

Domeniul de aplicare Public Scope

O variabilă declarată cu scop public este disponibilă oriunde într-un proiect. Este accesibil prin toate procedurile din toate modulele din proiectul care le conține.

Pentru a declara o variabilă publică, se folosește cuvântul cheie Public în zona Declarații generale de la începutul unui modul (deasupra instrucțiunii Sub pentru prima procedură din modul). Iată un exemplu:

Option Explicit
Public intMyVar As Integer

A doua declarație declară variabila publică intMyVar ca fiind de tip Integer.

Ca și variabilele private, variabilele publice își păstrează valoarea atâta timp cât proiectul care le conține este deschis (încă rulează). De exemplu, pentru a urmări numele utilizatorului dintr-o serie de operații în Word, se poate crea o procedură AutoExec care solicită utilizatorilor să introducă numele lor când pornesc Word. (AutoExec este numele încorporat pentru o procedură care rulează automat când pornește Word.) La pornire, Word caută să afle dacă există o Subprocedură numită AutoExec și, dacă da, va executa acea procedură.)

Zona cu declarații apare în partea de sus a ferestrei Code

Zona Declarații generale (General Declarations) apare la începutul fiecărui modul care conține declarații. De exemplu, pentru a folosi declarații de variabile explicite (bifând caseta Require Variable Declaration din Editor, Tools > Options), editorul Visual Basic introduce automat instrucțiunea Option Explicit la începutul fiecărui modul nou creat. Dacă nu, editorul Visual Basic creează zona cu declarații atunci când se introduce manual pentru prima dată o declarație.

Datele introduse de utilizator pot fi stocate într-o variabilă publică, apoi valoarea se poate utiliza mai târziu în aceeași sesiune Word. Acest lucru este util dacă mai multe macrocomenzi au nevoie de informațiile conținute într-o variabilă. Acesta este un avantaj față de variabilele locale (cele declarate în cadrul unei proceduri) care sunt distruse imediat ce procedura ajunge la instrucțiunea End Sub și se închide.

Folosirea de Prefixe pentru a identifica tipurile de variabile

Prefixele identifică tipul de date al unei variabile. De exemplu, în loc de a numi o variabilă Utilizator se poate folosi numele strUtilizator. Prefixul str identifică Utilizator ca o variabilă care conține șiruri de text. Aceste prefixe fac codul mai ușor de citit și modificat deoarece fiecare variabilă, oriunde în cod, este identificată ca un anumit tip.

Prefixele utilizate în mod obișnuit includ str pentru String, int pentru Integer, var pentru Variant, lng pentru Long, obj pentru Object și așa mai departe.

Un set similar de prefixe este folosit pentru a identifica comenzile plasate pe un formular: txt pentru Text, btn pentru Button și așa mai departe. O listă cu prefixe care pot fi folosite se află în Wikipedia:

http://en.wikipedia.org/wiki/Leszynski_naming_convention

Procedura AutoExec

  1. Public strCurrentUser As String
  2. Sub AutoExec()
  3. strCurrentUser = InputBox("Va rog sa introduceti numele.", "Identificare utilizator")
  4. End Sub
  5. Sub Identify_Current_User()
  6. MsgBox "Utilizatorul actual este " & strCurrentUser, vbOKOnly + vbInformation, "Nume utilizator"
  7. End Sub

Codul este format din trei părți distincte:

  • Linia 1 declară variabila publică strCurrentUser de tip String.
  • Liniile de la 3 până la 5 conțin procedura AutoExec. Această procedură se execută de fiecare dată când utilizatorul pornește Word. Linia 4 afișează o casetă de introducere date care solicită utilizatorului să își introducă numele și stochează răspunsul în variabila publică strCurrentUser.
  • Liniile de la 7 până la 9 conțin procedura Identify_Current_User procedure, care afișează un mesaj cu numele utilizatorului, împreună cu un text introductiv, o pictogramă de informare și o bară de titlu pentru completare.

Aceste proceduri se pot testa pas cu pas (prin apăsarea tastei F8), mai întâi procedura AutoExec, apoi procedura Identify_Current_User în Editorul Visual Basic. Pentru a vedea efectul acestora, procedurile trebuie create, apoi se închide Word. La repornirea Word, procedura AutoExec afișează caseta de introducere pentru a introduce numele.

După aceea, în orice moment (până la ieșirea din Word), se poate accesa valoarea din variabila strCurrentUser. De exemplu, se poate executa procedura Identify_Current_User în orice moment (până la închiderea Word) și VBA afișează o casetă de mesaj cu numele introdus. Se spune că o variabilă publică persistă.

Un număr mare de variabile publice pot bloca memoria

De ce se fac toate variabilele publice? La scrierea de programe scurte cum ar fi macrocomenzile, acest lucru nu ar cauza atât de multe dificultăți ca în cazul programelor mari sau a celor scrise în echipă.

Oricum, există o varietate de motive pentru a limita domeniul de aplicare al variabilelor cât mai local posibil. O analiză a avantajelor și dezavantajelor variabilelor publice (globale), este prezentată pe acest site web:

http://c2.com/cgi/wiki?GlobalVariablesAreBad

Folosirea de variabile Statice

Pe lângă declararea variabilelor cu Dim, Private și Public, se poate utiliza și cuvântul cheie Static, care este special. Se folosește pentru a determina persistența unei variabile locale. Static se folosește în loc de Dim pentru a declara o variabilă statică - o variabilă ale cărei valori sunt păstrate între apeluri la procedura în care sunt declarate.

Variabilele statice sunt similare cu cele publice, deoarece durata lor de viață nu se limitează la durata procedurii care le declară. Diferența este că variabilele statice, odată declarate, sunt disponibile numai pentru procedura care le-a declarat, în timp ce variabilele publice sunt disponibile pentru toate procedurile după ce au fost declarate. Deci, o variabilă statică are sfera de aplicare a unei variabile locale, dar durata de viață a unei variabile publice sau private. În practică există o situație particulară în care variabilele statice sunt la îndemână: schimbarea/comutarea.

Variabilele statice sunt utile pentru păstrarea informațiilor despre un proces care trebuie executat de mai multe ori în timpul unei sesiuni a aplicației, sau pentru a memora un total de funcționare (de exemplu, de câte ori s-a efectuat o procedură), fie pentru a reține informații care s-ar putea dovedi utile când se execute o procedură o a doua sau la o dată ulterioară.

De obicei, variabilă statică se folosește într-o procedură care comută ceva între două stări. De exemplu, se poate crea o procedură care, atunci când este executată pentru prima dată, va fi afișată cu caractere italic/înclinate, iar la următoarea execuție va fi fără caractere italice și așa mai departe. O astfel de comutare ar arăta așa:

Sub ComutareItalic()
Static comutator As Boolean
comutator = Not comutator
If comutator Then MsgBox "On"
Else
MsgBox "Off"
End If
End Sub

Macrocomanda se poate testa pas cu pas (clic pe prima linie a procedurii și apăsarea tastei F8). De fiecare dată la executarea procedurii, apare un mesaj diferit. Comanda Not comută variabila de tip Boolean între True și False. O variabilă booleană poate avea doar două valori posibile.

Următoarea declarație declară variabila statică strCautareTermen:

Static strCautareTermen As String

Specificarea Data Type pentru o Variabilă

Mai jos sunt descrise tipurile de date suportate de VBA și memoria alocată fiecărui tip de variabilă.

Mai jos este descris detaliat fiecare tip de variabilă în parte.

Trebuie specificat tipul de date?

Specificarea tipului de date pentru fiecare variabilă creată este o idee bună, dar nu este obligatorie. Se poate folosi implicit tipul de date Variant, lăsând VBA să descopere care subtip va fi atribuit pentru Variant.

Există patru dezavantaje în utilizarea tipului de date Variant:

  • Uneori, VBA poate face o greșeală când încearcă să interpreteze tipul de date. Acest lucru poate provoca probleme.
  • Utilizând tipului de date Variant, codul va rula mai lent. Oricum, la procedurile scurte (sau proceduri lungi care implică relativ puține variabile), memoria și viteza sunt rareori o problemă.
  • Codul este mai greu de citit și depanat. Acest lucru poate fi o problemă.
  • Tipul de date Variant necesită mai multă memorie decât oricare alt tip de date, cu excepția șirurilor lungi.

Pentru a rezuma, cei mai mulți experți în programare nu recomandă Variant și sugerează că este mai bine ca tipurile de date să fie specificate la declararea variabilelor.

Boolean

O variabilă Boolean poate avea doar două valori: True sau False. Pentru a atribui o valoare la o variabilă Boolean, se pot folosi cuvintele cheie True și False, ca în linia a doua a codului următor (prima linie declară variabila Boolean blnProduct_Available):

   Dim blnProdus_In_Stoc As Boolean 
   blnProdus_In_Stoc = True

Apoi rezultatul variabilei Boolean poate fi preluat și se pot lua măsuri în consecință:

If blnProdus_In_Stoc = True Then 
MsgBox "Produsul exista in stoc."
  Else 'blnProdus_In_Stoc = False
MsgBox "Produsul nu exista in stoc."
  End If

Când o variabilă Boolean se convertește la alt tip de date (cum ar fi o valoare numerică), True returnează 1 și False returnează 0. La convertirea unei valori numerice la o valoare Boolean, 0 returnează False și oricare alt număr (fie pozitiv, fie negativ) returnează True.

Variabilele booleene ocupă câte 2 octeți fiecare în memorie.

Byte

Variabila Byte ocupă cea mai mică memorie pentru orice tip de date - doar 1 octet - și poate stoca un număr de la 0 la 255.

Currency

Tipul Currency este destinat utilizării de bani. Permite numere pozitive și negative de până la 15 cifre la stânga punctului zecimal și 4 cifre la dreapta acestuia. Spre deosebire de tipurile de date Single și Double, tipul de date valutar este exact, nu este rotunjit.

Pentru a declara implicit o variabilă Currency, se folosește caracterul de declarație de tip @. De exemplu, se poate calcula salariul săptămânal astfel:

  Sub Calcul_Salar_Saptamanal()
    Salar@ = InputBox("Introduceti valoarea pentru salariu pentru un an.", _
       "Calcul Salariu saptamanal")
    SalarSaptamanal@ = Salar / 52 
    MsgBox SalarSaptamanal 
  End Sub

Variabila Currency ocupă 8 octeți.

Date

Tipul de date Date este relativ complex. VBA funcționează cu date și ore ca numere cu puncte variabile, cu data afișată în partea stângă a punctului zecimal și timpul în dreapta. VBA poate gestiona date de la 1 ianuarie 100 până la 31 decembrie 9999 și ore de la 0:00:00 la 23:59:59.

NUMERELE CU ZECIMALE FIXE SUNT MAI EFICIENTE

Programarea computerului stochează în mod obișnuit un număr în două moduri: ca număr în virgulă mobilă sau ca număr fix de zecimale.

Un număr cu virgulă mobilă este un număr în care cantitatea este dată de un număr înmulțit cu o putere a numărului de bază (de exemplu, 10): punctul zecimal "plutește" în locații diferite.

Un număr cu zecimale fixe este unul în care zecimalele rămân în aceeași locație. Numerele cu zecimale fixe ar trebui utilizate ori de câte ori este posibil, deoarece calculatorul le poate calcula mai repede. Din același motiv, la școală, adunarea, înmulțirea și scăderea sunt mai ușor de învățat decât împărțirea și fracțiile lungi.

Variabilele pentru date pot fi introduse ca valori literale – cum ar fi 6/30/36 sau June 30, 1936 – prin adăugarea caracterului # înainte și după valoarea literală a datei:

  #June 30, 1936#

Când se mută punctul de inserare în linia din fereastra Code în care ați introdus o valoare dată dată literal între caracterele #, VBA convertește datele în număr și modifică afișajul în formatul de dată setat în computer. De exemplu, dacă se introduce June 30, 1936, probabil că VBA îl va afișa ca 6/30/36. De asemenea, se poate introduce o valoare de timp literală (de exemplu, #10:15PM#), iar VBA îl convertește într-un număr și îl afișează în funcție de formatul curent (de exemplu, 10:15:00 PM).

Variabilele pentru data ocupă până la 8 bytes fiecare.

TREBUIE SPECIFICAT ÎNTOTDEAUNA SECOLUL PENTRU DATELE CALENDARISTICE

La datele calendaristice se specifică întotdeauna secolul (cum ar fi 1909 sau 2009), alltfel VBA poate furniza secolul greșit. Versiunile anterioare ale VBA (de exemplu, în Office 2000 și Office 97) au alocat secolul 20 pentru anii de la 30 la 00 și secolul 21 pentru anii de la 01 până la 29.

Decimal

Tipul de date zecimale (Decimal) stochează numere întregi de tip unsigned, înmulțite cu puteri ale lui 10. Unsigned înseamnă că numerele întregi nu poartă semnul plus sau minus. O variabilă Decimal nu se poate declara direct: se poate utiliza tipul de date Decimal numai în cadrul unui tip de date Variant.

Variabilele zecimale ocupă fiecare câte 12 octeți (bytes).

Double

Tipul de date Double se folosește la numerele cu zecimale variabile și poate gestiona valori negative de la -1.79769313486231570 E+308 la -4.94065645841246544 E-324 și numere pozitive de la 4.94065645841246544 E-324 la 1.79769313486231570 E+308.

Unele numere din acest interval nu pot fi reprezentate exact în binar, astfel încât VBA le rotunjește. Aici, Double se referă la punctul zecimal cu precizie dublă - modul în care numărul este gestionat de calculator. Single (discutat mai jos) înseamnă punct zecimal precizie simplă.

Caracterul # se folosește la declarație pentru a declara implicit o variabilă Double. Variabilele duble ocupă câte 8 octeți fiecare.

Integer

Tipul de date Integer este cel mai eficient mod de a manipula numerele din intervalul său (de la 32.768 la 32.767), o gamă care îl face util pentru multe proceduri. De exemplu, pentru a repeta o acțiune de 300 de ori, se poate utiliza o variabilă Integer pentru contor, ca mai jos:

   Dim intMyVar As Integer 
   For intMyVar = 1 to 300 'repeta actiunile 
   Next intMyVar

Variabilele Integer ocupă câte 2 octeți fiecare. Integer este cel mai frecvent utilizat tip de date numeric pentru multe sarcini de programare. Acest lucru se datorează faptului că, dacă nu lucrați cu ceva de genul rachetelor de lună sau a datoriei naționale, cele mai multe operații matematice aparțin gamei de tip Integer.

Long

Tipul de date Long se poate folosi la valori mari. Tipul de date Long poate avea valori întregi mai mari sau mai mici decât cele pe care le poate gestiona tipul de date Integer: variabilele Long pot ocupa de numere de la -2.147.483.648 la 2.147.483.647. (Pentru numere mai mari sau mai mici decât acestea, utilizați tipul de date Double, dar atenție la rotunjiri.)

Variabilele Long utilizează caracterul tip de declarație & pentru declarațiile implicite și ocupă câte 4 octeți fiecare.

Object

Tipul de date Object se folosește la stocarea adreselor unor obiecte (de exemplu, obiectele dintr-un model de obiect al unei aplicații), oferind o modalitate ușoară de a se referi la un obiect.

Variabilele de obiecte ocupă câte 4 octeți fiecare.

Single

Tipul de date Single, la fel ca tipul de date Double, se folosește la lucrul cu numere în virgulă mobilă. Single poate gestiona valori negative de la -3.4028235E + 38 până la -1.401298E-45 și valori pozitive de la 1.401298E-45 până la 3.4028235E + 38

Unele numere din acest interval nu pot fi reprezentate exact în binar, astfel încât VBA le rotunjește.

Pentru a declara implicit o variabilă Single se folosește caracterul de declarație tip de semn de exclamare (când se folosesc declarații implicite). Variabilele Single ocupă câte 4 octeți fiecare.

String

Tipul de date String se folosește la manipularea textului:

    • Variabilele String cu lungime variabilă pot conține până la aproximativ 2 miliarde de caractere. Ele ocupă 10 octeți plus spațiul de stocare necesar pentru șir.
    • Variabilele String cu lungime fixă ​​pot conține între 1 și 64.000 de caractere. Ele ocupă doar spațiul de stocare necesar pentru acel șir. Dacă datele atribuite variabilei String sunt mai scurte decât lungimea fixă, VBA adaugă la final spații de sfârșit pentru a completa restul de caractere. Dacă datele atribuite variabilei String sunt mai lungi decât lungimea fixă, VBA trunchiază și preia datele doar până la al 64.000-lea caracter. VBA numără caracterele de la capătul din stânga al șirului - de exemplu, variabila de tip șir cu valoarea Calendar care are lungimea fixă ​​ de patru caractere, VBA stochează doar Cale. Variabilele pentru șir cu lungime fixă ​​sunt rareori utilizate în majoritatea programărilor, cu excepția gestionării anumitor baze de date în care există o regulă conform căreia un șir nu poate fi mai lung decât o lungime specificată.
    • Variabilele String pot conține litere, cifre (cifre), spații și punctuație, caractere speciale precum @ și *.
    • Pentru a declara implicit o variabilă de tip String se poate folosi caracterul $, dar (ca de obicei) se recomandă declararea explicită a variabilelor String, împreună cu toate celelalte variabile.

Variant

Tipul de date Variant, așa cum s-a menționat mai devreme în acest capitol, este tipul implicit. Este atribuit de VBA oricărei variabile al cărui tip de date nu este specificat - deci o declarație precum

Dim VariabilaFaraTip 

creează un Variant. Însă

Dim intVariabil As Integer 

creează o variabilă de tip Integer. De asemenea, o variabilă Variant poate fi declarată explicit, de exemplu:

Dim myVariant As Variant

Variabilele Variant se pot ocupa de majoritatea diferitelor tipuri de date, dar există câteva caracteristici ale variantelor care trebuie păstrate în minte:

    • Variant nu pot conține date de șir cu lungime fixă. Pentru a utiliza un șir de lungime fixă, trebuie specificat un tip de date String cu lungime fixă.
    • Variabilele Variant pot conține patru valori speciale: Empty (adică variabila nu a fost încă inițializată), Error (o valoare specială utilizată pentru urmărirea erorilor într-o procedură), Nothing (o valoare specială folosită pentru a dezasocia o variabilă de la obiectul cu care a fost asociată) și Null (folosită pentru a indica faptul că variabila nu conține în mod deliberat date).

Variabilele Variant ocupă mai multă memorie decât alte tipuri. Cele care conțin numere ocupă 16 octeți, iar cele care conțin caractere ocupă 22 de octeți plus spațiul de stocare necesar pentru caractere.

ALEGEREA TIPULUI DE VARIABILĂ

De obicei se folosesc variabile de tip String și Integer. Iată câteva reguli clare pentru alegere:

    • Dacă variabila va conține numai valorile True și False, poate fi declarată ca tip de date Boolean.
    • Dacă variabila va conține întotdeauna un număr întreg (dacă nu va conține niciodată o fracție), se declară ca fiind de tip Integer. (Dacă numărul este prea mare pentru tipul de date Integer, se declară ca tip de date Long, care este un întreg mai mare.)
    • Dacă variabila va fi utilizată pentru calcularea banilor sau dacă aveți nevoie de fracțiuni fără rotunjire, se folosește tipul de date Currency.
    • Dacă variabila ar putea conține uneori o fracție, se declară ca tip de date Single sau Double.
    • Dacă variabila va conține întotdeauna un șir, se declară ca String.

Pentru verificare, se poate testa tipul unei variabile folosind un Variant.

Pentru a determina ce tip de variabilă va conține cel mai bine informațiile care vor fi folosite, se declară variabila ca Variant. Apoi se parcurge codul din Procedură în modul Break cu afișarea ferestrei Locals (View > Locals Window). Fereastra Locals afișează variabilele locale, valoarea lor și tipul acestora.

Pe măsură se apasă tasta F8 pentru a parcurge procedura, se poate vedea subtipul atribuit de VBA fiecărei variabile. În coloana Type este afișat tipul, cum ar fi Variant/Double sau Variant/String. Procedura se testează de mai multe ori pentru a varifica dacă subtip este consistent, apoi se declară tipul variabilei în funcție de cel indicat în coloană. Apoi se rulează codul de câteva ori pentru a verifica că noul tip de date funcționează.