是否可以将数组的所有元素传递给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 …Run Code Online (Sandbox Code Playgroud) (警告:虽然乍看之下可能看起来像是一个问题,但这不是初学者级别的问题.如果你熟悉"强迫"一词,或者你曾经研究过VBA规范,请继续阅读.)
假设我有一个类型的表达式Variant,我想将它分配给一个变量.听起来很简单吧?
Dim v As Variant
v = SomeMethod() ' SomeMethod has return type Variant
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果SomeMethod返回一个Object(即VarType为vbObject的Variant),则强制启动并v包含该对象的"简单数据值".换句话说,如果SomeMethod返回对TextBox的引用,v则将包含一个字符串.
显然,解决方案是使用Set:
Dim v As Variant
Set v = SomeMethod()
Run Code Online (Sandbox Code Playgroud)
这不幸的是,如果失败,SomeMethod并没有返回一个对象,例如一个字符串,产生类型不匹配错误.
到目前为止,我找到的唯一解决方案是:
Dim v As Variant
If IsObject(SomeMethod()) Then
Set v = SomeMethod()
Else
v = SomeMethod()
End If
Run Code Online (Sandbox Code Playgroud)
这有SomeMethod两次打电话的不幸副作用.
有没有需要调用SomeMethod两次的解决方案?
我正在使用 callByName I VBA 动态调用类的不同方法。根据方法的不同,我将拥有不同数量的参数,这些参数将保存在一个数组中。不幸的是 CallByName 接受一个 param 数组,因此传递一个变量数字并不简单。有没有办法解决这个问题,我找到了一个使用类型信息库的解决方案,但这似乎不适用于 VBA,即使我已将其添加为参考。下面是我想要的插图
Public Sub Initialize_Object(ByRef TaskObject, Task_Collection)
Dim Task_begin As Variant, Method_Parameters As Variant
Task_begin = Task_Collection("Method")
CallByName TaskObject, Task_begin, VbMethod, Method_Parameters
Run Code Online (Sandbox Code Playgroud)