2017-02-15 8 views
1

Я не знаю, как заполнить многомерный массив. Вот мой код, который я только начал понимать, но я не знаю, что не так, он не работает, за исключением одного цикла.VBA Redim Preserve

Sub test() 
    Dim Arr1 As Variant 
    Dim Row As Long 
    For Row = 0 To 3    
     ReDim Arr1(9, Row) 
     Arr1(0, Row) = "Zero" 
     Arr1(1, Row) = "One" 
     Arr1(2, Row) = "Two" 
     Arr1(3, Row) = "Three" 
     Arr1(4, Row) = "Four" 
     Arr1(5, Row) = "Five" 
     Arr1(6, Row) = "Six" 
     Arr1(7, Row) = "Seven" 
     Arr1(8, Row) = "Eight" 
     Arr1(9, Row) = "Nine"  
     Row = Row + 1 
     ReDim Preserve Arr1(9, Row)   
    Next Row 
    MsgBox Arr1(0, 0) 
End Sub 

Благодаря

+3

первый ReDim находится внутри для??? – gbianchi

+0

Это будут жестко заданные значения, которые вы помещаете в массив (т. Е. Является ли код в вопросе только MCVE, или это фактически данные, которые вы хотите использовать)? Или вы собираетесь устанавливать значения из диапазона на листе? Или они рассчитали значения? – YowE3K

ответ

2

Попробуйте это:

Sub test() 
    Dim limit As Integer 
    limit = 3 'get limit from somewhere 

    Dim Arr1 as Variant   
    Redim Arr1(0 To 9, 0 To limit) As Variant 

    Dim Row As Long 
    For Row = 0 To 3    
     Arr1(0, Row) = "Zero" 
     Arr1(1, Row) = "One" 
     Arr1(2, Row) = "Two" 
     Arr1(3, Row) = "Three" 
     Arr1(4, Row) = "Four" 
     Arr1(5, Row) = "Five" 
     Arr1(6, Row) = "Six" 
     Arr1(7, Row) = "Seven" 
     Arr1(8, Row) = "Eight" 
     Arr1(9, Row) = "Nine"   
    Next Row 
    MsgBox Arr1(0, 0) 
End Sub 

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

Кроме того, Next Row делает то же самое, как Row=Row+1, так что вы не хотите, как

Update

Если вы хотите, вы также можете поместить свои строки в массиве

Sub test() 
    Dim limit As Integer 
    limit = 3 'get limit from somewhere 

    Dim Arr1 as Variant   
    Redim Arr1(0 To 9, 0 To limit) As Variant 

    Dim numbers As Variant 
    numbers = Array("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine") 

    Dim Row As Integer, Col As Integer 
    For Row = 0 To 3 
     For Col = 0 To 9 
      Arr1(Col, Row) = numbers(Col) 
     Next Col 
    Next Row 
    MsgBox Arr1(0, 0) 
End Sub 

Обновление 2

Там действительно так много способов кожи кошки ... Как насчет использования коллекций:

Sub test() 
    Dim numbers As Variant 
    numbers = Array("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine") 

    Dim col As Collection 
    Set col = New Collection 

    Dim i As Integer 
    For i = 0 To 3 'get limit from somewhere 
     col.Add numbers 
    Next i 

    MsgBox col(1)(0) 'col(1 to 4)(0 to 9) 
End Sub 
+1

фактически строка +1 сделает итерацию на 2 шага короче – gbianchi

+0

Спасибо - я так не объяснил! – CallumDA

+0

Привет, спасибо, но второе измерение от 0 до 3 не фиксировано и динамично, как я могу его изменить? – Shan

2

Диапазон может быть использован, чтобы повторить их без петли:

Dim r As Range, Arr1 
Set r = Cells.Resize(10, 4) 

r = [{"Zero";"One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine"}]  
Arr1 = r   ' Arr1 is now (1 To 10, 1 To 4) As Variant 
r.ClearContents 
+0

Wizardry! .. Хороший ответ – CallumDA

+0

Wizardry? Едва. Красиво изящный - да :) – PaulG