购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 常量、变量与数组

在程序设计与执行过程中,不同类型的数据可以以常量的形式出现,也可以以变量的形式出现。常量主要代表着内存中的存储单元,在程序执行期间值是不发生改变的,而变量则是可变的。

2.2.1 常量

常量是指在程序运行的过程中其值不能被改变的量。在VBA环境中常量通常分为两类:内置常量与用户自定义常量。

1.内置常量

任何应用程序都会包含内置常量,而且这些常量均会被赋予值。为了方便记忆与使用内置常量名字,通常采用两个字符开头指明应用程序名的方式定义,例如:Word对象的常量都以wd开头;在VBA中的常量,开头两个字母通常为vb。用户可以通过VBA的对象浏览器来显示对象库提供的常量列表。

2.用户自定义常量

应用程序内置的常量始终不能完全满足用户需要,因此在进行代码功能定制时,用户通常自己也会定义一些常量。要声明常量,必须使用Const关键字。

Const语法形式:

[Public|Private] Const Constaname [As type]=Value

参数说明:

● Public|Private:指定了该常量的有效范围,即作用域。该项参数是可选项。

● Const:指定了常量名字。

● Type:表示为前面所提到各类数据类型中的一种。对任何常量的定义都需要指定数据类型。

● Value:表示常量的值。

例如:指定mconst并初始化其值为100。

Const mconst as Integer=100

在同一行中还可以定义多个常量,但每个常量都需要定义其数据类型,且以逗号进行分隔。例如:

Const Rol as integer,stuName as string=David

2.2.2 变量

变量实际上是一个符号地址,代表了命名的存储位置,包含程序执行阶段修改的数据。每个变量都有变量名,在其作用域范围内可唯一识别。

常量必须在声明时进行初始化,而对于变量,使用前可以指定数据类型(即采用显式声明),也可以不指定(即采用隐式声明)。

在VBA中变量通过Dim语句进行声明,每个变量都包含名称与数据类型两部分,通过名称可以引用一个变量,而数据类型则决定了该变量的内在分配空间。

1.显式声明变量

显式声明是指在过程开始之前进行变量声明,然后由VBA为该变量分配内存空间。显式声明使用较为广泛,原因在于该声明具有以下优点:

● 显式声明更便于代码阅读。

● 出现拼写错误时,VBA不会自动创建新变量。

● 代码运行更快。

显式声明的主要缺点:必须在过程开始之前花费时间声明变量。

2.隐式声明变量

隐式声明变量是指不在过程开始之前显式声明的变量,在第一次使用时自动进行声明。对于VBA而言,在程序执行过程中遇到此类变量时,都会检查是否已经存在同名的变量,如果没有找到这样的变量,则直接创建该变量,并指定为Variant数据类型。

这种方式的最大优点是,只在程序使用时才进行声明,比较容易阅读。但也有不足之处,其一是在编码时可能会有很多输入错误,假设已经声明了N_Total变量,并赋值为100,当在代码中使用该变量时,如果输入的变量名为“N Total”(下划线变为空格),则VBA会识别到这个错误,然后创建一个新的变量N_Total,并初始化值为0。

另一不足之处就是数据类型的问题,Variant类型数据比其他任何类型的数据占用内存空间都要多,因此当隐式声明变量过多时,程序会占据大量的内存空间,从而导致整体运行时间过长。

3.变量命名规则

任何变量都需要一个名称,在VBA中变量的命名具有一定的规则。

● 名称只能由字母、数字、下划线组成。

● 名称的第一个字符必须是字母。

● 名称的有效字符长度为255个。

● 不能使用保留字作为变量名,但可以将保留字作为嵌套放入名称中。如不可以定义Print作为变量名,但可以定义Print_Name作为变量名。

变量名的定义形式:

Declare 变量名 as 数据类型

Declare可以是Dim、Static、ReDim、Public、Private。

例如,定义Print_Name作为字符串变量。

Dim Print_Name as String

Dim与Static之间的区别:Dim为动态变量,即每次引用变量时,变量会自动重新设置为0,字符串设置为空;Static为静态变量,即每次引用变量时,其值会继续保留使用。

下面用一个示例演示Dim与Static的区别,操作步骤如下:

在Excel中,单击“开发工具”选项卡,在“代码”选项组中单击Visual Basic按钮,切换到VBE环境。

选择“插入→用户窗体”菜单命令,创建窗体。

右击创建的空白窗体,在弹出的快捷菜单中选择“查看代码”命令,如图2-1所示。

图2-1

打开代码编辑窗口,输入图2-2所示代码。

输入完成后,按F5键运行代码,即可打开创建的窗体,如图2-3所示。

单击窗体,可查看程序运行的结果,如图2-4所示。

图2-2

图2-3

图2-4

不断单击“确定”按钮和窗体,会发现“n”的值在不断增加,而“x”的值始终为1,如图2-5、图2-6所示。

图2-5

图2-6

4.变量作用域

能否在一个过程中使用变量取决于变量的作用域,即变量声明的位置。变量的作用域是指变量的可访问性。如果希望变量能够被模块中的所有过程使用,则需要将变量声明在通用声明中,此时该变量的作用域则成为全体(Public)。

(1)过程变量作用域

该作用域的变量只在创建的过程内使用,并随着过程的结束而消失。例如:

Sub N_Total()

Dim I as integer

...

End Sub

该例中创建了一个名叫N_Total的过程,并在过程内定义了一个变量“I”,换句话说“I”只在过程N_Total中有效。

(2)私有变量作用域

对于私有作用域的变量,主要在模块中的所有过程内使用,而其他模块中的过程则无法使用。采用私有作用域声明变量,就能确保将其值传递给该模块内的其他过程。与过程变量作用域不同的是,对于采用私有变量作用域声明的变量,只要创建它的项目在运行,该变量就一直存在。

要采用私有变量作用域,必须使用Private或Dim。若使用Dim语句定义私有作用域变量,则该定义语句一定要写在过程的前面。例如:

Private i_ok as Boolean

Dim cs as integer

Sub Test()

...

End sub

(3)公共变量作用域

具有公共作用域的变量可以让所有模块中的所有过程都使用。该变量的声明是利用Public表示的,例如:

Public Pcount as integer

5.变量的生命周期

变量的生命周期与作用域是两个不同的概念,生命周期是指变量从首次出现(执行变量声明,为其分配存储空间)到使用它的代码不再使用它而该变量消失之间的时间。

过程变量的生命周期是过程或函数被开始调用到运行结束的时间(静态变量除外,静态变量的声明使用“Static变量名As数据类型”。该变量在Access程序执行期间一直存在,其作用范围是声明其子程序或函数。静态变量可以用来计算事件发生的次数或者函数与过程被调用的次数)。

公共变量的生命周期是从声明到整个Access应用程序结束。

私有变量的生命周期则贯穿整个代码执行过程直到结束。

2.2.3 数组

使用变量有一定的局限性,即每个变量一次只能存储一个值。若需要变量存储20个值,则必须声明20个变量,可对一个变量进行20次赋值,这样的方法会花费较多的时间,因此这类应用可采用数组的方法来进行声明。

数组是由一组具有相同数据类型的变量(称为数组元素)构成的有序序列。

数组变量由变量名和数组下标组成。

1.声明数组

与变量相同,数组也是通过Dim语句来进行声明的。声明时在数组名后加一对括号,括号中可以指定数组大小,也可为空。括号内有值的数组被称为固定数组,而括号内为空的数组则被称为动态数组。

动态数组在以后使用时再用ReDim来指定数组大小,这被称为数组重定义。在对数组重定义时,可以使用ReDim后加保留字Preserve来保留以前的值,否则使用ReDim后数组元素的值会被重新初始化为默认值。

例如,下面的语句分别定义了一个名为MyArray且包含有20个项的长整型固定数组,以及一个名为MyName的整型动态数组:

Dim MyArray(20) As Long

Dim MyName() as Integer

知识拓展

如何调整固定数组大小?

对于固定数组,可通过ReDim的方式来重新定义数组大小,如重臵前面的MyArray,改大小为30,表示为ReDim MyArray(30)。

2.使用数组中的值

存储或调用数组中的数据,都需要引用数组元素。因此数组中的每个元素都具有一个与之关联的下标号,数组的第一个数据下标号为0,其他依次排列,如表示数组中的第3个数据,表示为MyArray(2)。

例如,对MyArray数组进行赋值,数据定义如下:

MyArray(0)=1

MyArray(1)=2

MyArray(2)=3

... 1KBNxebsQFdjA0CU2GgpcVGtNh7DoVHzkTvASt6lLD1ejDLawO8dIaSclNAfKrpZ

点击中间区域
呼出菜单
上一章
目录
下一章
×