乐于分享
好东西不私藏

Excel VBA 编程基础 -- 对象(六)

Excel VBA 编程基础 -- 对象(六)
今天继续深入探讨上一篇未尽的话题。
VBA 的值大体上可以分为四大类:
  • 数值(包括整型值、浮点型值、布尔值):默认值是 0
  • 字符串:默认值是空字符串
  • 对象:默认值是 Nothing
  • 变体:默认值是 Empty
这四大类值的初始情况如下图所示:
图1 各种类型值的初始情况
按 F8 进入逐语句调试,执行标记停在 Sub 处,表明此时 Sub IsTest2 已经编译完成,等待执行。此时,各种变量如 n、b 等都已经完成类型声明,对于数值型和字符串型变量 n、b、s,在类型声明的同时也完成了初始化,所以这几个变量都具有自己的初值:数值型的初值是 0,字符串型的初值是空字符串。
但 Object 和 Variant 类型的变量和上面的变量不同,它们的类型声明仅是类型声明,不负责初始化,也就是说,如果仅是类型声明,则它们的值处于未定/未初始化状态(undefined/uninitialized)。所以,对象变量 o 的 IsEmpty() 虽然返回 False,但 o Is Nothing 结果为 True。但 v 的 IsEmpty() 返回 True,明确表示 v 的值为空。
上面监视窗口中,o 的值为 Nothing 是什么意思?请见下图:
图2 对象变量
当我们用 Dim o As Collection 声明一个对象变量 o 时,在未初始化之前,o 不指向任何对象,如上图左侧所示。而当我们执行 Set o = New Collection 语句时,New 操作符在内存中分配 Collection 对象所需的空间(初始空间),并初始化该内存空间,最后返回该内存空间的首地址并赋给对象变量 o,此时,o 将指向一个确定的对象,如上图右侧所示。
上图左侧的状态,此时 o 不指向任何对象,o 的值为 Nothing,即 o 没有任何值(此即 Nothing 的本义)。一旦通过 New 操作符或其他的对象赋值语句,o 将指向确定的对象,此时 o 的值将不再是 Nothing,而有确定的内存地址(该内存地址标识一个对象)。
那为什么 IsEmpty(o) 会返回 False?
前面说明,在 o 未初始化之前,o 的值是 Nothing,也就是说,o 是有值的,只不过这个值是 Nothing 而已。既然有值,就说明 o 不为空,因此 IsEmpty(o) 返回 False。你可以测试一下:IsEmpty(Nothing) 返回 False!
注:如果你学过 C 语言,就知道 VBA 中的 Nothing 其实相当于 C 中的 NULL。只不过在 C 中,声明一个指针变量 p 且 p 未初始化之前并不能保证 p 的值是 NULL,而在 VBA 中,对象变量的值在未初始化之前一定是 Nothing。
由以上的说明,我们知道:
  • Empty 是针对 Variant 类型的变量而言的,任何其他值类型的 Empty 都隐式转换为其默认值(数值型为 0,字符串类型为空字符串)
    • Null 也是针对 Variant 类型的变量而言的,只不过这是一个专门用于存储数据库字段的特殊值
  • Nothing 是针对 Object 类型(或其他具体的对象类型)的变量而言的
我们在日常应用中,尽量将变量声明为具体的特定类型,譬如 Integer、Double、String 等,尽量少用变体类型。但有时候为了通用,会特意将变量声明为 Variant 类型。
例1. 对参数的各种测试
图3 对参数的各种测试
在这个例子中,我们通过将函数 TestValue 的参数 value 声明为 Variant 类型的可选参数,就可以对其进行各种测试。
首先,是用 IsMissing 函数来测试调用方有没有提供可选参数;然后测试参数是否为空,注:IsEmpty 测试只有在参数为 Variant 类型时才有意义;接下来测试参数是否为 Null;然后是空字符串测试,注意:这步测试需要两个条件,首先测试参数的子类型是否字符串类型(vbString),然后测试字符串是否空字符串,这步测试要用 v = "" 来测试 v 是否空字符串,不能用 IsEmpty(v),想一想为什么?
如果以上情形都不是,则参数 v 肯定有值,将 v 的值用 CStr 函数转换为字符串类型,作为函数值返回。
右边的立即窗口显示了 ValueTest 过程中的测试结果。有几点值得注意:
  • a + 5:该表达式在 a 为 Empty 时,其值为 5。这是因为在算术表达式中,Empty 将隐式转换为数值的默认值 0。
  • a & "Hello":该表达式在 a 为 Null 时,其值为 Hello。这是因为在字符串连接表达式中,Null 将隐式转换为空字符串。
  • a + "3.5":该表达式在 a 为 Null 时,其值为 Null。这是因为在算术表达式中,只要一个操作数为 Null,则整个表达式的值就是 Null。
(未完待续)
相关阅读
Excel VBA 编程基础 -- 对象(一)
Excel VBA 编程基础 -- 对象(二)
Excel VBA 编程基础 -- 对象(三)
Excel VBA 编程基础 -- 对象(四)
Excel VBA 编程基础 -- 对象(五)

相关学习资料