Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 是否可以将数组的字段传递给具有可变参数数组的函数?_Excel_Vba - Fatal编程技术网

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

Excel 是否可以将数组的字段传递给具有可变参数数组的函数?,excel,vba,Excel,Vba,我处于以下情况:我有一个函数,它接受variant类型的ParamArray,并通过执行mergeToString以特殊方式从其ParamArray中给定的关键字生成一个字符串 Function function1(ParamArray var() As Variant) As String For i = LBound(var) To UBound(var) function1 = mergeToString(function1, CStr(var(i)) Nex

我处于以下情况:我有一个函数,它接受variant类型的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中的Split函数中获得了一个字符串数组,并希望将其用作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()的字段被算作“free”参数

VBA中是否有类似的功能?我已经试过ReDim了,但不知怎么的,它没有起到作用(就我所试过的)


谢谢你的帮助

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

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
代码,但仍应适用于orginal

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

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

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

只是有点困惑你到底在问什么。但是只是观察一下:
mergeToString()
与内置的
Join()
函数本质上是一样的吗?您还在function1中声明了
varStr
,但它是未使用的。当您将数组传递给paramarray时,您会得到以下结果:var(0)(0)“foo”:function1=mergeToString(function1,CStr(var(0)(i))在您调用function1(arr)时可能会起作用。@K.Dᴀᴠɪ很抱歉没有使用varStr。我更正了它。关于mergeToString()函数:在上面使用的最简单的形式中,只需连接输入字符串。当添加更多参数(排序、布局等)时,它实际上提供了更多种类。如果是这样的话,
Join()
是的,那么是的。对不起,我是VBA的初学者。@EvR我不想更改function1,因为在这种情况下,我将失去与
function1(“foo”,“bar”)
之类的调用的兼容性,这些调用已经在包装代码中使用。此外,我更喜欢在Matlab代码中描述的解决方案,而不是if语句(查询变量数组的长度是否仅为1,然后将其转换为变量数组…)因为这也有点不灵活…(我无法执行像
function1(arr(),“abc”)这样的函数调用)
。我认为VBA无法将数组项直接传递给ParamArray项。您可以使用一个帮助程序,但最多可以传递30个参数。我会将此过程作为答案发布。只要您想执行类似于
function1(“abc”,arr())的操作,这将立即导致问题
因为它只用于检查参数数组的第一个元素,对吗?对不起,如果到目前为止还不清楚是否需要这种灵活性。。。