如何在VBA函数中返回两个数组的数组

时间:2016-08-07 10:12:09

标签: arrays vba

我喜欢让函数返回两个数组,每个数组 由许多小的固定大小(2)数组组成。

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,我想构建一个系列 我的(从1到4,然后从7到9 ...) 和o(从5到6,然后从10到15) 示例:IO =(" i"," i"," i"," o"," o", " I&#34) 那么i =((1,3),(6,6))和o =((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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对于特定的问题,请使用Variant数组作为&#34;中间&#34;

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