Excel 2016 VBA入门与应用
上QQ阅读APP看书,第一时间看更新

3.2 存储数据的容器:变量

在田间采摘了丰富的果实必须放置于篮中,如果只凭双手,也许你将永远只能得到两个果实。在程序中,经常需要将计算结果保存下来,以便于在其后的程序中使用这些数据,这就要用到变量。

3.2.1 使用变量的第一步:声明变量

所谓的变量,顾名思义就是指在程序运行过程中其值可以改变的量。变量在程序中相当于一个存储数据的容器,其对应计算机内存中的一个存储单元,就像使用的Excel工作表中单元格那样。变量在使用前首先需要声明,声明的作用是向系统索要存储数据的单元,变量在声明后将拥有一个名字,同时具有一种数据类型。

在程序中,声明变量后,每个变量将会拥有一个名字,这个名字称为变量名。变量名是变量在程序中唯一可识别的标识,程序将通过这个名字来引用变量。这就像我们在出生时父母给我们起名一样,这个名字将伴随我们一生成为我们在这个世界上的标识。

与家长可以根据自己的喜好任意给自己的孩子起名不同,在程序中给变量命名有很多的“禁忌”,有更多的要求。首先,由于变量名是变量的唯一标识,因此变量名在变量的使用范围内是不允许重名的。同时,在VBA中,程序命名必须遵循一定的规则,也就是说作为程序员不能随心所欲地为一个变量命名。声明变量时,变量命名必须遵循如下的规则:

● 变量名必须以字符开头,长度最长为255个字符。这里要注意,中文版的Excel支持中文作为变量名。

● 变量名只能由字母、数字和下划线组成,不能包含小数点、空格、句点和感叹号以及“@”“&”“$”和“#”等字符。

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

● 不能在相同范围的层次中使用重复的名称,如不能在VBA过程中声明两个名称为age的变量。

在VBA程序中,可以使用一个专门的命令来声明变量,或者直接在语句中使用变量来创建变量。根据上面的描述可以知道,声明变量就是让VBA知道该变量的名称和数据类型,这称为“强制声明”。在VBA中,可以使用Dim语句来声明变量,语法格式如下:

        Dim变量名 [As数据类型]

这里,Dim和As为声明变量的关键字,数据类型为上一节介绍的那些VBA中的数据类型,中括号里的内容表示其可以被省略掉,即在声明变量时也可以不指定变量的数据类型。如下面的语句声明一个命名为myString的字符串变量。

        Dim myString As String

在声明变量时,可以在一个语句中同时声明多个变量,此时为了指定数据类型,需要将每一个变量的数据类型包含进去。如下面语句中,将变量intA、intB和intC声明为Integer类型。

        Dim intA As Integer, intB As Integer, intC As Integer

这里要注意的是,如果使用下面的语句:

        Dim intA, intB, intC As Integer

此时变量intA和intB被声明为Variant类型,只有变量intC被声明为Integer类型。

3.2.2 先声明,再使用——强制声明变量

程序中的变量在使用前必须要声明吗?熟悉VBA的朋友们肯定会说:不声明也行。在VBA中,如果程序中引用了未经声明的变量,则将暗示VBA要创建该变量。此时VBA会将这种未声明的变量自动设置为变体型(即Variant)数据,这种方式称为隐式声明。看上去,这种方式在使用上很方便,至少可以在编写程序时省略变量的声明步骤,这让人何乐而不为呢?但实际上,隐式声明却有以下无法回避的缺点:

● 在过程中错误拼写变量名时,VBA不会给出提示。如在使用一个名为myMusic变量时,如果将变量名错拼成了myMusice,程序将无法获取变量的值,同时也不会报错。这样无疑增加了调试应用程序的难度。

● 隐式声明的变量为Variant型数据类型,相对于其他数据类型,这种数据类型占用的内存空间最多。另外,VBA每次处理这种数据类型的变量时都要检查其他数据类型,这会导致程序运行速度变慢,影响程序的运行效率。

在编写VBA程序时,应该避免对变量使用隐式声明。为了避免隐式声明,VBA提供了强制变量声明的功能。在编写程序时,可以在模块的声明部分加入Option Explicit语句,该语句的作用是要求该模块中所有的变量必须先声明再使用。如果VBA使用了未声明的变量,VBA将给出提示。

每个需要强制变量声明的模块中都必须要包含Option Explicit语句,实际上为了省事,可以让VBA在每次插入新模块时自动添加该语句。具体的操作方法如下。

01 启动Visual Basic编辑器后,选择“工具”|“选项”命令打开“选项”对话框,在对话框的“编辑器”选项卡中选中“要求变量声明”复选框,如图3-3所示。

图3-3 选中“要求变量声明”复选框

02 单击“确定”按钮,关闭“选项”对话框,则每次在创建模块时,Visual Basic编辑器都将自动在模块的第一行添加Option Explicit语句,如图3-4所示。

图3-4 插入模块时自动添加Option Explicit语句

3.2.3 变量的作用域

不同的变量在VBA过程中有不同的有效范围,这个有效范围称为变量的作用域。VBA中有三种作用域级别的变量,即过程级变量、模块级变量和工程级变量。

1.过程级变量

过程级变量也称为局部变量,是一种只能在声明它的过程中使用的变量。过程级变量在过程结束后会马上消失,其他的过程也就无法再使用该变量了,VBA同时会释放该变量所占用的内存空间。因此,这种变量的使用将极大地节省计算机内存空间。

在VBA程序中,过程级变量就是使用Dim关键字来定义的变量。Dim在模块中的位置决定了变量的作用域,当Dim语句在过程中出现时,声明的变量即为过程级变量,只能在该过程中使用。

2.模块级变量

一个模块可以包含多个过程,如果多个过程间需要共享某个变量的值,此时就需要将变量定义为模块级变量。定义模块级变量很简单,只需要将声明变量的Dim语句放置到模块的声明部分,也就是放置到过程之外即可。如下面语句将定义一个模块级变量myString。

        Option Explicit
        Dim myString As String
        Sub test1()
         myString=myString &"欢迎您"
        End Sub
        Sub test2()
         myString=myString & "VBA世界"
        End Sub

在这段程序中,声明变量myString的Dim语句位于两个过程之外,Dim语句声明了一个模块级变量,该变量能够被test1过程和test2过程所访问。

3.工程级变量

相对于过程级变量和模块级变量,工程级变量的作用范围最大。工程级变量也称为全局变量,该类变量能够在工程中的各个模块中被访问。在模块的声明部分使用Public关键字声明的变量称为工程级变量。如下面的语句将声明一个工程级变量myNumber。

        Option Explicit
        Public myNumber As Number

在VBA程序中,应该尽量使用过程级变量,只有确实需要在不同过程间共享数据时才使用模块级变量,同时应该控制全局变量的数量。

3.2.4 变量的生存周期

变量有作用范围,也有生存周期,变量的生存周期指的是变量数据能够在内存中保留的时间。如当程序进入变量所在的过程时为其分配内存单元,当退出该过程时,该变量占用的内存单元将被释放,其值也将消失。如果再次进入该过程,变量将会重新初始化。这样的变量称为动态变量,使用Dim语句声明的变量都属于动态变量。

如果在程序运行进入变量所在的过程后,即使退出了过程,该变量的值仍然被保留,也就是变量所占用的内存单元不释放。当再次进入该过程时,变量值能够再次被使用,这样的变量称为静态变量。

在程序中,动态变量就像一个楼梯上的声控灯,当你步入这段楼梯时灯会亮起,离开时灯会自动灭掉。而静态变量就像一个路灯,夜晚你经过这个路段,其会给你带来光明,照亮你前方的道路,而当你离开这个路段时,它还会依然亮着,等待你的回来或其他人经过。

要使变量成为永远有效的静态变量,可以使用Static关键字来进行声明。下面语句即声明了静态变量myName。

        Static myName As String

下面通过示例来展示静态变量和动态变量生存周期的不同。

01 打开VBA编辑器,选择“插入”|“模块”命令在工程中插入一个模块。在模块的“代码”窗口中输入如下程序代码:

        Sub静态变量()
        Static num1 As Integer   ’声明静态变量
        num1 = num1 + 5           ’变量值加5
        Debug.Print num1          ’显示计算结果
        End Sub
        Sub动态变量()
        Dim num1 As Integer      ’声明变量,变量为动态变量
        num1 = num1 + 5           ’变量值加5
        Debug.Print num1          ’显示计算结果
        End Sub

02 选择“视图”|“立即窗口”命令打开“立即窗口”对话框。将插入点光标放置到“静态变量()”模块中,按F5键5次。由于变量num1在该模块中是静态变量,只有在第一次进入过程时才初始化。退出过程时不从内存中释放该变量,则再次进入该过程时变量中都保存有上一次的计算结果。因此每执行一次过程,变量的值都会加5, “立即窗口”中将显示5次计算结果,如图3-5所示。

图3-5 程序运行结果

03 在“代码”窗口中将插入点光标放置到“动态变量()”模块中,按F5键5次,“立即窗口”中显示计算结果。这里,由于变量num1是动态变量,每次过程被执行时变量均会被初始化,过程执行完后变量从内存中释放。因此无论按F5键执行该过程多少次,“立即窗口”中显示的变量值永远只是5,如图3-6所示。

图3-6 “立即窗口”中显示的变量值永远是5

注意:无论是静态变量还是动态变量,关闭相关Excel工作簿后,其生存期都将结束。