Tablice Array są istotnym elementem wielu rozwiązań tworzonych w VBA. Co zrobić jednak w sytuacji gdy określoną tablicę (jedno- lub wielowymiarową) chcemy przefiltrować ze względu na określone zmienne kryteria? W Excelu rozwiązanie to wydaje się być proste - przenieść tablicę do komórek Excela i zastosować filtrowanie. Co jednak zrobić w kodzie VBA stworzonym w innych aplikacjach z pakietu Office? Odpowiedź jest relatywnie prosta- należy przekonwertować tablicę Array na obiekt ADODB.Recordset aby następnie zyskać możliwość filtrowania danych zgodnie z zasadami języka SQL. Myślę więc, że każdy kto spotkał się z podobnym problemem może uznać niniejsze zagadnienie za interesujące.
Krok 1- tworzymy referencję do biblioteki ADODB z poziomu edytora VBA (Menu >> Tools >> References... >> zaznaczamy Microsoft ActiveX Data Objects 2.8 Library)
Krok 2- tworzymy tablicę array przenosząc komórki Excela do tablicy lub tworząc ją na poziomie kodu.
02 | Dim arrTemp(100, 1) As Variant |
09 | arrTemp(i, 1) = "Produkt " & _ |
10 | Chr(65 + Int(Rnd() * 26)) & _ |
Krok 3- tworzymy obiek ADODB.Recordset i konfigurujemy pola tego obiektu
1 | Dim RS As ADODB.Recordset |
2 | Set RS = New ADODB.Recordset |
5 | RS.Fields.Append "ID" , adBigInt, , adFldKeyColumn |
6 | RS.Fields.Append "ProductName" , adVarChar, 50 |
Krok 4- przenosimy dane z tablicy do obiektu Recordset
3 | RS( "ID" ).Value = arrTemp(i, 0) |
4 | RS( "ProductName" ).Value = arrTemp(i, 1) |
Krok 5- tak utworzony obiekt możemy swobodnie filtrować korzystając z właściwości .Filter obiektu Recordset. W poniższym kodzie efekt filtrowania testujemy przenosząc wybrane wartości obiektu Recordset do komórek arkusza Excel.
03 | .Filter = "ID >5 and ID <20" |
04 | ActiveCell.CurrentRegion.Clear |
05 | ActiveCell.CopyFromRecordset RS |
11 | ActiveCell.CurrentRegion.Clear |
12 | ActiveCell.CopyFromRecordset RS |
16 | .Filter = "ProductName LIKE '%Z%'" |
17 | ActiveCell.CurrentRegion.Clear |
18 | ActiveCell.CopyFromRecordset RS |