如何在VBA中的类内使用私有方法?

时间:2019-01-28 00:13:33

标签: excel vba

如何在VBA的类中使用私有方法?

我在课堂上写了私人程序

Private Sub setStartShift()

但是我不能这样称呼:

this.setStartShift

1 个答案:

答案 0 :(得分:2)

TL; DR:

使用Me而不是this访问当前实例-但只有公共接口通过Me公开。

使用不合格的成员调用来访问私有接口。

Public Sub DoSomething()
    DoSomethingInternal ' implicit call
    'Call DoSomethingInternal '' explicit call (obsolete)
End Sub

Private Sub DoSomethingInternal() ' not accessible through public interface
    ' do stuff
End Sub

为什么?

在VBA中,this的本质体现在Me隐式标识符中:它引用该类的当前实例,并通过其默认接口公开。换句话说,如果您正在名为Class1的类模块中编写方法,则在该过程中Me引用Class1的当前实例,就像访问是从外面来的

Compile error: Method or data member not found

specifications告诉我们Me的工作原理(重点是我的意思):

  

<procedure-body>中定义的过程声明的<class-module-code-section>中,保留名称Me的声明类型是由封闭的类模块定义的命名类和数据值Me的of是对 该对象的引用,该对象是当前激活该函数的目标对象

进一步,来自section 5.3.1.5

  

作为方法的每个过程具有一个隐式ByVal参数,该参数称为当前对象,该对象与该方法调用的目标对象相对应。当前对象充当具有过程范围的匿名局部变量,其声明的类型为包含方法声明的类模块的类名。

换句话说,当您这样做时:

Dim foo As Class1
Set foo = New Class1
foo.DoSomething 42

编译后的代码实际运行方式与以下内容更接近:

Dim foo As Class1
Set foo = New Class1
Class1.DoSomething foo, 42

并且由于参数的类型为包含方法声明的类模块的类名,因此成员必须存在于该类的Public接口上,用于成员调用在编译时即可解决。

"Understanding 'Me' (no flowers, no bees)" on my "Rubberduck News" blog