Excel VBA 编程 -- 模块与类模块
- 2026-11-08 16:55:16
Excel VBA 编程 -- 模块与类模块为了讲清楚这个问题,先来看看 VBE 的用户界面: 
图1 VBE 的组成 这个是 VBE 的主界面。所谓 VBE,是指 Visual Basic Editor,是内置于 Office 产品中用于 VBA 开发的一个 IDE(集成开发环境)。今后,凡是提到 VBA 的开发环境,都是指这个 VBE。 左上角的这个窗口是 VBE 的工程资源管理器,里面列出了当前已加载的 Excel 加载项(Add-ins),以及当前工作簿的 VBAProject。管理器下面的窗口是当前对象的属性窗口。根据当前选择的对象,属性窗口中显示相应的属性。譬如,对于当前选择的模块,属性窗口只显示一个“名称”属性,供你修改模块的名称(譬如,将模块名称修改为 AceTestModule)。右侧的窗口是代码编辑器。 对于当前工作簿的 VBAProject,初始只包含“Microsoft Excel 对象”文件夹,在插入模块后,会包含“模块”文件夹,如果引用了 Excel 加载项,会包含一个“引用”文件夹。 Microsoft Excel 对象文件夹包含所有的工作表(Sheet1,Sheet2,等等),以及一个名为 ThisWorkbook 的对象,这个对象表示当前的工作簿。 原则上,你可以在 Sheet1、Sheet2 等工作表、ThisWorkbook 工作簿以及模块中写 VBA 代码。但一般不建议将一般的 VBA 代码写在 Sheet1、Sheet2、……、ThisWorkbook 里面,这里面的 VBA 代码主要用于事件处理,而一般的 VBA 代码应该写在模块和类模块中。由此引出我们今天的主题。 注:我们今天不讨论用来表示用户界面的用户窗体(User Forms)。 VBA 包含模块(也称为标准模块或过程模块)和类模块: 我们用下面的图来表示 VBA 中的模块与类模块的区别: 
图2 VBA 中的模块与类模块 对照着图1,图2 中的“模块1”相当于图1 中的 AceTestModule,这个模块中的代码都是与“测试访问 Access 数据库”的任务有关的,譬如 AceTest 是测试的主控程序,WriteDataToAccess 和 ReadDataFromAccess 则是具体实现写入 Access 数据库和读取 Access 数据库的任务。AceTestModule 模块任务单一,模块中没有无关的内容,即使将这个模块删除或移入其他的 Excel 文件,也不会影响当前的 Excel 文件。 与之相应,图1 中的类 Stopwatch 则表达了“计时器”这样一个概念,Stopwatch 类中的代码都与这一概念紧密相关。而“计时器”这一概念是如何实现的,则不是这一概念的使用者关心的重点,我们只需要关心 Stopwatch 这个类呈现给外部世界的接口:如何启动计时器,如何停止计时器,如何获取计时时长。 当然,作为使用者,我们还要关心如何实例化这个类从而得到这个类的实例(即对象),因为对象才是我们所要操作的实体。虽然如何实例化并不是类的接口,但因为 VBA 的特殊规定,我们只能在这个类所定义的 VBAProject 中利用 Create 函数来实现类的实例化。具体操作请参考文末的相关阅读。 类(Class)是表达概念的程序设计手段,一个类表达一个明确的概念。而概念(类/Class)经过实例化以后成为代码操纵的实体(对象/Object)——代码通过该实体(对象/Object)所呈现的接口(属性/方法)来操纵该实体。下面以 AceClient 为例具体说明: 具体操作请参阅相关阅读中的《Excel 编程 -- 再谈访问数据库》一文。 希望这篇文章说清楚了 VBA 中的模块与类模块的区别与作用。 相关阅读 Excel 代码库管理 Excel VBA 编程 -- 关于类模块 Excel VBA 编程 -- 构造一个计时器 Excel 编程 -- 再谈访问数据库

模块:一般的 VBA 代码都应该写在模块里,包括 Sub 和 Function。 Sub:表示用来完成一定任务的过程,譬如更新工作表,从数据库中读取数据等。 Function:表示用来计算某个(或某些)值的过程,与 Sub 不同的是,Function 要将计算结果返回给调用者,譬如计算圆的面积、计算员工的涨薪数额等。 微软这里的命名容易让人迷惑。如果将这里的“模块”理解为“模块文件夹”或“模块集合”就清楚了: 模块文件夹/模块集合可以包含一个或多个模块,每个模块都有自己的名字,如上图中的 AceTestModule、SqlTestModule 等。 每个模块包含一个或多个 Sub/Function,当然每个模块也可以包含多个常量以及变量。 类模块:用户写的类代码都应该放在类模块中。类模块可以理解为“类文件夹”或“类集合”,类文件夹/类集合/类模块可以包含一个或多个类,如上图所示的类模块就包含 AceClient、DbClient、Stopwatch 三个类。

AceClient 这个类表达了“Access 数据库前端”这样一个概念,这意味着用户程序通过这个“前端”访问 Access 数据库。 用户程序通过 aClient = CreateAceClient("mydb.accdb") 这行代码来实例化 AceClient,得到 aClient 这个对象。 用户程序通过以下的接口来操纵 a.Client 对象: aClient.OpenConnection:打开与 Access 数据库的连接 aClient.ExecuteSQL(sql):在 Access 数据库中执行 SQL 语句 aClient.GetDataSet(sql):在 Access 数据库中执行查询并返回数据集 aClient.CloseConnection:关于与 Access 数据库的连接
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。