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

adr*_*ain 4 excel vba

我在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这样说),但我不知道怎么做...

有人可以帮帮我吗?

Ale*_* K. 5

用...装饰参数 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)

  • 如果传递一个对象byref/val,则更改*始终*反映为正在传递的相同引用,因此您始终使用调用方和被调用方中对象的相同实例.使用byval只允许`As Variant`作为参数可以在运行时在类型转换后自由重新分配,而不会影响其他任何事情. (3认同)