2013-04-27 1 views
0

Итак, я хочу создать массив массивов, и из того, что я собираю, мне нужен неровный массив.Jagged Arrays в VBA

У меня есть массив x (i, j), который определяет квадратную nxn-матрицу целых чисел. Для каждой итерации k два целочисленных значения внутри этого массива меняются местами, чтобы попытаться и улучшить матрицу x (i, j). Мне нужно создать массив, который сохраняет эту матрицу x (i, j) после каждой итерации k.

Для уточнения, скажем, если у меня есть

1 2 3 
4 5 6 
7 8 9 

И я выполняю итерацию подкачки два элемента внутри массива:

7 2 3 
4 5 6 
1 8 9 

Я хочу, чтобы иметь возможность хранить эти массивы внутри массива напомнить в любое время. Я попытался найти решение здесь:

Dim y() As Variant 'Declare as a variant to contain arrays 
ReDim y(1 To IterationLimit) 'This will be the jagged array 

For k = 1 To IterationLimit 
'Some code goes here for the swap 
    y(k) = x(i,j) 
next k 

Теперь скажите, что я хочу 85-й итерации. Я хочу иметь возможность ввести y (85) [или аналогичный], чтобы подтянуть матрицу x (i, j) за это конкретное время.

Надеюсь, я объяснил это достаточно хорошо. Любая помощь приветствуется, я действительно застрял на этом.

изменить: удаленный код

+0

когда вы говорите, что у вас есть массив 'x (i, j) 'do' i' и 'j' представляют границы этого массива? Или '' массив массивов, один из дочерних массивов которого определяется индексом '(i, j)'? –

+0

i и j действительно представляют границы да. Итак, для приведенного выше примера я думаю, что это будет x (от 1 до 3, от 1 до 3). – Matt

+0

Чтобы дать вам немного больше информации. Если бы я должен был ссылаться на x (2,2) из ​​приведенной выше матрицы, это означало бы значение в вторая строка и второй столбец, т. е. 5. Не уверен, помогает ли это или нет. – Matt

ответ

5

OK. Я думаю, вы можете просто не назначать массивы y правильно. Как я уже говорил в комментариях:

y(k) = x(i,j) является ТОЛЬКО хранить значение, представленное I/J, координаты в x массиве.

Для того, чтобы y(k) сослаться на весь массив x в то время, вы могли бы сделать:

y(k) = x

Если это все еще не работает, то, возможно, что-то еще неправильно. Вот пример, когда у меня есть массив 2x2 (base 0), который называется baseArray, который я явно заполняю некоторыми значениями. Я повторяю от i = 0 to itLimit, и в каждой итерации я перебираю элементы в массиве, умножая значения на 2 и сохраняя в переменной массива tmpArray. После того, как значения были преобразованы, я сохраняю их в arrContainer и перехожу к следующей итерации For i = 0 to itLimit.

Sub FunWithArrays() 
Dim itLimit As Integer '## Iteration limit.' 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 
Dim baseArray(2, 2) As Variant '## an example array.' 

    '## Put some dummy data in this array.' 
    baseArray(0, 0) = 1 
    baseArray(0, 1) = 65 
    baseArray(0, 2) = 13 
    baseArray(1, 0) = 14 
    baseArray(1, 1) = 29 
    baseArray(1, 2) = 44 
    baseArray(2, 0) = 9 
    baseArray(2, 1) = 16 
    baseArray(2, 2) = 33 

Dim tmpArray(2, 2) As Variant '## This will temporarily hold values as we transform them.' 
Dim arrContainer() As Variant '## an array of arrays, to store the iteration arrays.' 

    itLimit = 2 '## set a max iteration.' 

    For i = 0 To itLimit 
     '## Transform the base array somehow' 
     For j = LBound(baseArray, 1) To UBound(baseArray, 1) 
      For k = LBound(baseArray, 2) To UBound(baseArray, 2) 
       tmpArray(j, k) = baseArray(j, k) * 2 
      Next 
     Next 
     ReDim Preserve arrContainer(i) 
     arrContainer(i) = tmpArray 
    Next 

    Dim y As Variant 
    '## Now, refer to a single iteration stored in the arrContainer variable: 

    y = arrContainer(2) 

End Sub 

В первом скриншоте, я использую Locals окно для обзора переменных и то, что они содержат. После первой итерации, вы можете увидеть, что tmpArray была заселена, и это те же размеры, как baseArray, но значения в нем были умножены на 2.

Screenshot after the first iteration

Рассматривая переменную arrContainer, мы видим, что это имеет только 1 элемент, и этот элемент представляет собой массив, равный tmpArray, который мы создали на итерации выше.

Screenshot of arrContainer after the first iteration

После последней итерации, мы можем рассмотреть arrContainer и увидеть, что она содержит 3 пунктов (от 0 до 2, в нашем For i to itLimit цикле). Каждый массив внутри arrContainer равен одному из массивов, созданных на итерации выше.

Screenshot of arrContainer array of arrays after all iterations

Теперь мы можем обратиться к этим пунктам, как:

Dim y as Variant y = arrContainer(2) '# or any in bounds index could be used instead of "2"'

И, наконец, используя окно Locals VBE обзор y:

Final screenshot referring to a single array item within arrContainer

+0

@David Zemens О, это отлично, он работает! Окно местных жителей - это то, что я никогда раньше не думал об использовании, но он оказался действительно полезным! И для вывода в ячейки я использовал ячейки (20 + i, 20 + j) .Value = ArrContainer (80) (i, j) [внутри цикла i и j For]. Только один вопрос! Какова цель заповедника ReDim? Что делает заповедник? – Matt

+0

@Matt 'ReDim' позволяет повторно объявить и/или изменить размер массива. 'Preserve' сохраняет существующие значения. Разница между 'ReDim arrContainer (3)' и 'ReDim Preserve arrContainer (3)' заключается в том, что первый оператор задает массив с верхней границей = 3, но стирает его содержимое, тогда как последний измеряет массив с верхней границей = 3, а сохраняя его содержимое. –

+0

@Matt Далее: Мы изначально определяли 'arrContainer как Variant' без ограничений, поэтому утверждение, подобное' arrContainer (0) = "blah", будет ошибочным. Каждая итерация 'ReDim Preserve' делает массив больше (для размещения нового значения) и сохраняет существующее содержимое.Вы можете «ReDim arrContainer (itLimit-1)» после установки 'itLimit', который создаст массив правильного размера. Но при работе с циклами часто размер заранее неизвестен, поэтому я предпочитаю «ReDim Preserve» в цикле. –