我喜欢让函数返回两个数组,每个数组 由许多小的固定大小(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
答案 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