3.3 存储数据的容器:常量和变量

3.3.1 常量和变量

常量和变量是VBA存储数据的两种容器。

一个酱油瓶可以打多次酱油,第一斤酱油用完了,拿到小买部满满的一瓶又提着回来。变量就像酱油瓶,可以随时随地把里面原有的酱油倒掉,再装入新的酱油。

而常量就像袋装酱油的包装袋,一旦往里面装入酱油,就不能更换其他的酱油。

因此,无论存储什么类型的数据,变量都可以更换内容,重复使用,而常量不可以。这是变量和常量的区别。

3.3.2 使用变量

存储在变量里的数据可以更换,因此变量通常用来存储在程序运行过程中需要临时保存的数据或对象。

img062 声明变量

img081

就像指定瓶子的名称和用途一样,声明变量就是指定变量的名称和可以存储的数据类型。可以用语句:

img082

如:

img083

声明为String(变长)的变量最长可以串储约20亿个字符,见表3-1,如果要声明定长的String变量,就在声明时指定它可以存储的数据的长度,如:

img084

指定变量的数据类型后,该变量只能存储指定类型的数据,而不能存储其他类型的数据。

img062 使用变量类型声明符

img085

只有部分数据类型可以使用类型声明符,如表3-3所示。

表3-3   类型声明符

数据类型类型声明字符
Integer%
Long&
Single!
Double#
Currency@
String$

img062 声明多个变量

声明多个变量,可以写在同一个Dim后面,变量名之间用逗号隔开。

img086

也可以用不同的语句声明:

img087

img062 如果不指定变量类型

img088

img062 什么是Variant

Variant类型也称为变体型。

之所以称为变体,是因为Variant类型的变量可以根据需要存储的数据类型改变自己的类型与之匹配。就像一个无穷大的大水缸,不管你有多少斤酱油都可以装在里面,不管是什么东西都可以装在里面。

img062 为什么要声明变量类型

img089

同上街打酱油一样,尽管大水缸可以装下任意多的酱油,但如果预先已经知道自己只打一斤酱油,你会不会选择背着大水缸去?

相比水缸,带着酱油瓶会走得更快。计算机也一样,运行程序时,数据占用的字节越小,程序运行就越快,所以,声明变量为合适的数据类型是一个好习惯。

Variant类型比其他数据类型占用更大的存储空间(见表3-1),因此,编写VBA程序时,除非必须需要,否则应避免声明变量为Variant类型。

img062 强制声明所有变量

img090

方法一:在模块的第一句手动输入代码:“Option Explicit”。

img091

Step 1:插入一个模块,在代码窗口中输入下面的程序,如图3-4所示。

img092

图3-4 强制声明变量

Step 2:运行程序,出现提示,如图3-5所示。

img093

图3-5 执行程序后出错

方法二:按图3-6所示设置完成后,VBA会在每个模块的第一句自动写下“Option Explicit”而无需用户手动输入。

img094

图3-6 设置强制声明变量

img062 还可以这样声明变量

img095

img096

如:

img097

img062 变量的作用域

我家厨房里的酱油瓶只供我的家人使用,因为它只属于我家。村头的那口老井,谁都可以在里面打水,因为它是全村共有的。

酱油瓶和水井的作用域不同,决定了哪些人有资格使用它。

变量的作用域决定变量可以在哪个模块或过程中使用。VBA中的变量有3种不同级别的作用域,如表3-4所示。

表3-4                  变量的作用域

作用域描述
单个过程在一个过程中使用Dim或Static语句声明的变量,作用域为本过程,即只有声明变量的语句所在的过程可以使用它。这样的变量称为本地变量
单个模块在模块的第一个过程之前使用Dim或Private语句声明的变量,作用域为声明变量的语句所在模块里的所有过程,即该模块里所有的过程都可以使用它。这样的变量称为模块级变量
所有模块在一个模块的第一个过程之前使用Public语名声明的变量,作用域为所有模块,即所有模块里的过程都可以使用它。这样的变量称为公共变量

图3-7~图3-9所示为不同类型的变量的声明语句。

img098

图3-7 声明本地变量

img099

图3-8 声明模块级变量

img100

图3-9 声明公共变量

注意:公共变量必须在模块对象中声明,在工作表、窗体等对象中,即使使用Public语句声明变量,该变量也只是模块级变量。

img062 把数量存储到变量里

把数据存储到变量里,称为给变量赋值。

如果给文本、数值、日期等数据型变量赋值,语句为:

img101

给变量赋值后,当使用这个数据时,可以直接使用变量名称代替对应的数据。如:

img102

这个程序定义一个String型的变量,然后给变量赋值,最后把变量的值定入活动工作表的A1单元格中。运行程序,结果如图3-10所示。

img103

图3-10 使用变量

如果给对象变量(Object型,如单元格)赋值,语句为:

img104

如:

img105

这个程序在Sheet1工作表的A1单元格中输入文本“欢迎来到Excel Home论坛”,运行程序,结果如图3-11所示。

img106

图3-11 使用对象变量