在VBA中传递Variant参数ByRef时出现编译错误

时间:2012-02-21 10:35:37

标签: excel vba

我在Excel VBA中遇到“编译”错误,我不明白......

我有一个这样的方法:

    Public Sub SomeMethod(ByRef argument As SomeClass)
        ... <- 'argument' must be called ByRef because I have to modify it
    End Sub

如果我定义一个变量,如:

    Dim var As SomeClass

没问题,我可以致电:

    SomeMethod var

它正在发挥作用。

但是,如果我定义一个Variant变量,如:

    Dim var as Variant
    Set var = New SomeClass

它不起作用。

如果我打电话:

    SomeMethod var

VB弹出一条消息:'ByRef参数类型不匹配'

如果我打电话:

    SomeMethod (var)

它“编译”,但var然后传递ByVar并且它给我一个运行时错误消息:'对象不支持此属性或方法'

所以我基本上只是想告诉VBA我的Variant变量'var'实际上是'SomeClass'对象(在调试器中,VBA这样说),但我不知道该怎么做......

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

ByVal

装饰参数
Public Sub SomeMethod(ByVal argument As someclass)

然后你可以传递一个变体;

SomeMethod var

这是有效的,因为ByVal argument作为对Variant[someclass]的引用的本地副本被接收,这意味着VB可以自由地执行类型转换(转换{ {1}})。

当作为Variant[someclass]->someclass传递时它不起作用,因为对ByRef的任何更改也会影响当前过程之外的调用对象引用变量。

如果您通过argument,则不需要As Object

如果您使用自定义类执行此操作,VBA支持接口; ByVal

答案 1 :(得分:3)

两件事:

调用Sub

的正确方法

在VBA中,要调用Sub,您可以写这个

SomeSub var

没有括号或本

Call SomeSub(var)

这:SomeSub (var)没有按照你的想法做到。

将Variant转换为类或数据类型

当我写这篇文章的时候,Alex K的答案就出现了,所以我只是补充说明类型不匹配不仅限于对象,还会影响Variant中包含的原始数据类型:

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

答案 2 :(得分:0)

您还可以显式转换为类型:

'/* Factory */
Select Case TypeName(var)
    Case "SomeClass":
        Dim cast As SomeClass
        Set cast = var
        SomeMethod cast
End Select