调用没有关键字“call”的用户定义类的方法

时间:2015-11-19 20:17:51

标签: excel vba

在下面的代码中,测试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”关键字的明确声明。

任何人都可以启发我吗?

1 个答案:

答案 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是类方法这一事实无关。如果它们是普通的子程序,放在一个普通的代码模块中就可以了。