TOP

VBA-Lecția 13.1. Utilizarea matricelor (Arrays)

Matricele (Arrays) sunt foarte des folosite în programare, inclusiv în Excel VBA.

O matrice este în esență o singură variabilă cu mai multe celule pentru a stoca valori, în timp ce o variabilă tipică are o singură celulă de stocare în care poate stoca o singură valoare.

O matrice poate fi accesată în ansamblu dacă doriți să vă referiți la toate valorile pe care le conține sau vă puteți referi la elementele sale individuale.

Puteți declara o matrice să funcționeze cu un set de valori de același tip de date. Am tratat deja acest lucru în VBA-Lecția 6.2. Datatypes Dar haideți să ne aruncăm și mai adânc acum...

De ce sunt folosite matrice?

Imaginați-vă că încercați să scrieți o procedură în care trebuie să stocați până la 500 de valori. Dacă trebuie să creați 500 de variabile separate, va fi foarte dificil. În mijlocul matricei, stocarea și lucrul cu aceste valori va fi mult mai ușor.

Al doilea motiv pentru a folosi matrice este viteza lor. Citirea datelor din matrice durează mult mai puțin decât din tabele (formate din celule) din foaia de lucru Excel.


Un exemplu de utilizare a matricelor

Așadar, iată un exemplu care va arăta avantajul evident de a folosi matrice VBA în Excel.

Prima foaie de lucru ("DS") are un set de date: 5000 de rânduri pe 3 coloane:

Pe a doua foaie, veți găsi un tabel rezumativ care ia în considerare toate răspunsurile „Da” („YES”) pe an și client:

În acest caz, procedura va folosi o buclă pentru a procesa setul de date și a înregistra numărul de răspunsuri „Da” pentru fiecare an și pentru fiecare număr de client, apoi va introduce datele respective în celulele corespunzătoare.

Fără a utiliza matrice, ar dura Excel 131,44 secunde pentru a executa această procedură:

Dar pentru a salva mai întâi datele într-o matrice (din foaia de lucru „DS”) și apoi pentru a efectua aceleași calcule (folosind matricele în loc de setul de date din foaia de lucru „DS”) va dura doar 1,74 secunde:

Dacă decidem să ne optimizăm procedura prin stocarea numai a datelor care conțin răspunsuri „YES” în matrice (care reprezintă aproximativ 3/4 din totalul datelor), ar dura doar 1,02 secunde:

Acesta este un bun exemplu despre modul în care utilizarea matricelor vă permite să efectuați o procedură de 128 de ori mai rapid. Rezultatul optimizării noastre ar fi și mai bun dacă am lucra cu mai multe seturi de date în același timp.

Vom reveni la detaliile exemplului nostru la sfârșitul lecției.

Declararea matricelor

Mai jos sunt câteva exemple de declarare a tablourilor în tblVBAtbl (dacă primele două exemple nu vă sunt clare, citiți-l din nou):

 'Un exemplu de declarare a unui tablou unidimensional
 Dim array1(4)

 'Un exemplu de declarare a unui tablou bidimensional
 Dim array2(6, 1)

 'Un exemplu de declarare a unui tablou dinamic
 Dim array3()

Dacă nu puteți introduce valori fixe atunci când declarați matrice (deoarece depind, de exemplu, de dimensiunea setului de date), lăsați parantezele goale.

Nu trebuie să declarați un tip de date (șir, lung etc.), deși în multe cazuri acest lucru va încetini execuția procedurii dumneavoastră.

Stocarea datelor într-o matrice

Să încercăm să stocăm câteva date într-o matrice:

Dorim să stocăm valori de 11x1 în acest caz, așa că trebuie să creăm o matrice unidimensională:

 'Declaraţie
 Dim array_example(10)

Nu uitați că numerotarea elementelor din matrice începe cu 0 (acesta este standard în programare, așa că merită să intrați imediat în acest obicei, deși, de fapt, puteți schimba această abordare în VBA).

Fiecare element din matrice își va primi acum valoarea:

 'Salvarea valorilor într-o matrice
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

Puteți opera sau modifica fiecare element de matrice ca și cum ar fi o variabilă normală.

În continuare este un exemplu în care folosim array_example(8):

Sub example()
     'Declaraţie
     Dim array_example(10)
     
     'Salvarea valorilor într-o matrice
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     'Testul 1
     MsgBox array_example(8) '=> întoarce : 04/02/2016
    
     'Schimbarea uneia dintre valori
     array_example(8) = Year(array_example(8))
     
     'Testul 2
     MsgBox array_example(8) '=> returnări: 2016
End Sub

O buclă For ar fi o opțiune mai bună pentru a salva matricea mai repede:

 'Declaraţie
 Dim array_example(10)

 'Salvarea valorilor într-o matrice
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next