Хммм ... синтаксис выглядит вполне законно без VBA передо мной. Прав ли я в том, что ваша проблема в том, что ваш код «компилируется» и выполняется без возникновения ошибки, но массив в коллекции никогда не изменяется? Если это так, я думаю, это потому, что ваш A.Item (1) может возвращать копию массива, который вы сохранили в коллекции. Затем вы просто получаете доступ и изменяете выбранный элемент, но он не дает желаемого эффекта, потому что это неправильный экземпляр массива.
Обычно коллекции VBA лучше всего работают при хранении объектов. Тогда они будут работать так, как вы хотите, потому что они хранят ссылки. Они хороши для хранения значений, но я думаю, что они всегда копируют их, даже «большие», такие как варианты массивов, что означает, что вы не можете изменить содержимое хранимого массива.
Считайте, что этот ответ всего лишь предположение, пока кто-то, кто знает базовый COM-материал, лучше не взвешивается. Хм ... пейджинг Джоэла Спольски?
РЕДАКТИРОВАТЬ: После испытания этого в Excel VBA, я думаю, что я прав. Помещение варианта массива в коллекцию делает копию, как и ее получение. Так что, похоже, нет прямого способа кодировать то, что вы на самом деле просили.
Похоже, что вам на самом деле нужен трехмерный массив, но тот факт, что вы пытались использовать коллекцию для первого измерения, подразумевает, что вы хотите иметь возможность изменять его размер в этом измерении. VBA позволит вам изменять только размер последнего измерения массива (см. «Redim preserve» в справке). Вы можете поместить свои двумерные массивы в одномерный массив, размер которого вы можете изменить, хотя:
ReDim a(5)
Dim b(2, 2)
a(2) = b
a(2)(1, 1) = 42
ReDim Preserve a(6)
Обратите внимание, что a объявляется с ReDim, а не Dim в этом случае.
Наконец, вполне возможно, что какой-то другой подход к тому, что вы пытаетесь сделать, был бы лучше. Растущие, изменяемые трехмерные массивы сложны и подвержены ошибкам, если не сказать больше.