在下面的代码中,测试1,2和3编译,但测试3在运行时因“对象不支持此属性或方法”而失败:(为什么?)
Sub testdrive()
Dim sh As Worksheet
Dim val As Single
Dim myfoo As New CFoo
' test 1
val = 4
myfoo.sub1 (val)
' test 2
Set sh = ThisWorkbook.Sheets(1)
Call myfoo.sub2(sh)
' test 3
myfoo.sub2 (sh)
End Sub
类模块仅包含以下内容:
Public f As Single
Public Sub sub2(sh As Worksheet)
End Sub
Public Sub sub1(s As Single)
End Sub
我无法找到关于何时必须使用“call”关键字的明确声明。
任何人都可以启发我吗?
答案 0 :(得分:1)
如果在不使用关键字Call
的情况下括起参数,则在VBA语法中,这意味着您要强制对其进行评估,然后传递其值。对于VBA,实现此目的的唯一方法是评估参数,然后将其值传递给子例程。
如果参数是一个简单类型,例如Single
,这很有效,因此它适用于Public Sub sub1(s As Single)
,然后sub1(something)
正常工作。
但是当参数是工作表时,例如在Public Sub sub2(sh As Worksheet)
中,当用括号调用sub2(sh)
时,你要求VBA 评估工作表,它不是知道如何实现。基本上,Worksheet
不是VBA可以评估的对象。因此,它说
此对象没有此属性或方法
这意味着:类Worksheet
没有默认属性,例如.Value
,另一方面,Range
对象存在,示例
您不能将工作表参数括起来,除非您使用关键字Call
,这会阻止其先前的评估。
Call myfoo.sub2(sh) '<~~ works fine
myfoo.sub2 sh '<~~ works fine
myfoo.sub2(sh) '<~~ problem, you are asking VBA to evaluate sh and pass its value
最后,请注意,这与您的Subs是类方法这一事实无关。如果它们是普通的子程序,放在一个普通的代码模块中就可以了。