将数组传递给ParamArray

mai*_*mic 15 parameters vba 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() 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,ParamArray p2不包含元素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
Run Code Online (Sandbox Code Playgroud)

但是与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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在Java中我不必区分.但这在VBA中可能是不可能的.

谢谢你的帮助,
迈克尔

小智 9

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

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

码:

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
Run Code Online (Sandbox Code Playgroud)


use*_*756 5

您可以将其Variant从第二次调用转换为:

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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这帮了我!确认此解决方案有效。 (2认同)

pst*_*ton 5

这是我的解决方案。请注意,它的一个限制是您只能将一个(变体)数组参数传递给 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
Run Code Online (Sandbox Code Playgroud)