Hmmm ... składnia wygląda prawny wystarczy bez VBA przede mną. Czy mam rację, że twój problem polega na tym, że twój kod "kompiluje się" i wykonuje bez podnoszenia błędu, ale tablica w kolekcji nigdy się nie zmienia? Jeśli tak, myślę, że to dlatego, że Twój A.Item (1) może zwracać kopię z tablicy przechowywanej w kolekcji. Następnie uzyskujesz dostęp do wybranego elementu i go modyfikujesz, ale nie ma pożądanego efektu, ponieważ jest to niewłaściwa instancja tablicy.
Ogólnie kolekcje VBA działają najlepiej podczas przechowywania obiektów. Wtedy będą działać tak, jak chcesz, ponieważ przechowują odniesienia. Są one odpowiednie do przechowywania wartości, ale myślę, że zawsze je kopiują, nawet "duże", takie jak warianty macierzy, co oznacza, że nie można zmutować zawartości przechowywanej tablicy.
Rozważ tę odpowiedź tylko do czasu, aż ktoś, kto zna leżące u podstaw rzeczy COM, poczuje się lepiej. Um ... woła Joel Spolsky?
EDYCJA: Po wypróbowaniu tego w programie Excel VBA, myślę, że mam rację. Umieszczenie wariantu tablicowego w zbiorze powoduje utworzenie kopii, a więc jej usunięcie. Tak więc nie wydaje się, że istnieje bezpośredni sposób kodowania tego, o co prosiłeś.
Wygląda na to, czego faktycznie potrzebujesz, to tablica 3-D, ale fakt, że używałeś kolekcji dla pierwszego wymiaru, oznacza, że chcesz mieć możliwość zmiany jej rozmiaru w tym wymiarze. VBA pozwoli ci tylko zmienić rozmiar ostatniego wymiaru tablicy (patrz "Zachowaj redim" w pomocy). Ci może umieścić tablice 2-D wewnątrz tablicy 1-D, które można zmienić rozmiar, choć:
ReDim a(5)
Dim b(2, 2)
a(2) = b
a(2)(1, 1) = 42
ReDim Preserve a(6)
pamiętać, że jest zadeklarowana z Redim nie Dim w tym przypadku.
Wreszcie jest całkiem możliwe, że inne podejście do tego, co próbujesz zrobić, byłoby lepsze. Growable, zmienne tablice 3-D są skomplikowane i podatne na błędy.
Nie sądzę, że Arr2 (1, 1) = 11 faktycznie zmienia tablicę w kolekcji. Zobacz moją edytowaną odpowiedź, ale wygląda na to, że VBA tworzy kopię tablicy podczas dodawania i czytania z kolekcji. – jtolle
Może zostałem wprowadzony w błąd przez twój komentarz? Ta linia zmienia Arr2, ale nie tablicę zapisaną w kolekcji. Widzę, że zmienia Arr2, ale nie A.Item (1), który jest po prostu kopią Arr2 stworzoną przez A.Add (Arr2). – jtolle
@jtolle: przepraszam, właśnie sprawdziłem i masz absolutną rację. Zaktualizuję powyższy kod. Jest to kopia Arr2 w kolekcji. –