首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组传递给ParamArray

将数组传递给ParamArray
EN

Stack Overflow用户
提问于 2013-12-26 10:24:59
回答 8查看 24.7K关注 0票数 20

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

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

代码语言:javascript
复制
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

在本例中,ParamArray of p2不包含keys的元素,但它获得数组对象keys。因此,我必须检查是否传递了一个数组:

代码语言:javascript
复制
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相比,这是很尴尬的:

代码语言:javascript
复制
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中可能是不可能的。

谢谢你的帮助

迈克尔

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-05-14 17:33:39

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

  1. ParamArray()只能传递给另一个期望使用ParamArray的函数。
  2. ParamArray作为一个变量()在元素0处接收。
  3. 当第二个函数接收到它时,它增加了一个深度级别,我没有找到任何令人满意的解决方案,但是我已经编写了一个功能非常好的函数,取消了添加的深度级别,并返回了一个带有参数的向量。

代码:

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2016-11-05 18:34:27

您可以从第二个调用开始将其转换为Variant

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2016-11-10 23:56:09

这是我的解决办法。注意,它的一个限制是只能向ParamArray参数集传递一个(变体)数组参数。可能可以将其概括为处理多个传递的数组,但我还没有遇到这种需要。

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20783170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档