Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut să stocați douăzeci de nume de angajați în variabile pentru a le utiliza într-o procedură. O modalitate de a face acest lucru ar fi crearea a 20 de variabile numite, de exemplu, angajat1, angajat2, și așa mai departe. Cu toate acestea, este mult mai eficient să creați o singură variabila angajati de tip vector care poate conține până la 20 de nume. VBA creează o singură variabilă cu 20 de "locații" diferite în care puteți adăuga date (cum ar fi numele angajaților). O astfel de variabilă vector (array în engleză) este asemănătoare cu o plajă Excel care conține 20 de celule într-un rând sau o coloană: intervalul este o singură entitate, dar conține 20 de locații (celule) în care puteți introduce date. Diferența majoră este că aproape întotdeauna folosiți o variabilă de tip array pentru a reține datele unui singur tip de dată, cum ar fi String. Când declarați o variabilă a matricei, specificați tipul de date, după cum se arată aici: Dim angajati (19) As String După cum puteți vedea, această declarație este foarte asemănătoare cu cea pe care ați folosi-o pentru o variabilă obișnuită. Diferența este numărul 19 închis între paranteze. Parantezele spun VBA că declarați un vector, iar numărul indică VBA câte elemente veți avea în vector. De ce 19 în loc de 20? Ei bine, fiecărui element din matrice îi este atribuit un indice, unde indicele primului element este 0, cel de-al doilea este 1 și așa mai departe, ultimul indice fiind 19. De aceea, numărul total de elemente din această matrice este de 20. Utilizați un indice pentru a accesa un element din vector prin includerea indicelui între paranteze, cum ar fi: angajati(2) = "Popescu"
În mod implicit, indicile matricelor VBA încep la 0 (aceasta se numește limita inferioară a matricei) și continuă până la numărul pe care îl specificați în instrucțiunea Dim (aceasta se numește limita superioară a matricei). Dacă preferați ca indicele inferior să înceapă la 1, includeți următoarea instrucțiune în partea superioară a modulului (cu alte cuvinte, înainte de a declara prima functie): Option Base 1 Rețineți, de asemenea, că după resetarea limitei inferioare în acest fel, dacă doriți să declarați un vector cu același număr de elemente, atunci trebuie să ajustați în mod corespunzător limita superioară din instrucțiunea Dim. De exemplu, dacă limita inferioară este setată la 1, dacă doriți să declarați un vector numit angajati care să conțină 20 de nume, atunci trebuie să declarați: Dim angajati (20) As String
Alocare dinamică Declararea unui vector sau matrici cu instrucțiunea Dim permite doar folosirea numerelor pentru definirea limitei inferioare sau superioare a vectorului sau matricii. Dacă dorim dimensionarea dinamică a vectorului sau matricii funcție de valoarea unei variabile se folosește instrucțiunea ReDim. Dim angajati () As String... n = 10 ReDim angajati (n) Remarcați că în instrucțiunea ReDim nu am mai declarat tipul de dată (As String). Declararea unui vector sau matrici cu alocare dinamică poate fi simplificată eliminând complet instrucțiunea Dim, ca mai jos:... n = 10 ReDim angajati (n) As String În acest caz folosim doar instrucțiunea ReDim pentru a declara și inițializa vectorul angajati cu limita superioară n, specificând și tipul de data (String). Matrici Dacă introduceți un singur număr între paranteze într-o instrucțiune Dim, VBA creează o matrice unidimensională (vector). Puteți crea matrici cu două sau mai multe dimensiuni (60 este maximul) declarand limitele superioare ale ficărei dimensiuni separate prin virgule. De exemplu, să presupunem că doriți să stocați atât numele, cât și prenumele în tabloul angajati. Pentru a stoca două seturi de date cu fiecare element, declarăm o matrice bidimensională, după cum urmează:
Dim angajati (19, 1) As String Indicii pentru cel de-al doilea număr funcționează le fel ca indicii pe i-am văzut deja. Cu alte cuvinte, încep de la 0 și continuă până la numărul pe care îl specificați. Deci, această declarație Dim stabilește un "tabel" (sau o matrice, așa cum se numește de obicei) cu 20 de rânduri (câte unul pentru fiecare angajat) și două "coloane" (unul pentru nume și unul pentru prenume). Deci, dacă o matrice unidimensională este ca o plajă Excel compusă din celule într-un singur rând sau coloană, o matrice bidimensională este ca o plajă Excel compusă din celule în mai multe rânduri sau coloane. Iată două instrucțiuni care inițializează datele pentru primul angajat: angajati (2, 0) = "Popescu" angajati (2, 1) = "Mircea" Transmiterea unei plaje de celule din Excel în VBA Pentru a transmite valorile dintr-o plajă de celule din Excel în VBA, putem folosi obiectul Range (specific Excel, nu VBA). O funcție simplă care are ca parametru un obiect de tip Range este dat mai jos: Dim r As Integer, c As Integer, numar As Integer r = p.rows.count c = p.columns.count numar = p.count
Obiectul Range, denumit p în exemplul de mai sus, are trei proprietăți care pot fi folosite pentru a afla dimensiunea selecției (plajei): p.rows.count returnează numărul de rânduri ale selecției, p.columns.count returnează numărul de coloane ale selecției, respectiv p.count numărul de celule selectate. Pentru a citi o plajă de celule unidimensionlă (pe un rând, sau o coloană) într-un vector, putem folosi procedura de mai jos: Dim i As Integer If p.rows.count = 1 Or p.columns.count = 1 Then ReDim vect(1 To p.count) As Double For i = 1 To p.count vect(i) = p(i) Next i End If Pentru a citi o plajă bidimensională, procedura este și mai simplă, folsind tipul de dată Variant. Dim m m = p Variabila m este declarată ca Variant și prin operațiunea de atribuire m = p, variabila va fi atât inițializată cât și umpută cu valorile din plaja de celule p.