简介
使用面向对象的编程 (OOP) 的优点之一是代码的可重用性。 这样做的典型方法是使用 Set 变量 = New ClassName 语法实例化已定义类的对象。 VBA 程序员在应用程序平台中使用任何对象时都会使用此类对象。 示例包括 Excel 中的 Workbook 对象、PowerPoint 中的 Presentation 对象或 Word 中的 Document 对象。 此外,VBA 程序员使用用户窗体(属于特殊类的对象)。 所有这些对象都是在 VBA 开发人员项目外部的库中定义的。 单击“工具”|引用。。。 查看 Visual Basic 编辑器 (VBE) 代表开发人员自动建立的外部库列表的菜单项。
在此提示中,我们将探讨如何访问由我们创建的外部库中的自定义类。 虽然下面使用的示例基于 Excel 2003,但提示适用于支持 VBA 且适用于版本 2000 或更高版本的其他 MS Office 产品。
这是一个中高级级提示,它假定 VB (A) 编程具有一定的舒适级别。
在一个 VBA 项目可以访问另一个 VBA 项目的类模块中声明的对象之前,需要两个不同的设置步骤。 第一组使类模块在声明它的项目之外可用,并提供一种可以实例化对象的方法。 第二组涉及客户端项目如何使用此类。
设置包含类定义的项目
默认情况下,类模块将 Instancing 属性设置为“专用”。 这意味着,只有包含类定义的项目才能实例化该类的对象。 VBA 支持的唯一其他选择是“公共”,但不可创建。 这意味着外部项目可以使用此类的对象,但无法实例化它。 可能看起来很奇怪, 但就是这样。 从默认值更改属性的方法是选择 VBE 项目资源管理器中的类模块,选择感兴趣的类模块,根据需要访问属性窗口 (,使用 F4 使其) 可见,并将 Instancing 属性更改为 2-PublicNotCreatable。
若要遵循此提示中的示例,请创建一个类模块,将其命名为 clsEmployee,更改其 Instancing 属性,并向其添加以下代码。
Option Explicit
Dim sName As String
Property Get Name() As String
Name = sName
End Property
Property Let Name(uName As String)
sName = uName
End Property
接下来,由于类的 Instancing 属性是 PublicNotCreatable,因此项目必须为客户端提供实例化对象的方法。 在标准模块中添加新函数:
Option Explicit
Public Function New_clsEmployee() As clsEmployee
Set New_clsEmployee = New clsEmployee
End Function
其中 clsEmployee 是感兴趣的类的名称。 此外,这不应是专用模块。
最后一次改变将使生活更轻松一点。 将项目从默认 VBAProject 重命名为 ClassProvider。 为此,请在 VBE 项目资源管理器中选择项目,然后选择“工具|VBAProject 属性... |“常规”选项卡|并在 “项目名称” 字段中输入 ClassProvider。
例如,将此文件另存为 类Provider.xls。
接下来,转到客户端项目。
设置将使用导出类的项目
客户端项目非常使用该类,就像在任何其他外部库中定义的类一样, (如用户窗体) -有一个关键区别。 由于它无法实例化该类的对象,因此它必须使用上面声明的New_clsEmployee () 函数。 与任何其他外部库一样,决定是使用早期绑定还是后期绑定。 下面的代码演示了两者。 请记住,若要使用早期绑定代码,客户端项目必须包含引用 (工具|对类Provider.xls文件的引用... ) 。
Option Explicit
Sub UseExportedClass_EarlyBinding()
Dim anEmployee As ClassProvider.clsEmployee
Set anEmployee = ClassProvider.New_clsEmployee
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Sub UseExportedClass_LateBinding()
Dim anEmployee As Object
Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
最终注释
外部库不必是正常保存的文件。 它可以位于特定于应用程序的外接程序 (,例如使用后缀 .xla 或 .ppa) 保存的文件。 请记住,此类加载项不是通过普通文件打开|打开。。。 方法,但加载了工具|加载项... 命令。