Excel VBA 编程基础 — VBA 简介(三)
前面我们在讨论 VBA 的表达式时,说过 “ok” + 5 无意义是因为加法(+)要求两边操作数的类型要一致,也说过 5 + 3.5 有意义是因为整数 5 自动类型转换为浮点型 5.0,然后再参与加法运算,得出结果 8.5。问题是:为什么是 5 转换为浮点型,而不是 3.5 转换为整型?
要回答这个问题,需要进一步了解 VBA 中的数据类型。
前文我们说过,像 a 这样的变量,在内存中表示为一个小盒子,这个小盒子占有一定大小的空间,这个“一定大小的空间”称为存储尺寸(storage size)。不同类型的变量,其存储尺寸也是不同的。一般来说,存储尺寸的最小单位是字节(byte),占 8 个二进制位(bit)。位是计算机中表示信息的最小单位,但用位来表示数据总是不方便,所以一般都用字节来表示数据的尺寸单位,所有数据类型的存储尺寸都表示为字节的整数倍。
上面的表格只列出了 VBA 中的基本类型,其他类型以后再讨论。
-
LongLong:这是表示 64 位整数的类型,只有 64 位的 VBA 才支持这个类型。
-
String * n:表示定长字符串,也就是字符串的长度在变量声明的时候就指定了。我们在以后再讨论变量声明(variable declaration)。
-
string_len:表示字符串的长度,如 “ok” 字符串的长度是 2。
-
含有字符串的变体类型,如果当前是 64 位 VBA,则额外的字节数是 24,如果是 32 位 VBA,则额外的字节数是 22。
-
如果用位来表示整型,则 Byte 是 8 位整型,Integer 是 16 位整型,Long 是 32 位整型,LongLong 是 64 位整型。
-
如果用位来表示浮点型,则 Single 是 32 位浮点型,Double 是 64 位浮点型。
有了这些基本类型的准备,我们就可以来讨论表达式的求值了。
VBA 中一般的表达式都是二元表达式(binary expression),也就是形如 x ⊕ y 这样的表达式,即:左操作数 ⊕ 右操作数(我们用 ⊕ 表示一般的算术运算符)。在这样的二元表达式中,左右两边的操作数有可能不是同一类型,就像 5 + 3.5 这样的表达式,那如何确定最后表达式的类型呢?VBA 中列了一个表格,规定了表达式类型的确定规则,如图2:
我们可以通过查表来确定一个表达式的类型。以 5 + 3.5 为例:
左操作数是 5,类型是 Integer,查表左操作数为 Integer 的行,有许多行都满足条件,如 2、3、5、7、9、13、15、17、18。
右操作数是 3.5,类型是 Double,查表右操作数为 Double 的行,有 12、13、14、16、17。
仔细考察上面两个行数的集合,只有 13 在两边都出现。而第 13 行的结果类型是 Double,这也就是 5 + 3.5 这个表达式的结果类型。
所谓变体类型,就是能表示所有基本类型(不包括 String * n 即定长字符串类型)的一种数据类型。
因为在 VBA 的立即窗口中不能作变量声明,因此所有变量的数据类型都是变体类型。所以我们看到,变量 a 的值一会儿是 10,一会儿又是 “ok”。但在参与具体运算时,则用该变体类型中的值本身的类型参与运算。
VBA 提供了 TypeName 函数用来获取变量的类型,用法如下图所示:
由图可见,在给 a 赋值 10 时,a 的类型是整型(Integer),赋值 “abc” 时,a 的类型变成了字符串类型(String),而在赋值 3.5 时,a 的类型又变成了浮点型(Double)。这就是“变体”类型的含义:对于同一个变量,它的类型是可变的!
除了 TypeName 之外,VBA 还有一个 VarType 函数用于获取变量的类型,与 TypeName 返回类型名称不同,VarType 返回代表变量类型的一个整数。如下图所示:
由图可见,表示整数类型的数值是 2,表示字符串类型的数值是 8,而表示双精度浮点型的数值是 5。
我们可以把表示类型名称的常量与数值编码的对应关系列表如下:
表中带有底纹的部分都是我们已经介绍过的基本类型,未加底纹的部分我们以后再详加讨论。