通过前面的 VBA 简介,我们已经大致了解了 VBA 中基本的数据类型,从今天开始,我们进入对 VBA 语句的讨论,并通过语句来深化对数据类型的认识。等号(=)称为赋值号,左边的 v 是变量(这也是之所以称其为变量的原因——经过赋值之后,变量的值就发生了变化),右边的 expression是表达式。赋值语句的作用是:先求右边表达式的值,再判断求得的值的类型是否与左边变量的类型相容,如果相容,则将右边求得的值赋给左边的变量,如果不相容,则报告错误。什么是类型相容(type compatibility)?类型相容是编程语言中的一个重要概念,指的是一种数据类型能否在特定上下文中被接受为另一种数据类型。这里的特定上下文是指:- 表达式:x ⊕ y(其中,⊕ 表示任意二元运算符)。
- Sub/Function 的参数(这个以后会详细讨论)。
如在表达式 "ok" + 5 中,运算符 + 要求两边的操作数都要是数值类型,但 "ok" 不是数值类型且不能转换为数值类型,所以 "ok" 和 5 类型不相容。Dim x As IntegerDim s As Stringx = 10s = "Hello"x = s ' Error!
因为 x 被声明为整型,而 10 是一个整型的字面常量,且在 Integer 类型所表示的范围之内,因此 10 与 x 类型相容,赋值语句 x = 10 可以成功执行。同样,因为 s 被声明为变长字符串类型,而 "Hello" 是一个字符串类型的字面常量且在变长字符串类型所表示的范围之内,因此 "Hello" 与 s 类型相容,赋值语句 s = "Hello" 可以成功执行。但因为 x 是整数类型,s 是字符串类型,且 s 的值不能隐式转换(implicitly conversion)为 x 的类型,因此,x 与 s 类型不相容,赋值语句 x = s 报告错误:类型不匹配。这里我们遇到一个新的概念:隐式转换。所谓隐式转换,是指编程语言的编译器/解释器自动将一种数据类型转换为另一种数据类型的转换。譬如下面的代码:Dim x As IntegerDim s As Stringx = 10s = "100"x = s
在赋值语句 x = s 中,虽然 s 是字符串类型,但因为 s 的值可以隐式转换为 Integer 类型,因此 s 与 x 是类型相容的,语句 x = s 可以成功执行。VBA 中的隐式类型转换是非常宽松的,譬如下面的代码:Dim x As IntegerDim s As Strings = "90.8"x = s
x = s 可以成功执行,那执行之后,x 的值是多少?因为赋值的目的地类型是 Integer,因此 s 在转换为数值类型以后,还要再转换为 Integer 类型,才能将结果赋给 x。s 转换为数值类型后的值是 90.8,这是一个浮点数,要将浮点数转换为整数,需要进行“四舍五入”转换,转换后的结果为 91,所以最后 x 的值是 91。关于 VBA 宽松的隐式类型转换,再来看一个例子:Dim x As IntegerDim s As Stringx = 10s = x
语句 s = x 可以成功执行,因为 VBA 知道赋值号左边的 s 是字符串类型,右边的 x 是整数类型,VBA 会先把 x 的值隐式转换为字符串类型 "10",然后再将转换的结果赋给 s。在 VBE 中,打开立即窗口。然后在代码中用 Debug.Print 语句打印变量的值,如图1:Debug.Print 会把内容打印在立即窗口中。第二种方法是使用 MsgBox,如图2:运行上面的代码,MsgBox 显示一个消息框,如图3:第三种方法是在程序运行过程中监视变量的值。在 VBE 的主菜单栏上点击“调试”,如图4:在表达式下面输入要监视的变量(或表达式),譬如要监视变量 x,则输入 x,然后点击“确定”,VBE 会自动打开监视窗口,如图6:此时,光标位于 Sub MyTest() 行,说明编译已完成,正在等待执行。此时的变量 x 和 s 都已经过编译,并被赋予初值。此时光标停在第一行可执行语句上,说明即将开始执行。此时光标停在第二行可执行语句上,说明第一行语句已经执行完毕,即将开始第二行,而且第一行语句的执行结果已经显示在监视窗口中:x 的值变成了 10,这正是赋值语句的结果。此时光标停在 End Sub 行,说明代码已经执行完毕,即将退出。此时对变量 s 的赋值也已经成功执行,执行结果显示在监视窗口中:字符串 10,这也正是 s = x 赋值语句的结果。从以上对 x 和 s 的简单复制语句的监视过程可以看出,对变量(以及表达式)的监视,可以让我们对变量的值的变化有一个动态的可视的了解。对于初学者非常有帮助,即使是高手,有时候也需要了解复杂表达式的值以及变量的变化过程。