我在Excel VBA中遇到"编译"错误,我不明白......
我有一个这样的方法:
Public Sub SomeMethod(ByRef argument As SomeClass)
... <- 'argument' must be called ByRef because I have to modify it
End Sub
Run Code Online (Sandbox Code Playgroud)
如果我定义一个变量,如:
Dim var As SomeClass
Run Code Online (Sandbox Code Playgroud)
没问题,我可以打电话:
SomeMethod var
Run Code Online (Sandbox Code Playgroud)
它正在发挥作用.
但是,如果我定义一个Variant变量,如:
Dim var as Variant
Set var = New SomeClass
Run Code Online (Sandbox Code Playgroud)
它不起作用.
如果我打电话:
SomeMethod var
Run Code Online (Sandbox Code Playgroud)
VB弹出一条消息:'ByRef参数类型不匹配'
如果我打电话:
SomeMethod (var)
Run Code Online (Sandbox Code Playgroud)
它"编译",但var然后传递ByVar它给了我一个运行时错误消息:'对象不支持此属性或方法'
所以我基本上只想告诉VBA我的Variant变量'var'实际上是'SomeClass'对象(在调试器中,VBA这样说),但我不知道怎么做...
有人可以帮帮我吗?
用...装饰参数 ByVal
Public Sub SomeMethod(ByVal argument As someclass)
Run Code Online (Sandbox Code Playgroud)
然后你可以传递一个变体;
SomeMethod var
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为它ByVal argument是作为引用的本地副本接收的,Variant[someclass]这意味着VB可以自由地执行类型转换(转换Variant[someclass]->someclass).
传递时它不会工作,ByRef因为任何更改argument也会影响当前过程之外的调用对象引用变量.
如果你通过,As Object你不需要ByVal.
如果您使用自定义类执行此操作,VBA支持接口; function foo(obj as IOneOfMyWidgets)