2016-10-23 2 views
2

Я ищу способы реализовать следующие функции в моем макросе VBA. У меня есть 2D-массив размером (xx, yy), который я хочу динамически заполнить. Проблема в том, что возвращаемые значения функции возвращают 1D массивы. с обратным размером (yy, 1) вместо (1, yy). Есть ли способ динамически назначать следующие строки, используя массивы, возвращаемые fuction. Псевдо-код, реализующий функциональность ниже:Назначение 1D массивов для 2D-массива в VBA

Dim X() As Double 
ReDim X(1 to xx, 1 to yy) 
Dim i As Long 

For i=1 To xx 
    X(i,)= FunctionReturningArrayOfSize(1 to yy, 1 to 1) 
Next i 

EDIT: Просто чтобы ясно - каждая строка моего результирующего массива X возвращается в исполнении FunctionReturningArrayOfSize (в цикле).

+0

Нет, нет возможности назначить часть массива другому массиву, отличному от цикла For. Вы пытаетесь повторить массив 'FunctionReturningArrayOfSize'' xx' раз? – Slai

+0

Да, я хочу повторять это xx раз, возвращая и массив (yy, 1) каждый раз. В результате я хочу иметь массив (xx, yy). – Max

ответ

1

Вы используете Excel, поэтому вы можете использовать функцию Transpose от VBA.

Transpose автоматически преобразует 1D-массив в 2D-массив.

Sub Test() 

    Dim a1D() As Variant 
    'Assign a 1D array 
    a1D = Array(1, 2, 3, 4, 5, 6) 

    Dim a2D As Variant 
    'Transpose to a 2D array 
    a2D = Application.WorksheetFunction.Transpose(a1D) 

End Sub 
1

Вы можете назначить 1D массив для 2D Range, но не для части другого массива.

Dim X() ' has to be Variant array 
With Range("A1").Resize(xx, yy) 
    .Value2 = FunctionReturningArrayOfSize(1 to yy, 1 to 1) 
    X = .Value2 ' or X = WorksheetFunction.Transpose(.Value2) to rotate it 
End With 
+0

Есть ли способ включить цикл for с таким подходом? – Max

+0

@Max. Пункт этого примера состоит в том, что он будет повторять значения yy функции FunctionReturningArrayOfSize xx раз без каких-либо циклов. Вам нужен пример цикла For по строкам, столбцам или ячейкам? – Slai

Смежные вопросы