Excel VBA 编程 -- 关于类模块
- 2026-10-27 07:06:44
Excel VBA 编程 -- 关于类模块上一篇文章中,我们利用类模块构造了一个计时器。这个计时器在当前模块中可以正常工作,但在把计时器的代码移入公共代码库时,遇到了问题。 默认情况下,类模块的实例化(instancing)属性设置为“私有”(private)。这样设置的类模块只能用于当前的模块,当类模块位于代码库(称为类模块的 provider)中,而使用该类模块的代码位于另外的 VBA 项目(称为类模块的 client)中时,provider 的类模块在 client 中不可见(因为其实例化属性为“私有”)。类模块的实例化属性必须设置为“公有”(public)才能在 client 中可见。如下图所示: 
上图中,Stopwatch 类模块位于 PiVBALib.xlam 中,其实例化属性必须设置为 PublicNotCreatable,才能在外部代码中可见(譬如用于 myExcel.xlsm)。 此时,Stopwatch 在 myExcel.xlsm 中可见,但不能用。因为 Stopwatch 的实例化属性是 PublicNotCreatable,也就是说,Stopwatch 变成“公有”了,但在 client 端代码中“不能创建”(not creatable)该类的对象!也就是说,类 Stopwatch 只能在其定义模块中被实例化。 这可以通过在 provider 模块中定义一个 Create 函数来完成类 Stopwatch 的实例化,而在 client 代码中调用该 Create 函数获得类 Stopwatch 的对象。 Stopwatch 的 Create 函数代码如下: 
这样定义之后,就可以用在其他任何 Excel 的 VBA 项目中了(注:类 Stopwatch 位于 PiVBALib.xlam 中,这是一个 Excel 的加载项。关于如何导入并引用该加载项,请参见文末的 Excel 代码库管理,此处不再赘述)。示例如下: 在 VBA 中可以很方便地编写类模块,但类的实例化需要特殊设置: 相关阅读 Excel VBA 编程 -- 构造一个计时器 Excel 代码库管理


Sub StopwatchTest()dim sw As StopwatchSet sw = CreateStopwatch()sw.StartWatcher' code to timesw.StopWatcherDebug.Print sw.ElapsedTimeEnd Sub
private:类为私有,表示该类只能用于当前模块。 PublicNotCreatable:类为公有,但只能在其定义模块中实例化,需要写一个实例化函数以返回实例化的对象。
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。