Operowanie na tablicach jest w VBA chlebem powszednim. Danych nie powinniśmy przetwarzać bezpośrednio w komórkach arkusza, lecz właśnie w tablicy. Pewnym problemem jest konwersja komórki do tablicy. VBA nie tworzy wtedy jednoelementowej tablicy, lecz pojedynczą wartość typu Variant. Może to nieść ze sobą sporo problemów.
Z Komórek Do Tablicy
Zgranie zakresu komórek do tablicy jest bardzo proste. Wystarczy zadeklarować zmienną typu Variant i przypisać jej konkretny zakres (obiekt Range).
Problem pojawia się, gdy chcemy przerzucić do tablicy pojedynczą komórkę. Excel nie tworzy wtedy tablicy jednoelementowej (nawet gdy użyjemy transpozycji), ale traktuje tą komórkę jako wartość typu Variant.
Taka sytuacja może przyczyniać się do błędów w kodzie. Często bowiem przekazujemy taką tablicę jako argument w funkcji lub makrze. W tym przypadku nie przekazujemy jednak tablicy, ale pojedynczą wartość. Możemy o tym nie wiedzieć.
Array Przychodzi z Pomocą!
Aby temu zaradzić możemy skorzystać z wbudowanej funkcji Array. Poniższa funkcja VBA UtworzTablice realizuje to zadanie. W przypadku zakresu komórek – korzystamy z transpozycji. Gdy zaś argumentem jest pojedyncza komórka następuje jej konwersja do tablicy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Function UtworzTablice(ByRef Target As Range) As Variant Dim avTemp As Variant ' Gdy targetem jest jedna komórka ' przekonwertuj ją na jednoelementową tablicę. ' W przeciwnym wypadku przetransponuj zakres 1 If Target.Cells.Count = 1 Then 2 avTemp = Array(Target) 3 Else 4 avTemp = WorksheetFunction.Transpose(Target) 5 End If ' Wynikiem funkcji jest nowa tablica 6 UtworzTablice = vaTemp End Function |
Procedura główna ZakresDoTablicy pokazuje, że możemy za pomocą takiej samej pętli przejść po wszystkich elementach tablicy. Bez znaczenia czy zawiera ona jeden element czy więcej.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub ZakresDoTablicy() Dim avNowa As Variant Dim iLicznik As Integer ' Utwórz tablicę z jednej komórki 1 avNowa = UtworzTablice(Arkusz1.Range("A1")) ' Przejdź w pętli po elementach tablicy (jeden element) 2 For iLicznik = LBound(avNowa) To UBound(avNowa) 3 Debug.Print avNowa(iLicznik) 4 Next iLicznik ' Utwórz tablicę z zakresu komórek 5 avNowa = UtworzTablice(Arkusz1.Range("A1:A3")) ' Przejdź w pętli po wszystkich elementach tablicy 6 For iLicznik = LBound(avNowa) To UBound(avNowa) 7 Debug.Print avNowa(iLicznik) 8 Next iLicznik End Sub |