这四大类值的初始情况如下图所示:图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。由以上的说明,我们知道: