2016-08-07 2 views
1

Мне нравится функция, возвращающая два массива, каждый массив , состоящий из множества небольших массивов с фиксированным размером (2).Как вернуть массив из двух массивов в функции VBA

function AssbIO(...) as variant() 
'... 
Dim i() as variant 
Dim o() as variant 
Redim i(0 to 1) 
Redim o(0 to 1) 

i(0)(0)=1 
i(0)(1)=2 

i(1)(0)=3 
i(1)(1)=4 

o(0)(0)=11 
o(0)(1)=22 

o(1)(0)=33 
o(1)(1)=44 

'Now the following is giving me an error 
AssbIO(0) = i 
AssbIO(1) = o 

End Function 

Ваша помощь будет принята с благодарностью.

PS. Вот полная программа, которую я пытаюсь достичь Учитывая серию i и o, я хочу построить серию i (от 1 до 4, затем от 7 до 9 ...) и от o (от 5 до 6, затем от 10 до 15). Пример: IO = («i», «i», «i», «o», «o», «i») , тогда i = ((1,3), (6,6)) и о = ((4,5))

Function AssbIO(IO() As String) As Variant 

Dim i() As Variant 
Dim o() As Variant 
Dim ni As Integer 'the jumper of i() 
Dim no As Integer 'the jumper of o() 
Dim nIO As Integer ' the jumper of initial IO() 
Dim a As Integer, b As Integer 
a = 1 

While nIO <= erLen(IO) 
    b = a 

    While IO(nIO) = "i" 
    b = b + 1 
    nIO = nIO + 1 
    Wend 

    ni = ni + 1 
    ReDim Preserve i(0 To ni - 1) 
    i(ni - 1)(0) = a 
    i(ni - 1)(1) = b 
    a = b + 1 

    While IO(nIO) = "o" 
    b = b + 1 
    nIO = nIO + 1 
    Wend 

    no = no + 1 
    ReDim Preserve o(0 To no - 1) 
    o(no - 1)(0) = a 
    o(no - 1)(1) = b 
    a = b + 1 

While IO(nIO) <> "i" And IO(nIO) <> "n" 
nIO = nIO + 1 
Wend 

Wend 

'ReDim AssbIO(0 To 1) 'this is giving me errors 
AssbIO(0) = i 
AssbIO(1) = o 

End Function 

ответ

0

, как для конкретных вопроса, использовать массив Variant как «промежуточный»:

Dim var(0 To 1) As Variant 

    .... 

    ni = ni + 1 
    ReDim Preserve i(0 To ni - 1) 
    var(0) = a 
    var(1) = b 
    i(ni - 1) = var 
    a = b + 1 

вы также можете рассмотреть следующий рефакторинг кода:

Option Explicit 

Function AssbIO(IO() As String) As Variant 
    Dim i() As Variant, o() As Variant 
    Dim ni As Long 'the jumper of i() 
    Dim no As Long 'the jumper of o() 
    Dim iIo As Long 
    Dim strng As String   
    Dim var(0 To 1) As Variant 

    ni = -1 
    no = -1   
    iIo = LBound(IO) 
    Do While iIo <= UBound(IO) 
     strng = IO(iIo) 
     If strng = "i" Then 
      UpdateArr IO, i(), ni, strng, iIo 
     ElseIf strng = "o" Then 
      UpdateArr IO, o(), no, strng, iIo 
     Else 
      iIo = iIo + 1 
     End If 
    Loop 

    var(0) = i 
    var(1) = o 
    AssbIO = var 
End Function 


Sub UpdateArr(IO() As String, arr() As Variant, nArr As Long, strng As String, iIo As Long) 
    Dim b As Long, incIO As Long 
    Dim var(0 To 1) As Variant 

    b = iIo 
    incIO = incIO + 1 
    Do While iIo + incIO <= UBound(IO) 
     If IO(iIo + incIO) <> strng Then Exit Do 
     b = b + 1 
     incIO = incIO + 1 
    Loop 
    var(0) = iIo 
    var(1) = b 

    nArr = nArr + 1 
    ReDim Preserve arr(0 To nArr) 
    arr(nArr) = var 

    iIo = iIo + incIO 
End Sub 
+0

Большое спасибо user3598756! поэтому для передачи значений этих 2 массивов в функцию-ответ был необходим ПРОМЕЖУТОЧНЫЙ вариант. Также спасибо за переработку моего кода (моя использует предварительно созданную функцию ...). Завтра буду изучать ваш код. –

+0

Добро пожаловать. Хорошая кодировка! – user3598756

0

Я не совсем понимаю, почему вы не просто определить двумерный массив (который подойдет вам хорошо, если у вас есть подлинная матрица 2x2). Однако, если вы хотите вложенные или неровные массивы, вы можете либо измерить некоторые варианты, либо добавить их в свой последний массив, либо использовать функцию Array(), содержащую вложенные массивы.

Приведенные ниже код дает вам три способа сделать вложенный метод массива:

Function AssbIO() As Variant 

    'Option1 - just write directly to arrays 
    Dim result1 As Variant 
    result1 = Array(Array(Array(1, 2), Array(3, 4)), Array(Array(11, 22), Array(33, 44))) 

    'Option2 - create empty nested arrays, then populate line by line 
    Dim result2 As Variant 
    result2 = Array(_ 
       Array(Array(Empty, Empty), Array(Empty, Empty)), _ 
       Array(Array(Empty, Empty), Array(Empty, Empty))) 

    result2(0)(0) = 1 
    result2(0)(1) = 2 
    '...etc. 

    'Option3 - dimension all the arrays 
    Dim result3(0 To 1) As Variant 
    Dim i(0 To 1) As Variant 
    Dim o(0 To 1) As Variant 
    result3(0) = i 
    result3(1) = o 

    result3(1)(0) = 3 
    result(1)(1) = 4 

    'Return your result 
    AssbIO = result1 'or 2 or 3 
End Function 
+0

Уважаемый Ambie, спасибо за ответы, но я действительно работаю с неопределенными размерами i() и o(), поэтому AssbIO должен быть динамичным и ... Я отредактирую ответ, чтобы отразить мои истинные потребности. –

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