我在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这样说),但我不知道该怎么做......
有人可以帮助我吗?
答案 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)
两件事:
在VBA中,要调用Sub,您可以写这个
SomeSub var
没有括号或本
Call SomeSub(var)
这:SomeSub (var)
没有按照你的想法做到。
当我写这篇文章的时候,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