środa, 27 listopada 2013

Dynamiczne wymiary tablicy wielowymiarowej

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:

1Dim myArrayA() As Variant
2ReDim myArrayA(1,1)

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:

1ReDim myArrayA(1,2)
2ReDim myArrayA(1,5)
3'itd.

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:

1Dim myArrayB() As Variant
2ReDim myArrayB(1)
3    
4myArrayB(0) = Array("0x0", "0x1", "0x2")
5myArrayB(1) = Array("1x0", "1x1")
6myArrayB(1) = Array("1x0", "1x1", "1x2")
7 
8ReDim Preserve myArrayB(2)
9myArrayB(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:

1myArrayA(0,0)
2myArrayA(0,1

o tyle w drugim przypadku zapis ten jest następujący:

1myArrayB(0)(0)
2myArrayB(0)(1)

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:

1ActiveCell.Resize(3,3) = myArrayA    >> zapis poprawny i skuteczny
2ActiveCell.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:

1ActiveCell.Resize(3, 3) = Application.Transpose( _
2                           Application.Transpose(myArrayB))

Brak komentarzy:

Prześlij komentarz