Pentru a stoca mai mult de o coloană de date, avem nevoie de o dimensiune diferită a matricei. Exemplu:
Salvarea datelor într-o matrice bidimensională:
'Declaraţie Dim array_example(10, 2) 'Matrice „definită” de 11 x 3 'Salvarea datelor într-o matrice For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Iată câteva exemple de lucru cu aceste valori:
MsgBox array_example(0, 0) '=> returneaza: 03.11.2026 MsgBox array_example(0, 1) '=> returnează: 24 MsgBox array_example(9, 2) '=> returnează: NO MsgBox array_example(10, 2) '=> returnează: YES
Să ne imaginăm pentru un moment că trebuie să actualizăm datele din matricea noastră în mod regulat și, prin urmare, nu putem aloca valori fixe în momentul declarației...
Pentru a afla numărul de rând al ultimei celule nevide, sau cu alte cuvinte, ultimul rând al bazei noastre de date, vom folosi următoarea formulă:
last_row = Range("A1").End(xlDown).Row
Excel nu acceptă variabile în declarație.
În schimb, declarați o matrice dinamică (folosind paranteze goale), apoi definiți dimensiunea acesteia folosind Redim:
Dim array_example() ReDim array_example(last_row - 2, 2)
Utilizând următoarea procedură, puteți stoca toate rândurile setului de date (tabel) în matricea noastră:
Dim array_example() ReDim array_example(last_row - 2, 2)
În exemplul anterior, ultimul număr din matricea noastră a fost last_row - 2:
For i = 0 To last_row - 2
O altă modalitate de a determina ultimul număr din matricea noastră ar putea fi folosind Ubound:
For i = 0 To UBound(array_example)
Această funcție returnează cel mai mare număr din matrice pentru dimensiunea selectată (prima dimensiune este implicită).
Iată câteva exemple care vor face acest lucru mai clar:
Sub example() Dim array_example(10, 2) MsgBox UBound(array_example) '=> returnează: 10 MsgBox UBound(array_example, 1) '=> returnează: 10 MsgBox UBound(array_example, 2) '=> returnează: 2 End Sub
Este posibil să populați o matrice cu valori dintr-un interval de celule dintr-o foaie de lucru fără a utiliza măcar o buclă:
'Declaraţie Dim array_example(10, 2) 'Matrice „definită” de 11 x 3 'Salvarea datelor într-o matrice For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Codul precedent poate fi înlocuit efectiv cu acesta:
'Declaraţie Dim array_example() 'Salvarea datelor într-o matrice array_example = Range("A2:C12").Value
Desi a doua metoda pare mai atractiva decat prima, ai grija ca in cele mai multe cazuri te poate costa mai mult timp implementarea decat prima.
Dacă stocați datele în matrice în acest fel, primul număr va fi 1 în loc de 0, ceea ce poate provoca confuzie...
Mai târziu, în procesul de creștere a codului, dacă decideți să stocați doar datele care îndeplinesc anumite criterii de căutare în matrice (sau să efectuați o operație complet diferită), va trebui să rescrieți complet codul folosind o funcție de buclă diferită...
Dar această a doua metodă este destul de utilă dacă trebuie să salvați întregul conținut al unui set mare de date, deoarece este mai rapidă decât bucla (economisind aproximativ 0,2 secunde pentru fiecare 15.000 de înregistrări).
Dar dacă trebuie să creați o matrice care are conținut „fix”.
O soluție ar putea fi înregistrarea valorilor bandă cu bandă:
Dim en(5) en(0) = "IF" en(1) = "VLOOKUP" en(2) = "SUM" en(3) = "COUNT" en(4) = "ISNUMBER" en(5) = "MID"
Din fericire, puteți simplifica acest cod folosind o matrice (Array):
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
Iată o demonstrație a utilizării funcției Replace (aceasta vă va ajuta să înțelegeți următorul exemplu):
Sub replace_example() Dim var_translate As String 'Panglică de text pentru acest exemplu var_translate = "Hello World !" 'Înlocuiește „Lumea” cu „tu” în panglica de text var_translate = Replace(var_translate, "World", "you") 'Bandă după înlocuire MsgBox var_translate '=> returnează „Bună ziua!” End Sub
Acum, dacă vrem să înlocuim o serie de valori cu un alt set de date, folosirea matricelor și a funcției Array va fi extrem de utilă:
Sub translate() 'Un exemplu simplificat de traducere a formulelor din engleză în franceză Dim var_translate As String 'Panglică de text pentru acest exemplu var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))" 'Două seturi de valori en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT") 'Înlocuiți „SI” cu „IF”, „RECHERVEV” cu „VLOOKUP”, etc. For i = 0 To UBound(en) var_translate = Replace(var_translate, en(i), fr(i)) Next 'Bandă după înlocuire MsgBox var_translate '=> returnează „Formula pentru a traduce: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))” End Sub
Funcția Split ne permite să împărțim șirul de caractere în părți și să scriem valorile rezultate într-o matrice.
Pentru a converti o panglică într-o matrice, procedați în felul următor:
variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
Utilizați funcția VBA Split și specificați separatorul:
en = Split(variable, "/")
Matricea „en” va returna următoarele valori:
MsgBox en(0) '=> returnează: IF MsgBox en(1) '=> returnează : CĂUTARE V MsgBox en(2) '=> returnează: SUM MsgBox en(3) '=> returnează: COUNT MsgBox en(4) '=> returnează: ISNUMBER MsgBox en(5) '=> returnează: MID
Următoarele 3 matrice vor returna, de asemenea, aceleași valori:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",") en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
Următorul exemplu returnează a treia valoare din șir:
MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> returnează: SUM
Inversul lui Split este funcția VBA Join.
Această funcție colectează valorile unui tablou într-un șir.
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> returnează: 12345