在VBA中传递Variant参数ByRef时发生编译错误
Excel VBA中有一个“编译”错误,我不明白…
我有一个这样的方法:
Public Sub SomeMethod(ByRef argument As SomeClass) ... <- 'argument' must be called ByRef because I have to modify it End Sub
如果我定义一个variables,如:
Dim var As SomeClass
没问题,我可以打电话:
SomeMethod var
它正在工作。
但是,如果我定义一个Variantvariables,如:
Dim var as Variant Set var = New SomeClass
它不起作用。
如果我打电话:
SomeMethod var
VBpopup消息: 'ByRef参数types不匹配'
如果我打电话:
SomeMethod (var)
它“编译”,但是var然后通过ByVar,它给了我一个运行时错误信息: '对象不支持这个属性或方法'
所以我基本上只是想告诉VBA,我的Variantvariables“var”实际上是一个“SomeClass”对象(在debugging器中,VBA是这么说的),但我不知道该怎么做…
有人可以帮我吗?
用ByVal
装饰参数
Public Sub SomeMethod(ByVal argument As someclass)
那么你可以通过一个变种;
SomeMethod var
这是有效的,因为ByVal argument
是作为对Variant[someclass]
的引用的本地副本接收的,这意味着VB可以自由执行types转换(将Variant[someclass]->someclass
)。
它作为ByRef
传递时不会工作,因为对argument
任何更改也会影响当前过程之外的调用对象引用variables。
如果你通过As Object
你不需要ByVal
。
如果你用自定义的类来做这个事情,VBA支持接口; function foo(obj as IOneOfMyWidgets)
两件事情:
正确的方法来调用一个子
在VBA中,要调用一个Sub,你可以写这个
SomeSub var
没有括号或这个
Call SomeSub(var)
这: SomeSub (var)
不会做你认为的事情。
将Variant转换为类或数据types
当我写这篇文章的时候,Alex K的回答进来了,所以我只是补充一下,显示types不匹配不仅限于对象,还会影响Variant中包含的原始数据types:
Sub tester() Dim v As Variant v = 1.234567 ' v is now type Variant/Double dothis v ' No problem. dothat v ' Compile error: ByRef argument type mismatch. End Sub Sub dothis(ByVal d As Double) 'stuff End Sub Sub dothat(ByRef d As Double) 'stuff End Sub
你也可以明确地转换成一个types:
'/* Factory */ Select Case TypeName(var) Case "SomeClass": Dim cast As SomeClass Set cast = var SomeMethod cast End Select