是否可以将数组的字段传递给具有可变参数数组的函数?

时间:2018-11-16 07:01:03

标签: excel vba excel-vba

我处于以下情况:我有一个函数,该函数接受类型为ParamArray的变量,并通过执行mergeToString以特殊方式根据其ParamArray中给出的关键字生成字符串。

Function function1(ParamArray var() As Variant) As String
    For i = LBound(var) To UBound(var)
       function1 = mergeToString(function1, CStr(var(i))
    Next i
End Function

在另一个子例程中,我有一个数组,这些字符串是从VBA中的“拆分函数”获得的,并希望将其用作function1的输入

Sub displayFCTN1()
    Dim arr() As String
    arr() = Split("foo|bar", "|")
    'and here I ran out of ideas...
    Debug.Print function1(**???**)
End Sub

这两行

function1(**???**)
function1("foo","bar")

首先使用arr()应该等效。

在Matlab中,这相对容易-我知道,VBA不是Matlab,但这仍然可以作为我问题的扩展描述: 您很可能可以通过在 Matlab

中使用冒号运算符来完成此操作
function1(arr(:))

因为数组arr()的字段被计为“自由”参数。

在VBA中是否有与此类似的东西?我已经尝试过ReDim,以某种方式没有完成该工作(就我所尝试的而言)。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

上面的评论中提到的解决方法

Sub displayFCTN1()
        Dim arr() As String
        arr() = Split("foo|bar", "|")
        Myhelper arr
    End Sub

    Sub Myhelper(arr)
    Select Case UBound(arr)
    Case 0: Debug.Print function1(arr(0))
    Case 1: Debug.Print function1(arr(0), arr(1))
    Case 2: Debug.Print function1(arr(0), arr(1), arr(2))
    Case 3: Debug.Print function1(arr(0), arr(1), arr(2), arr(3))
    Case 4: Debug.Print function1(arr(0), arr(1), arr(2), arr(3), arr(4))
    'etc up to 29.
    Case Else
    End Select
    End Sub

答案 1 :(得分:0)

这确实需要更改function1代码,但仍应与原始代码一起使用。

Sub Test()

    Debug.Print function1("foo", "bar")

    Dim arr() As String
    arr = Split("foo|bar", "|")
    Debug.Print function1(arr)

End Sub

Function function1(ParamArray var() As Variant) As String
    Dim i As Long

    If UBound(var) = 0 Then
        For i = LBound(var(0)) To UBound(var(0))
            'function1 = Join(var(0), "|")
            function1 = mergeToString(function1, CStr(var(0)(i)))
        Next i
    Else
        'Original code.
        For i = LBound(var) To UBound(var)
           'function1 = Join(var, "|")
           function1 = mergeToString(function1, CStr(var(i)))
        Next i
    End If
End Function

答案 2 :(得分:0)

您需要测试数组的第一项是否为数组:

Sub FFF()
    MsgBox Func1("foo", "bar")
    MsgBox Func1(Split("foo|bar", "|"))
End Sub

Function Func1$(ParamArray var() As Variant)
    Dim s$, x%, args
    args = IIf(IsArray(var(0)), var(0), var)
    '//Do something
    For x = 0 To UBound(args)
        s = s & args(x) & "|"
    Next
    Func1 = Left$(s, Len(s) - 1)
End Function