TOP

VBA-Lecția 13.2. Utilizarea matricelor (Arrays) (Continuare)


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

Matrice dinamică

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)

Ubound

Î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

Salvarea datelor într-o serie de elemente de matrice

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).

Matrice (Array)

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

Convertiți textul în matrice (VBA Split)

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