当前时间: 2026-05-23 17:12:50
分类:办公文件
评论(0)
Excel VBA 编程基础 -- 对象(七)我们从 VBA 的 Information 模块中看到(如图1),VBA 中有很多 IsSomething 函数,诸如 IsDate、IsEmpty、IsMissing、IsNumeric 等等,这些函数我们都已经讨论过了,今天来看看 IsObject 和 IsArray。其中,identifier 是一个变量名字,IsObject(identifier) 判断所给的变量 identifier 是不是一个对象变量,并返回 True 或 False:- 如果 identifier 是一个变量名,且该变量声明为 Object 或其他由 Class 定义的对象类型,或者 identifier 是一个子类型为 vbObject 的 Variant 类型,则 IsObject 返回 True。
- 若 identifier 非以上情形,则 IsObject 返回 False。
在这个例子中,我们声明了两个变量:一个 Object 类型的变量 o,一个 Variant 类型的变量 v。接下来,我们用 IsObject 来测试 o 是不是一个对象变量,从右侧的输出结果中可以看到,虽然此时 o 尚没有初始化,但 IsObject 仍然检测到 o 是一个对象变量。接下来看变量 v。我们看到,因为此时 v 尚没有初始化,对于一个没有初始化的 Variant 类型变量,IsObject 是没有办法判定它到底是一个什么变量的,所以给出 False 的结果。下面两行的 TypeName 和 VarType 都判定 v 是一个空的 Variant 变量。然后,对 v 进行初始化,将一个新对象(New Collection)赋给 v。接下来的检测结果显示,此时 v 是一个对象变量,v 的 TypeName 是 Collection 类型,VarType 结果是 vbObject 类型。为什么 TypeName 和 VarType 会显示不同的结果?这是因为:v 本身是一个变体类型,通过 Set v = New Collection 赋值语句,给 v 赋予了一个对 Collection 类型对象的引用,或者说,v 包含了一个对象指针,该指针指向一个 Collection 类型的对象(参阅《对象(六)》中的图2)。VarType 的作用是检测 v 里面包含了什么,检测的结果是一个指向对象的指针,因此 VarType 返回 vbObject(9)。TypeName 则进一步追问:这个指针指向的是一个什么样的对象?追问的结果是一个 Collection 类型的对象,因此 TypeName 返回 Collection。其中,varname 是一个变量标识符(identifier),表示一个变量名。IsArray(varname) 判断 varname 所表示的变量是不是一个数组,是则返回 True,否则返回 False。在这个例子中,我们首先声明了一个类型为 Variant 的动态数组变量 a,然后是两个 Variant 变量 v 和 va。接下来,从右侧的输出窗口可以看到,变量 a 虽然还没有确定尺寸,但 IsArray 已经确定 a 为 Variant 类型的数组,其 TypeName 为 Variant(),而 VarType 返回 8204,表示这是两个类型的组合:vbArray(8192)+ vbVariant(12)= 8204。接下来我们看变量 v,可以看出,IsArray(v) 返回 False,其 TypeName 和 VarType 都表示变量 v 为空。现在,我们把数组 a 赋给 v,然后分别检测两个变量的类型。这时我们看到,a 和 v 都是 Variant 类型的数组。然后我们用 Redim 语句确定数组 a 为包含 10 个元素的数组,并且将 a 赋给 Variant 变量 va。此时因为 a 有了确定的尺寸,因此可以通过 LBound 和 UBound 来访问 a 的下界和上界,并且通过 VarPtr 函数获取 a(通过 va)的地址。最后,通过获取 v 的地址,我们就可以知道,虽然 v 是通过赋值获得数组 a 的,但 v 和 a 并不表示同一数组,此时的 v 仍然没有尺寸信息,因为 LBound(v) 函数抛出错误:下标越界。至此,我们通过三篇文章(五、六、七),讲完了 VBA.Information 模块中的所有函数。
基本
文件
流程
错误
SQL
调试
- 请求信息 : 2026-05-24 13:32:59 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/659204.html
- 运行时间 : 0.108227s [ 吞吐率:9.24req/s ] 内存消耗:4,641.23kb 文件加载:145
- 缓存信息 : 0 reads,0 writes
- 会话信息 : SESSION_ID=673fefed64264d9e2217cc9a144480ac
- CONNECT:[ UseTime:0.000436s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
- SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000793s ]
- SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000264s ]
- SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004505s ]
- SHOW FULL COLUMNS FROM `set` [ RunTime:0.000498s ]
- SELECT * FROM `set` [ RunTime:0.000202s ]
- SHOW FULL COLUMNS FROM `article` [ RunTime:0.000493s ]
- SELECT * FROM `article` WHERE `id` = 659204 LIMIT 1 [ RunTime:0.003140s ]
- UPDATE `article` SET `lasttime` = 1779600780 WHERE `id` = 659204 [ RunTime:0.006218s ]
- SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000272s ]
- SELECT * FROM `article` WHERE `id` < 659204 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000429s ]
- SELECT * FROM `article` WHERE `id` > 659204 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000356s ]
- SELECT * FROM `article` WHERE `id` < 659204 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001349s ]
- SELECT * FROM `article` WHERE `id` < 659204 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000753s ]
- SELECT * FROM `article` WHERE `id` < 659204 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001977s ]
0.109905s