Pentru a exersa utilizarea matricelor, vom crea propria noastră versiune a macrocomenzii pe care am folosit-o pentru a demonstra avantajul de viteză al matricelor, pas cu pas...
Iată punctul de pornire pentru acest exercițiu (veți vedea că setul de date a fost redus la 1000 de rânduri):
Aici puteți descărca fișierul exemplu Excel: arrays_exercise.xls
Obiectivul exercițiului: Procedura ar trebui să parcurgă datele din setul de date și să numere numărul de răspunsuri DA sau NU pentru fiecare an și pentru fiecare număr de client (fie DA sau NU în funcție de alegerea utilizatorului) și să introducă această cantitate în celula specificată a fisa de lucru.
Completați următoarea macrocomandă pentru a salva datele din foaia de lucru „DS” într-o matrice:
Sub actualize() Dim last_row As Integer 'Ultimul rând al setului de date '... 'Salvarea unui set de date într-o matrice dinamică Dim array_db() '... End Sub
Iată un exemplu de soluție:
Sub actualize() Dim last_row As Integer 'Ultima linie a bazei de date last_row = Sheets("DS").Range("A1").End(xlDown).Row 'Salvarea unui set de date într-o matrice dinamică Dim array_db() ReDim array_db(last_row - 2, 2) For row_number = 2 To last_row array_db(row_number - 2, 0) = Sheets("DS").Range("A" & row_number) array_db(row_number - 2, 1) = Sheets("DS").Range("B" & row_number) array_db(row_number - 2, 2) = Sheets("DS").Range("C" & row_number) Next End Sub
Acest lucru repetă practic ceea ce am făcut în lecția anterioară...
Dar acum trebuie să ne modificăm macrocomandă adăugând următoarele acțiuni:
Iată un exemplu de soluție:
Sub actualize() Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer 'Ultima linie a bazei de date last_row = Sheets("DS").Range("A1").End(xlDown).Row 'Valoarea de căutare (YES sau NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If 'Numărul de răspunsuri YES sau NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value) 'Salvarea unui set de date într-o matrice Dim array_db() ReDim array_db(rows_number - 1, 1) insert_row = 0 For row_number = 2 To last_row value_yes_no = Sheets("DS").Range("C" & row_number) If value_yes_no = search_value Then array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number) array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number) insert_row = insert_row + 1 End If Next End Sub
Căutarea după alegerea utilizatorului este determinată la începutul procedurii de următorul cod:
'Valoarea de căutare (YES sau NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If
Vom folosi funcția CountIF pentru a determina numărul de răspunsuri „DA” sau „NU”:
'Numărul de răspunsuri YES sau NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
Matricea a fost redimensionată pentru a se potrivi cu numărul de răspunsuri DA sau NU și a fost redusă la două coloane:
ReDim array_db(rows_number - 1, 1)
Aceste date vor fi acum stocate în matrice atunci când a treia sa coloană se potrivește cu selecția utilizatorului:
'Inserarea unui număr într-o matrice insert_row = 0 'Prelucrarea setului de date For row_number = 2 To last_row 'Valoarea coloanei C (YES sau NO) value_yes_no = Sheets("DS").Range("C" & row_number) 'Dacă valoarea se potrivește cu selecția utilizatorului, șirul este stocat în matrice If value_yes_no = search_value Then 'Salvarea valorii în coloana A array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number) 'Salvarea valorii în coloana B array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number) 'Un rând a fost salvat => numărul de inserare în matrice este incrementat cu 1 insert_row = insert_row + 1 End If Next
Matricea noastră conține doar datele care ne interesează.
Tot ce mai rămâne de făcut este:
Iată un exemplu de soluție:
'Numărul de răspunsuri "YES"/"NO" For no_years = 2011 To 2026 For no_client = 1 To 30 counter = 0 For i = 0 To UBound(array_db) If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then counter = counter + 1 End If Next Cells(no_years - 2009, no_client + 1) = counter Next Next
Problemă rezolvată cu comentariile care o explică în detaliu:
'Bucla pentru fiecare rând For no_years = 2011 To 2026 'Buclă pentru fiecare coloană For no_client = 1 To 30 'Resetarea contorului counter = 0 'Prelucrare matrice For i = 0 To UBound(array_db) 'Verificarea ca rândul din tabel să corespundă cu anul și numărul de client If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then 'Dacă anul și numărul clientului se potrivesc, contorul crește cu 1 counter = counter + 1 End If Next 'După procesarea matricei, rezultatul este introdus în celula corespunzătoare Cells(no_years - 2009, no_client + 1) = counter Next Next
Și, în sfârșit, codul pentru întreaga noastră macrocomandă:
Sub actualize() Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer, counter As Integer 'Ștergerea conținutului Range("B2:AE17").ClearContents 'Ultimul rând din setul de date last_row = Sheets("DS").Range("A1").End(xlDown).Row 'Valoarea de căutare (YES sau NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If 'Numărul de răspunsuri YES sau NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value) 'Salvarea valorilor într-o matrice Dim array_db() ReDim array_db(rows_number - 1, 1) insert_row = 0 For row_number = 2 To last_row value_yes_no = Sheets("DS").Range("C" & row_number) If value_yes_no = search_value Then array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number) array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number) insert_row = insert_row + 1 End If Next 'Numărarea răspunsurilor YES sau NO For no_years = 2011 To 2026 For no_client = 1 To 30 counter = 0 For i = 0 To UBound(array_db) If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then counter = counter + 1 End If Next Cells(no_years - 2009, no_client + 1) = counter Next Next End Sub
Aici puteți descărca fișierul exemplu Excel: arrays_exercise_completed.xls