Excel VBA教程 0004

变量

变量是指在程序运行过程中其值可以改变的量。变量相当于一个储存数值的容器,它对应计算机内存中的一个存储单元(或存储区城)。变量在使用前首先声明,声明变量的作用就是要系统为其分配存储单元。变量声明后,每个变量就拥有一个名字,并具有种数据类型。变量的名字在其范围内可难识别, 也就说在定范围内变量不能重名。 在程序中是通过名字来引用变量,面数据类型决定了变量的存储方式。

1、变量命名

实际上可以给变量指定任何名字,英文、中文甚至希腊字符都可以,但是通常还是以英文字符命名。在声明变量时,必须遵守以下事项:

●变量名必须以字符开头,长度最大为255。

●变量名只使由字母、数字和下划线组成,不能含有小数点,空格等字符。

●变量名不能使用VBA的关键字(也称为保留字,如事件名、语句名和通数名等)。因为关键字具有特殊的意义。

通常使用Dim语句来声明变量。它的语法形式如下:

Dim strName As String

这个语句声明了名字为strName的字符串变量,名字中的前缀str表示变瓜的数据类型为字符型。这是在程序中一种比较好的命名规则,但不是必须的规则。

可以在一个语句中声明几个变量。而为了指定数据类型,必须将每一个变量的数据类型包含进来。在下面的语句中,变量intX、intY 与intZ被声明为Integer类型:

Dim intX As Integer, intY As Integer, intZ As Integer

Dim intX, intY, inZ As Integer

则变量intX与intY被声明为Variant类型:只有intZ被声明为Integer类型。在这一点十分容易产生错误的认识,请大家注意。

Dim sh As WorkSheet

Set sh = Worksheets.Add

使用Set语句将sh指向新创建的工作表。这条语句的作用即sh成为所创建的工作表的快捷引用。

VBA中允许不加声明就直接使用变量,此时默认的变量类型为变体型。由于前面所指出的原因,这不是一个好的编程习惯,应尽量避免。

为了避免隐式声明,VBA提供了强制显示声明变量的功能。具体方法是在VBE编辑器中,点击【工具】→【选项】→【要求变量声明】→【确定】,如下图

设置了“要求变量声明”后,在模块窗口中,将会增加一条Option Explicit语句,如下图,其作用就是强制声明变量。

没有声明的变量,VBA认为是语法错误的,将给出提示。当然也可以手工输入这条语句。使用Option Explicit语句是一种好的编程习惯。 可以避免没有声明变量而直接使用变量带来的程序调试的复杂性。

5、变量的作用城

变量的作用域是指变量的有效的范围。

在一个过程中声明的变量只能在过程中使用,也就是只能在过程中有效,这种变量具有过程级作用域。因此可以在不同的过程中声明具有相同名称的变量。

如果是在一个模块中声明的变量,则能在该模块的各个过程都有效,这种变量具有模块级的作用域。但是离开了这个过程该变量就无效了.模块级变量是在模块的通用声明段用Dim或Private声明的。

如果一个变量可以应用到程序的任何个模块或任何一个窗体中, 这样的变量称为全局变量。全局变量是在模块的通用声明段用Public语句来声明的。

6、变量的生存周期

变量的生存周期是变量能够保存其值的时间。根据变量的生存周期可以将变量分为普通变量和静态变量。为了便于与静态变量对比,普通变量称为动态变量,可能更为恰当。

在程序运行进入变量所在的过程时,才分配该变量内存单元。当退出该过程时,该变量占用的内存单元自动释放,其值消失。当再次进入该过程时,所有的动态变量重新初始化。这样的变量称为动态变量。使用Dim语句声明的变量属于动态变量。

静态变量是指程序运行进入该变量所在的过程,即使退出该过程后,其值仍被保留,即变量所占的内存单元不被释放。当以后再次进入该过程时,原来的变且值可以继续使用。

如果把普通变量比作一年生的草本植物,在退出过程或者退出模块后,失去作用,如同草本植物的死亡。那么静态变量则相当于多年生的木本植物,在退出过程或模块后,仍然不死而有效。

使用Static语句来说明静态变量。如下面语句声明了一个整型的静态变量S:

Static s As Integer

例子:比较静态变量和普通 (动态) 变量的运行结果。

Sub 静态变量()

Static AA As Integer

AA= AA+ 1

Debug.Print AA

End Sub

Sub 动态变量()

Dim AA As Integer

AA= AA+ 1

Debug.Print AA;

End Sub

对于普通变量过程,每次运行过程时,在立即窗口中总是打印1。对于静态变量过程,每运行一次,在立即窗口中总是显示变量AA的累加值。

备注:为了每一次的运行不被覆盖,在Debug.Print AA;语句的最后加上了分号,这样下一次运行结果将在同一行分开显示。