当前时间: 2026-06-16 12:37:00
分类:办公文件
评论(0)
Excel VBA 编程基础 -- 对象(四)今天我们继续来讨论 VBE 的对象浏览器,主要看 VBA 中都有哪些内容。首先,这张图显示的是 VBA 这个库中的内容。如图1 底部所示,VBA 库对应于 VBE7.DLL 程序文件。这个库也是需要加以引用才能使用,如图2 所示。仔细对比两张图,可以看出,VBA(Visual Basic For Application)所对应的是同一个 VBE7.DLL。如果把图2 中对 VBA 的引用取消,则 VBA 将无法使用,但 Excel 的设计已经将 Excel 对象模型和 VBA 强耦合在一起,因此无法直接取消对 VBA 的引用,但可以通过将 Excel 文件另存为 .xlsx 文件格式而强制去除对 VBA 的依赖。我们看到,VBA 中的第一项内容是 Collection,如图3:注意底部的说明,Collection 是一个 Class(类),这个类是 VBA 的成员,这也就是说,Collection 这个类(我们可以简称为集合类型)是 VBA 的内置内置类型,因此不需要引入任何外部组件,直接就可以拿来用。这个我们已经在前面讲过了,此处不赘。接下来是一些常量定义,如 ColorConstants、Constants 等。我们前面讲过的 vbObjectError 这个常量就位于 Constants 中。下面是 Conversion(转换模块),如图4:注意,与 Collection 不同,Conversion 不是类(Class),而是模块(Module),也就是说,Conversion 不是某个具体类型,而是一个聚集了一些函数的模块。同理,紧跟在 Conversion 下面的 DateTime 也是一个模块,里面包含了所有关于日期/时间的常量、函数等内容。模块,类似于文件夹的概念,正如文件夹是一个包含文件的容器一样,模块也是一个包含常量、Sub/Function 等的容器。但与文件夹不同,文件夹还可以包含子文件夹,从而形成一个嵌套结构,模块不能包含子模块,只能包含常量/属性定义、Sub/Function 等。实际上,模块的主要用途是作用域(scope)。譬如,如图4,Conversion 模块中有一个 CDate 函数,但如果 DateTime 模块中同样也有一个名为 CDate 的函数,如果没有模块的概念,两个 CDate 函数就会发生冲突:VBA 不知道你到底用哪一个 CDate。有了模块的概念后,如果你要用 Conversion 中的 CDate,你可以写 Conversion.CDate(),而对于 DateTime 中的 CDate,你只要写 DateTime.CDate,就不会发生名字冲突了。所谓作用域,就是变量、常量、Sub/Function 的名字的作用范围。对于 Conversion.CDate,此时的 CDate ,其作用域只是 Conversion 模块,只要这个模块中没有第二个 CDate,那么,写 Conversion.CDate 就是安全的。同理,DateTime.CDate 也是一样。接下来是 ErrObject。与前面的两个 Conversion 和 DateTime 不同,ErrObject 是一个类。我们已经熟悉这个类,Err 对象就是这个类的实例,而且是单体实例(singletong instance),也就是说,只此一例。这一点可以用如下代码证明,见图5:这段代码中,Err() 是一个函数,这个函数定义在 Information 模块中,但并没有在 VBA 的文档中说明。这个函数的作用就是返回 Err 对象。我们可以从上面代码的上半部分得到证明:这个函数返回的对象 o,IsObject 判断 o 是一个对象,TypeName 函数得到 o 的类型是 ErrObject。也就是说,o 是一个 ErrObject 类型的对象,这与 Err 是一致的。因为此时没有错误发生,因此 o 的 Number 属性为 0,Description 属性为空。接下来,我们引发一个被 0 除错误,此时再通过 Err() 函数返回对象 o2。然后用 o = o2 和 o Is o2 来判断,结果可见:o 与 o2 是同一个对象。注:等号(=)用来判断两边的操作数是否具有同样的值,Is 操作符用来判断两边的对象变量是否指向同样的对象。两个操作符的结果都是 True,表明 o 与 o2 具有同样的值,且 o 与 o2 指向同一个的对象。接下来的两个 Debug.Print 输出印证了 o 与 o2 有同样的值。综合以上判断,o 与 o2 指向同一个 Err 对象,即 Err 对象是一个单体实例。
基本
文件
流程
错误
SQL
调试
- 请求信息 : 2026-07-05 19:49:19 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/644716.html
- 运行时间 : 0.114176s [ 吞吐率:8.76req/s ] 内存消耗:4,630.72kb 文件加载:145
- 缓存信息 : 0 reads,0 writes
- 会话信息 : SESSION_ID=2b408cc602d852351e46cc922b3ceb1d
- CONNECT:[ UseTime:0.001100s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
- SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001619s ]
- SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000756s ]
- SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000660s ]
- SHOW FULL COLUMNS FROM `set` [ RunTime:0.001282s ]
- SELECT * FROM `set` [ RunTime:0.000505s ]
- SHOW FULL COLUMNS FROM `article` [ RunTime:0.001529s ]
- SELECT * FROM `article` WHERE `id` = 644716 LIMIT 1 [ RunTime:0.001222s ]
- UPDATE `article` SET `lasttime` = 1783252159 WHERE `id` = 644716 [ RunTime:0.006915s ]
- SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000596s ]
- SELECT * FROM `article` WHERE `id` < 644716 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001291s ]
- SELECT * FROM `article` WHERE `id` > 644716 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001993s ]
- SELECT * FROM `article` WHERE `id` < 644716 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.005673s ]
- SELECT * FROM `article` WHERE `id` < 644716 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002009s ]
- SELECT * FROM `article` WHERE `id` < 644716 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002982s ]
0.115800s