Vba 将数组传递给参数数组

Vba 将数组传递给参数数组,vba,parameters,parameter-passing,paramarray,Vba,Parameters,Parameter Passing,Paramarray,是否可以将数组的所有元素传递给ParamArray 例如,我想将一个ParamArray传递给另一个ParamArray: Sub test() p1 "test", "banane", "birne" End Sub Sub p1(ParamArray keys() As Variant) p2 keys 'should be the same as: p2 "test", "banane", "birne" End Sub Sub p2(ParamArray keys()

是否可以将数组的所有元素传递给ParamArray

例如,我想将一个ParamArray传递给另一个ParamArray:

Sub test()
    p1 "test", "banane", "birne"
End Sub

Sub p1(ParamArray keys() As Variant)
    p2 keys 'should be the same as: p2 "test", "banane", "birne"
End Sub

Sub p2(ParamArray keys() As Variant)
    Dim key As Variant
    For Each key In keys
        Debug.Print key 'Run-time error '13' Type mismatch (key is an array)
    Next key
End Sub
在这种情况下,
p2
的paramary不包含
keys
的元素,但它获取数组对象
keys
。因此,我必须检查是否传递了数组:

Sub test()
    p1 "test", "banane", "birne"
    p2 "test", "banane", "birne"
End Sub

Sub p1(ParamArray keys() As Variant)
    p2 keys
End Sub

Sub p2(ParamArray params() As Variant)
    Dim keys As Variant
    If IsArray(params(0)) Then
        keys = params(0)
    Else
        keys = params
    End If

    Dim key As Variant
    For Each key In keys
        Debug.Print key
    Next key
End Sub
但与Java相比,这是一个尴尬的例子:

public class VarArgs {

    public static void main(String[] args) {
        p1("test", "banane", "birne");
        p2("test", "banane", "birne");

        String[] array = {"test", "banane", "birne"};
        p1(array);
        p2(array);
    }

    public static void p1(String... strings) {
        p2(strings);
    }

    public static void p2(String... strings) {
        for (String string : strings) {
            System.out.println(string);
        }
    }

}
在Java中,我不必区分。但这在VBA中可能是不可能的

谢谢你的帮助,
Michael

子测试()
p1“测试”、“巴南”、“比恩”
端接头
子p1(参数数组键()作为变量)
p2键
端接头
子p2(ParamArray key()作为变量)
变暗键作为变量
对于每个键中的键

Debug.Print键(0)“ParamArray很奇怪,但您可以使用正常的数组,它可以正常工作

 Sub test()
    Dim a As Variant: a = Array("test", "banane", "birne")
    p1 a
End Sub

Sub p1(keys As Variant)
    p2 keys
End Sub

Sub p2(keys As Variant)
    Dim key As Variant
    For Each key In keys
        Debug.Print key
    Next key
End Sub
尝试:


将ParamArray参数传递给另一个需要ParamArray参数的函数(委托ParamArray参数)。 我需要将以下类型的函数委托给一个函数:
strf(str作为string,paramary args()作为Variant)作为string
在ParamArray中的其他函数中接收的参数直接传递而不显式写入。 我发现的限制是:

  • ParamArray()只能将其传递给另一个需要ParamArray的函数
  • ParamArray作为变量()在元素0处接收
  • 当第二个函数接收时,它会增加深度级别 我还没有找到任何令人满意的解决方案,但我已经编写了一个工作完美的函数,撤消添加的深度级别,并返回一个带有接收参数的向量
  • 代码:

    选项显式
    选项基数1
    公共子PrAr1(ParamArray pa1()作为变量)
    Dim arr()作为变量
    arr=fn.参数数组已删除(第1页)
    PrAr2 pa1
    端接头
    公共子PrAr2(ParamArray pa2()作为变量)
    Dim i为整数,arrPrms()为变量
    arrPrms=fn.ParamArrayDelegated(第2页)
    对于i=0至UBound(arrPrms)
    调试。打印s.strf(“i:%0 prm:%1”,i,arrPrms(i))
    接下来我
    PrAr3 pa2
    端接头
    公共子PrAr3(ParamArray pa3()作为变量)
    Dim i为整数,arrPrms()为变量
    arrPrms=fn.ParamArrayDelegated(第3页)
    对于i=0至UBound(arrPrms)
    调试。打印s.strf(“i:%0 prm:%1”,i,arrPrms(i))
    接下来我
    端接头
    公共函数ParamArrayDelegated(ParamArray prms()作为变量)作为变量
    Dim arrPrms()作为变量,arrWrk()作为变量
    '当prms(0)为数组时,假定从另一个函数委派
    arrPrms=prms
    当VarType(arrPrms(0))>=vbArray和UBound(arrPrms)<1时执行
    arrWrk=arrPrms(0)
    arrPrms=arrWrk
    环
    ParamArrayDelegated=arrPrms
    端函数
    
    您可以通过第二次调用将其转换为
    变体

    Sub test()
        p1 "test", "banane", "birne"
    End Sub
    
    Sub p1(ParamArray keys() As Variant)
        p2 CVar(keys) '<--| pass it as a Variant
    End Sub
    
    Sub p2(keys As Variant) '<--| accept a Variant argument
        Dim key As Variant
    
        For Each key In keys
            Debug.Print key
        Next key
    End Sub
    
    子测试()
    p1“测试”、“巴南”、“比恩”
    端接头
    子p1(参数数组键()作为变量)
    
    p2 CVar(键)“这是我的解决方案。请注意,它的一个限制是只能将一个(变量)数组参数传递给ParamArray参数集。可能可以将它推广到处理多个传递的数组,但我还没有遇到这种需要

    Option Explicit
    
    Sub test()
        p1 "test", "banane", "birne"
        p2 "test", "banane", "birne"
    End Sub
    
    
    Sub p1(ParamArray keys() As Variant)
        Dim TempKeys As Variant
    
        TempKeys = keys 'ParamArray isn't actually a standard Variant array, so you have to copy
                        'it to one in order for the added test/workaround in p2 to not crash
                        'Excel.
    
        p2 TempKeys 'should be the same as: p2 "test", "banane", "birne"
    End Sub
    
    Sub p2(ParamArray keys() As Variant)
        Dim key As Variant
    
        If IsArray(keys(0)) Then keys = keys(0) 'Set this routine's ParamArray parameter to be
                                                'the array of its first element.
    
        For Each key In keys
            Debug.Print key
        Next key
    End Sub
    

    感谢您的建议,但是
    p2“test”、“banane”、“birne”
    会导致错误
    p2键
    p2“测试”、“banane”、“birne”
    不能被平等对待。我必须检查是否传递了数组(请参见编辑)。但是,与其他一些编程语言(如Java)相比,这是很尴尬的。建议在必要时解压ParamArray的方法,但它基本上是您方法的通用版本。就我个人而言,如果可能的话,我会远离ParamArray,喜欢VBA集合类或自定义类。看起来是这样,因为您可以为ParamArray定义特定类型(如Java示例中的字符串),然后可以传递“与参数数组的元素类型相同的元素类型的数组”与其他语言相比更加冗长,但它解决了我在VBA中似乎无法解决的问题。非常好的解决方法,谢谢。不幸的是,代码不起作用了(不再?)当使用“call PrAr1()”(开始时是空的ParamArray)时,我在“arrPrms=prms”行中得到了err.number=5(无效调用或无效参数)。谢谢,这帮了我的忙!确认此解决方案确实有效。确实非常有用。如果p1是您的原始函数(使用ParamArray),现在您希望能够使用数组调用它:p1变成p2(只有声明更改),p1现在是p2的包装器。谢谢,您的
    If IsArray(keys(0)),然后keys=keys(0)
    帮助我传递了ParamArray!
    Option Explicit
    Option Base 1
    
    Public Sub PrAr1(ParamArray pa1() As Variant)
    Dim arr() As Variant
      arr = fn.ParamArrayDelegated(pa1)
      PrAr2 pa1
    End Sub
    
    Public Sub PrAr2(ParamArray pa2() As Variant)
    Dim i As Integer, arrPrms() As Variant
      arrPrms = fn.ParamArrayDelegated(pa2)
      For i = 0 To UBound(arrPrms)
        Debug.Print s.strf("i: %0 prm: %1 ", i, arrPrms(i))
      Next i
      PrAr3 pa2
    End Sub
    
    Public Sub PrAr3(ParamArray pa3() As Variant)
    Dim i As Integer, arrPrms() As Variant
      arrPrms = fn.ParamArrayDelegated(pa3)
      For i = 0 To UBound(arrPrms)
        Debug.Print s.strf("i: %0 prm: %1 ", i, arrPrms(i))
      Next i
    End Sub
    
    Public Function ParamArrayDelegated(ParamArray prms() As Variant) As Variant
    Dim arrPrms() As Variant, arrWrk() As Variant
    'When prms(0) is Array, supposed is delegated from another function
      arrPrms = prms
      Do While VarType(arrPrms(0)) >= vbArray And UBound(arrPrms) < 1
        arrWrk = arrPrms(0)
        arrPrms = arrWrk
      Loop
      ParamArrayDelegated = arrPrms
    End Function
    
    Sub test()
        p1 "test", "banane", "birne"
    End Sub
    
    Sub p1(ParamArray keys() As Variant)
        p2 CVar(keys) '<--| pass it as a Variant
    End Sub
    
    Sub p2(keys As Variant) '<--| accept a Variant argument
        Dim key As Variant
    
        For Each key In keys
            Debug.Print key
        Next key
    End Sub
    
    Option Explicit
    
    Sub test()
        p1 "test", "banane", "birne"
        p2 "test", "banane", "birne"
    End Sub
    
    
    Sub p1(ParamArray keys() As Variant)
        Dim TempKeys As Variant
    
        TempKeys = keys 'ParamArray isn't actually a standard Variant array, so you have to copy
                        'it to one in order for the added test/workaround in p2 to not crash
                        'Excel.
    
        p2 TempKeys 'should be the same as: p2 "test", "banane", "birne"
    End Sub
    
    Sub p2(ParamArray keys() As Variant)
        Dim key As Variant
    
        If IsArray(keys(0)) Then keys = keys(0) 'Set this routine's ParamArray parameter to be
                                                'the array of its first element.
    
        For Each key In keys
            Debug.Print key
        Next key
    End Sub