在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