Использование цикла For для создания новых массивов в VBA - PullRequest
1 голос
/ 12 июля 2019

долгое время слушатель, впервые звонящий
Мне нужно создать массивы, где размеры каждого массива и количество массивов определяется пользовательским вводом. Это означает, что каждый раз, когда выполняется код, будет создаваться различное количество массивов, и каждый массив может иметь разные измерения. Есть ли способ создать цикл for, который создаст для меня эти новые массивы в VBA?

Например, допустим, пользователь указывает на необходимость создания 3 массивов. Затем они указывают, что массив 1 должен быть 5 x 6, массив 2 должен быть 6 x 6, а массив 3 должен быть 6 x 3. Я пытаюсь найти способ создать цикл for, который будет выполнять следующие действия без необходимости создать каждый массив:

Dim W1() As Double 
    ReDim W1(5,6)
Dim W2() As Double 
    ReDim W1(6,6)
Dim W3() As Double 
    ReDim W1(6,3)

Что-то вроде кода ниже - вот что я имел в виду.


'UserInput1 is the number of arrays needed

'xDim(i) and yDim(i) are two arrays whose length is equal to UserInput1

'each value in the xDim and yDim arrays represents the X or Y dimension of the
'new array to be created

'i want to create new arrays W1, W2, ...Wn, but using the code W & i() does
'not work

For i = 1 to UserInput1
    Dim W & i() As Double
        ReDim W & i(xDim(i), yDim(i))
Next i

Приведенный выше код, конечно, приводит к ошибке

«Ошибка компиляции: ожидается: конец оператора»

Есть ли решение моей проблемы в VBA или есть какая-то другая работа, о которой я не думаю?

Любая помощь очень ценится! Это мой первый заданный вопрос, поэтому, пожалуйста, дайте мне знать, если мне нужно поделиться какой-либо другой информацией.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вы также можете построить массив внутри массива.Я не уверен, что именно у вас есть в качестве доступных переменных, но это показывает, как такой процесс будет работать.UDF упрощает процесс.

Sub clickAcceptAndYouWillHaveGoodLuck()
    ReDim bigArray(1 To 3) As Variant


    bigArray(1) = eachARR(0, 4)
    bigArray(2) = eachARR(5, 99)
    bigArray(3) = eachARR(20, 88)


    Debug.Print UBound(bigArray) 'returns 3
    Debug.Print UBound(bigArray(1), 1) 'returns 0
    Debug.Print UBound(bigArray(2), 1) 'returns 5
    Debug.Print UBound(bigArray(2), 2) 'returns 99
    Debug.Print UBound(bigArray(3), 2) 'returns 88

End Sub


Private Function eachARR(xInput As Long, yInput As Long) As Variant
     ReDim bRay(0 To xInput, 0 To yInput) As Variant

     eachARR = bRay


End Function

Обновлено .Я думаю, что приведенный ниже код является более динамичным примером того, что вы пытаетесь сделать.Я предполагаю, что ydim и xdim являются функциями?

Sub BetterExample()
    ReDim bigArray(1 To UserINput) As Variant

    Dim r As Long
    For r = 1 To UserINput
        bigArray(r) = eachARR(xdim(r), ydim(r))
    Next r


End Sub


Private Function eachARR(xInput As Long, yInput As Long) As Variant
    ReDim bRay(0 To xInput, 0 To yInput) As Variant

    eachARR = bRay

End Function


Private Function xdim(x As Long) As Long
    'not sure what this is so I just made it itself
    xdim = x + 1

End Function

Private Function ydim(y As Long) As Long
    ydim = y + 2

End Function
0 голосов
/ 12 июля 2019

Один из способов сделать это - использовать трехмерный массив. Используя этот метод, ваш оператор totalArray Dim (плюс ReDim) выполняется только один раз, независимо от количества желаемых массивов. Первое измерение массива представляет массив #. Второе и третье измерения представляют измерения x & y в каждом массиве соответственно. Чтобы получить доступ к значениям массива, вам нужно использовать три вложенных цикла for, по одному для каждого измерения в totalArray. Ниже приведена подпрограмма, которая заполняет каждый элемент в каждом массиве и debug.prints их. Надеюсь, это поможет.

Public Sub makeManyArrays()
Dim numOfArrays As Integer
    numOfArrays = 3

Dim xDim() As Double
    ReDim xDim(1 To numOfArrays)
    xDim(1) = 5
    xDim(2) = 6
    xDim(3) = 6
Dim yDim() As Double
    ReDim yDim(1 To numOfArrays)
    yDim(1) = 6
    yDim(2) = 6
    yDim(3) = 3

Dim totalArray() As Double      'only 1 dim statement needed
    ReDim totalArray(1 To numOfArrays, 1 To WorksheetFunction.Max(xDim), 1 To WorksheetFunction.Max(yDim))  'There will be empty values in your array

Dim arrayNum As Integer 'Loop variable
Dim x As Integer                    'Loop variable
Dim y As Integer                    'Loop variable

For arrayNum = 1 To numOfArrays     'Loop through each array
    'You didn't specify what you wanted to do, but I put the x*y value in each cell of each array just for fun.
    For x = 1 To xDim(arrayNum)
        For y = 1 To yDim(arrayNum)
            totalArray(arrayNum, x, y) = x * y
            Debug.Print "Array " & arrayNum & " value at " & x & ", " & y & " is: " & totalArray(arrayNum, x, y)
        Next y
    Next x
Next arrayNum End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...