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

在下面的代码中,testing1,2和3编译,但testing3在运行时失败,“对象不支持这个属性或方法”:(为什么?)

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情况下对参数进行括号化,则在VBA语法中,这意味着您要强制评估该参数,然后传递其值 。 对于VBA来说,实现这一点的唯一方法是评估参数,然后将其值传递给子例程

如果这个参数是一个简单的types,比如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是类方法无关。 如果它们是正常的子程序,放置在一个普通的代码模块中,那也是一样的。