【发布时间】:2014-01-14 00:16:15
【问题描述】:
是否可以将数组的所有元素传递给 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 的 ParamArray 不包含 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 中可能是不可能的。
感谢您的帮助,
迈克尔
【问题讨论】:
-
This link 建议在必要时解包 ParamArray,但它基本上是您方法的通用版本。就个人而言,如果可能的话,我会远离 ParamArrays,更喜欢 VBA Collection 类或自定义类。
-
它看起来像 IS possible in VB.Net,因为您可以为 ParamArray 定义特定类型(如 Java 示例中的 String),然后您可以传递“一个数组具有与参数数组的元素类型相同的元素类型。"
标签: vba parameters parameter-passing paramarray