Zgodnie z definicją dynamiczna tablica wielowymiarowa może zmienić swój rozmiar (ilość elementów) tylko w zakresie ostatniego jej wymiaru. Jeżeli więc zdefiniujemy naszą tablicę następująco:
1 | Dim myArrayA() As Variant |
to redefinicja wymiaru dotyczyć może tylko drugiego wymiaru, pierwszy wymiar zawsze pozostanie o stałej wielkości równej 1. Możliwe będą więc następujące dalsze procesy:
Możemy jednak stworzyć tablicę wielowymiarową jako złożenie dwóch tablic. W sytuacji tej każdy element tablicy głównej zawierał będzie tablicę podrzędną. Tak mógłby wyglądać zapis takiego rozwiązania:
1 | Dim myArrayB() As Variant |
4 | myArrayB(0) = Array( "0x0" , "0x1" , "0x2" ) |
5 | myArrayB(1) = Array( "1x0" , "1x1" ) |
6 | myArrayB(1) = Array( "1x0" , "1x1" , "1x2" ) |
8 | ReDim Preserve myArrayB(2) |
9 | myArrayB(2) = Array( "2x0" , "2x1" , "2x2" ) |
Jak widać w powyższym przypadku wymiar tablicy głównej można swobodnie zmieniać jak również elementy tablicowe w jej wnętrzu mogą również posiadać różne wymiary. Rozwiązanie to posiada jednak swoje wady, z których części można zaradzić, o czym w dalszej części wpisu.
Wadą pierwszą jest to, że o ile w przypadku pierwszej tablicy dany element pobieramy korzystając z zapisu:
o tyle w drugim przypadku zapis ten jest następujący:
O ile z powyższym w większości przypadków radzimy sobie bez problemu, o tyle problem zasadniczy pojawia się w sytuacji, gdy próbujemy przenieść tablicę do komórek Excela. Dla powyższych przypadków (indeks wymiaru tablic to 2) zapisy te będą następujące:
1 | ActiveCell.Resize(3,3) = myArrayA >> zapis poprawny i skuteczny |
2 | ActiveCell.Resize(3,3) = myArrayB >> zapis poprawny ale nieskuteczny |
Chcąc rozwiązać problem dot. tablicy myArrayB i skutecznie przenieść jej wartości do zakresu komórek arkusza wystarczy tablicę tą dwukrotnie transponować. Poniższa instrukcja umożliwia prawidłowe wykonanie tej operacji:
1 | ActiveCell.Resize(3, 3) = Application.Transpose( _ |
2 | Application.Transpose(myArrayB)) |