6.3 VBA程序设计基础
6.3.1 数据类型
6.3.2 常量、变量与数组
6.3.3 运算符与表达式
返回
VBA数据类型继承了传统的 Basic语言,如
Microsoft QuickBasic。 在 VBA应用程序中,也
需要对变量的数据类型进行说明。 VBA提供了
较为完备的数据类型,Access数据表中的字段
使用的数据类型( OLE对象和备注字段数据类
型除外)在 VBA中都有对应的类型。 VBA数据
类型、类型声明符、数据类型和取值范围如表
6-5。
其中, 字符串类型又分为变长字符串 ( String) 和
定长字符串 ( String * length) 。
除了上述系统提供的基本数据类型外,VBA还
支持用户自定义数据类型。自定义数据类型实
质上是由基本数据类型构造而成的一种数据类
型,我们可以根据需要来定义一个或多个自定
义数据类型。
6.3.1 数据类型
表 6-5 VBA基本数据类型
V A B ?- Dí ?? 1? êù ?Y ?- Dí óD D§? μ ?? ?§ ?? è? ?μ
By t e ?? ?ù 0~ 255 0
Int e g e r % ?? Dí -32 768 ~ 327 67 0
Bo ol e a n ê? / ?? T rue 1í F a l s e F A L S E
L ong & 3¤? ? Dí -2147 4836 48~ 2147 4836 7 0
·1 êù £1 -3.402 823E 38~ -1.401 298E -5
?ù êù £1 1.401298E -45~ 3.402823E 38
·1 êù £1 -1.720 0069 3134 8623 2E 308 μ? -
4.9406564841247E -324
?ù êù £1 4.9406 56484 1247E -324 μ?
1.7200069313486232E 308
Cu rre nc y @ o? aò -9223 3720 3685 μ? 922337203685 0
S t ri ng $ ?? ?? ′? ·? ?Y ?? ?? ′? 3¤? è ?÷ ?¨ ""
D a t a è? ?ù / êa? ? J a nua ry 1,1 00 μ? D e c e m be r 31,99 99 0
O bj e c t ?? ??
V a ri a nt a? ì? E m p t y
S i ng l e ! μ¤ ?? ?è 0
D oub l e # ?? ?? ?è 0
6.3.2 常量、变量与数组
1.常量
2.变量
3,VBA数组
常量是指在程序运行的过程中, 其值不能
被改变的量 。 常量的使用可以增加代码
的可读性, 并且使代码更加容易维护 。
此外, 使用固有常量 —— Microsoft
Access,Microsoft for Access Applications
等支持的常量, 可以保证既是常量所代
表的基础值在 Microsoft Access版本升级
换代后也能使代码正常运行 。
1.常量
除了直接常量 ( 即通常的数值或字符串值常
量, 如,123,"Lee"等, 也称为字面常量 )
外, Microsoft Access还支持三种类型的常
量:
符号常量:用 Const语句创建, 并且在模块
中使用的常量;
固有常量:是 Microsoft Access或引用库的一
部分;
系统定义常量,True,False和 Null。
( 1) 符号常量
通常, 符号常量用来代表在代码中反复使
用的相同的值, 或者代表一些具有特定
意义的数字或字符串 。 符号常量的使用
可以增加代码的可读性与可维护性 。
符号常量使用 Const语句来创建 。 创建符号
常量时需给出常量值, 在程序中运行过
程中对符号常量只能作读取操作, 而不
允许修改或为其重新赋值, 也不允许创
建与固有常量同名的符号常量 。
下面的例子给出了使用 Const语句来声明数值和字
符串常量的几种方法 。
Const conPI=3.14159265
可以使用 conPI来代替常用的 π值 。
Private Const conPI2=PI*2
conPI2被声明为一个私有常量, 同时在计算它的
值的表达式中使用不在它前面定义的符号常量 。
私有常量只能在定义它的模块 (子程序或函数 )中
使用 。
Public Const conVersion = "Version Access"
conVersion被声明为一个公有字符串常量 。 公有
常量可以在整个应用程序内的所有子程序 (包括
事件过程 )和函数中使用 。
( 2) 固有常量
除了用 Const 语 句 声 明常 量之 外, Microsoft
Access还声明了许多固有常量, 并且可以使用
VBA常量和 ActiveX Data Objects(ADO)常量 。
还 可 以 在 其 它 引 用 对 象 库 中 使 用 常 量 。
Microsoft Access旧版本创建的数据库中的固有
常量不会自动转换为新的常量格式, 但旧的常
量仍然可以使用而且不会产生错误 。
所有的固有常量都可在宏或 VBA代码中使用。
任何时候这些常量都是可用的。在函数、方法
和属性的“帮助”主题中对用于其中的具体内
置常量都有描述。
固有常量有两个字母前缀指明了定义该常量的对
象库 。 来自 Microsoft Access库的常量以, ac”开
头, 来自 ADO库的常量以, ad”开头, 而来自
Visual Basic库的常量则以, vb”开头, 例如:
acForm,adAddNew,vbCurrency
因为固有常量所代表的值在 Microsoft Access的以
后版本中可能改变, 所以应该尽可能使用常量
而不用常量的实际值 。 可以通过在, 对象浏览
器, 中选择常量或在, 立即, 窗口中输入,?固
有常量名, 来显示常量的实际值 。
可以在任何允许使用符号常量或用户定义常量
的地方(包括表达式中)使用固有常量。如果
需要,用户还可以用“对象浏览器”来查看所有可用对象库中的固有常量列表。如图 6-15所
示。
图 6-15 固有常量查找
3) 系统定义常量
系统定义的常量有三个,True,False和
Null。 系统定义常量可以在计算机上的所
有应用程序中使用。
2.变量
变量实际上是一个符号地址,它代表了命
名的存储位置,包含在程序执行阶段修
改的数据。每个变量都有变量名,在其
作用域范围内可唯一识别。使用前可以
指定数据类型(即采用显式声明),也
可以不指定(即采用隐式声明)。
( 1) 变量的声明
变量名必须以字母字符开头, 在同一范围
内必须是唯一的, 不能超过 255个字符,
而且中间不能包含句点或类型声明字符 。
虽然, 在代码中允许使用未经声明的变量,
但一个良好的编程习惯应该是在程序开
始几行声明将用于本程序的所有变量 。
这样做的目的是为了避免数据输入的错
误, 提高应用程序的可维护性 。
对变量进行声明可以使用类型说明符号、
Dim语句和 DefType语句。
① 使用类型说明符号声明变量类型
在传统的 Basic语言中, 允许使用类型声明符号来
声明常量和变量的数据类型, 如,varXyz%是一
个整型变量; 123%则是一个整型常数 。 类型声
明符号在使用时始终放在变量或常数的末尾 。
VBA中的类型说明符号有 %(Integer)、
&(Long),!(Single),#(Double),$(String)和
@(Currency)。 类型说明符号使用时是作为变量
名的一部分,放在变量名的最后一个字符。
例如, intX%是一个整型变量; douY#是一个双精
度变量; strZ$是个字符串变量 。 在使用时不能将
类型说明符号省略 。 如:
intX%=1243
douY#=45665.456
strZ$="Access"
② 使用 Dim语句声明变量
Dim语句使用格式为:
Dim 变量名 As数据类型
例如:
Dim strX As String
声明了一个字符串类型变量 strX。
可以使用 Dim语句在一行声明多个变量,
例如:
Dim intX,douY,strZ As Strring
表示声明了三个变量 intX,douY和 strZ,其中
只有最后一个 strZ声明为字符串类型变量,intX
和 douY都没有声明其数据类型,即遵循类型说
明符号规则认定为变体( Variant) 类型。在一
行中声明多个变量时,每一个变量的数据类型
应使用 as声明。正确的声明方法如下:
DimintX As Integer,douY As Double,strZ As
String
最有效, 值得提倡的做法是一行只声明一个变量 。
使用 Dim声明了一个变量后,在代码中使用变量
名,其末尾带与不带相应的类型说明符号都代
表同一个变量。
③ DefType语句
DefType语句只能用于模块级, 即模块的通用声
明部分, 用来为变量和传送给过程的参数设置
缺省数据类型, 以及为其名称以指定的字符开
头的 Function和 Property Get过程, 设置返回值
类型 。
DefType语句使用格式如下:
DefType 字母 [,字母范围 ]
例如:
DefInt a,b,e-h
说明了在模块中使用的以字母 a,b,e到 h开头的变
量 ( 不区分大小写 ) 的默认数据类型为整型 。
表 6-6列出了 VBA中所有可能的 DefType语句和
对应的数据类型。
表 6-6 DefType语句和相应的数据类型
ó? ?? êù ?Y ?- Dí ?μ ?e
D e fBo o l Bo o l e a n 2? ?? Dí
D e fBt y e By t e ?? ?ù
D e fIn t In t e g e r ?? Dí
D e fL n g L o n g 3¤? ? Dí
D e fCu r Cu rre n c y o? aò
D e fS n g S i n g l e μ¤ ?? ?è
D e fD b l D o u b l e ?? ?? ?è
D e fD a t e D a t a è? ?ù / êa? ?
D e fS t r S t ri n g ?? ?? ′?
D e fO b j O b j e c t ?? ??
D e fV a r V a ri a n t a? ì? Dí
④ 使用变体类型
声明变量数据类型可以使用上述三种方法,
VBA在判断一个变量的数据类型时, 按
以下先后顺序进行:
I,是否使用 Dim语句;
II,是否使用数据类型说明符;
III,是否使用 DefType语句 。
没有上述三种方法声明数据类型的变量默
认为变体类型( Variant)。
⑤ 用户自定义类型的声明与使用
用户自定义类型可以是任何用 Type语句定义的 数
据类型 。 用户自定义类型可包含一个或多个基
本数据类型的数据元素, 数组 或一个先前定义
的用户自定义类型 。 例如:
Type MyType
MyName As String*l0 '定义字符串变量存储
一个名字 。
MyBirthDate As Date '定义日期变量存储一个
生日 。
MySex As Integer '定义整型变量存储性别
End Type '( 0 为女,1 为男)
上例定义了一个名称为, MyType”的数据类型 。
MyType 类型的数据具有三个域 MyName、
MyBirthDate和 MySex。
在自定义数据类型时应注意,Type语句只能在模块
级使用 。 可以在 Type前面加上 Public或 Private来
声明自定义数据类型的作用域, 这与其它 VBA基
本数据类型相同 。 声明自定义数据类型的域时,
如果使用字符串类型, 最好定长字符串, 如
MyName As String*l0。
使用 Type语句声明了一个用户自定义类型后,就
可以在该声明范围内的任何位置声明该类型的变
量。可以使用 Dim,private,Public,ReDim或
Static来声明用户自定义类型的变量。
下面的例程说明了自定义数据类型的使用 。
Option Compare Database
’自定义一个公共数据类型
Type MyType
MyName As String*l0 '定义字符串变量
存储一个名字 。
MyBirthDate As Date '定义日期变量存
储一个生日 。
MySex As Integer '定义整型变量存储性
别 ( 0 为女, 1 为男 )
End Type
Sub useType()
Dim UdtXyz as MyType
UdtXyz,MyName ="Xyz"
UdtXyz,MyBirthDate =75/12/17
UdtXyz,MySex = 1
Debug.Print UdtXyz,MyName,UdtXyz.
MyBirthDate,UdtXyz,MySex
EndSub
例程先在通用声明中自定义了 MyType数
据类型,然后在 useType()过程中使用它来
声明 Xyz为一个 MyType数据类型变量。
( 2) 变量的作用域和生命周期
在前面己经学习了变量的三种声明方法,
对于变量的作用域, 还须作明确的声明才
能确定 。
在声明变最作用域时可以将变量声明为
Locate( 本地 ), Private( 私有,
Module模块级 ) 或 Public( 公共 ) 。
本地变量:仅在声明变量的过程中有效。
在过程和函数内部所声明的变量,不管是
否使用 Dim语句,都是本地变量。本地变
量具有在本地使用的最高优先级,即当存
在与本地变量同名的模块级的私有或公共
变量时,模块级的变量则被屏蔽;
私有变量:在所声明的模块中的所有函数
和过程都有效 。 私有变量必须在模块的
通用声明部分使用, Private变量名 As数
据类型, 进行声明;
公共变量:在所有模块的所有过程和函数
都可以使用 。 在模块通用声明中使用
,Public变量名 As数据类型, 声明公共
变量 。
图 9-2对私有变量和公共变量的声明进行
了示例,并说明了作用范围。
图 6-16 变量作用域
模块对象
模块 A
Public intA1 as integer
Private intA2 as integer
Sub A1()
本地变量
私有变量 intA2
公共变量 intA1,intB1
End Sub
Sub A2()
本地变量
私有变量 intA2
公共变量 intA1,intB1
End Sub
模块 B
Public intB1 as integer
Private intB2 as integer
Sub B1()
本地变量
私有变量 intB2
公共变量 intB1,intA1
End Sub
Sub B2()
本地变量
私有变量 intB2
公共变量 intB1,intA1
End Sub
变量的生命周期与作用域是两个不同的概念, 它
是指变量从首次出现 ( 执行变量声明, 为其分
配存储空间 ) 到消失的代码执行时间 。
本地变量的生命周期是过程或函数调用被开始调
用到运行结束的时间 ( 静态变量除外 ) 。
公共变量的生命周期是从声明到整个 Access应用
程序结束 。
对于本地变量的生命周期的一个例外是静态变
量。静态变量的声明使用,Static变量名 As数据
类型”。静态变量在 Access程序执行期间一直
存在,它们的作用范围是声明它的子程序或函
数。静态变量可以用来计算事件发生的次数或
者是函数与过程被调用的次数。
3,VBA数组
数组是由一组具有相同数据类型的变量 ( 称为数
组元素 ) 构成的集合 。
( 1) 数组的声明
在 VBA中不允许隐式说明数组, 用户可用 Dim语
句来声明数组, 声明方式为:
Dim 数组名 (数组下标上界 ) As 数据类型
如:
Dim intArray(l0) As Integer
这条语句声明了一个有 10个元素的数组,每个
数组元素为一个整型变量。这是只指定数组元
素下标上界来定义数组。
在使用数组时, 可以使用 Option Base来指定数
组的默认下标下界是 0或 l。 默认情况下, 数组
下标下界为 0。 所以, 用户只需使用它来指定
默认下标下界为 l。 Option Base能用在模块的
通用声明部分 。
VBA允许在指定数组下标范围时使用 To,如下
例所示:
Dim intArray(-3 to 3)As Integer
该语句定义一个有 7个元素的数组, 数组元素下
标从 -3到 3。
如果要定义多维数组, 声明方式为:
Dim 数组名 (数组第 1维下标上界, 数组第 2维下
标上界 … ) As 数据类型
如:
Dim intArray (2,3)As Integer
语句定义了一个二维数组, 第一维有 3个
元素, 第二维有 4个元素 。
在 VBA中, 还允许用户定义动态数组 。
动态数组的定义方法是, 先使用 Dim来声
明数组, 但不指定数组元素的个数 。 而
在以后使用时再用 ReDim来指定数组元
素个数, 称为数组重定义 。 在对数组重
定义时, 可以使用 ReDim后加保留字
Preserve来保留以前的值否则使用 ReDim
后, 数组元素的值会被重新初始化为默
认值, 下面的例子说明了动态数组的定
义方法:
Dim intArray( ) As Integer ’声明部分
ReDim Preserve intAma(l0) ’在过程中重
定义, 保留以前的值
ReDim intArray (l0) ’在过程中重
新初始化
同样,用户可以使用 Public,Private或
Static来声明公共数组、私有数组或静态
数组。
( 2) 数组的使用
数组声明后, 数组中的每个元素都可以当作单个
的变量来使用, 其使用方法同相同类型的普通
变量 。 其元素引用格式为:
数组名 (下标值表 )
其中:如果该数组为一维数组,则下标值表为
一个范围为 [数组下标下界,数组下标上界 ]的
整数;如果该数组为多维数组,则下标值表为
一个由多个(不大于数组维数)用逗号分开的
整数序列,每个整数(范围为 [数组该维下标
下界,数组该维下标上界 ])表示对应的下标
值。
例如可以如下引用前面定义的数组:
intAma(2) '引用一数组 intAma的第 3个元素 。
intArray (0,0) '引用二数组 intArray的第 1行第 1个
元素 。
例如, 若要存储一年中每天的支出, 可以声明一
个具有 365个元素的数组变量, 而不是 365个变
量 。 数组中的每一个元素都包含一个值 。 下列
的语句声明数组 curExpense具有 365个元素 。 按
照缺省规定, 数组的索引是从零开始, 所以此
数组的上标界是 364而不是 365。
Dim curExpense(364) As Currency
若要设置某个元素的值, 必须指定该元素的索引
( 即下标值表 ) 。 下面的示例对于数组中的每
个元素都赋予一个初始值 20。
Sub FillArray()
Dim curExpense(364) As Currency
Dim intI As Integer
For intI = 0 to 364
curExpense(intI) = 20
Next
End Sub
6.3.3 运算符与表达式
1.算术运算符与算术表达式
2.字符串连接符与字符串表达式
3.关系与逻辑运算符、逻辑表达
式及其取值
4.对象运算符与对象运算表达式
算术运算符是常用的运算符,用来执行
简单的算术运算。 VBA提供了 8个算术运
算符,表 6-7列出了这些算术运算符。
在 8个算术运算符中,除取负( -)是单目
运算符外,其它均为双目运算符。加
( +),减( -),乘( *),取负( -)等
1.算术运算符与算术表达式
表 6-7 算术运算符
?? ?? ?? ?? ??
aí ′? ê? ?ù

?· êù ?? ?? ^ X ^ Y
è? ·1 ?? ?? - -X
3? ?¨? ? ?? * X *Y
·? μ? 3ù ?¨
?? ?? / X / Y
?? êù 3ù ?¨
?? ?? \ X \ Y
è? ?£ ?? ?? M od X M od Y
?ó ?¨? ? ?? + X +Y
?? ?¨? ? ?? - X - Y
(1) 指数运算
指数运算用来计算乘方和方根, 其运算符
为 ^,2^8表示 2的 8次方, 而 2^( 1/2) 或
2^0.5是计算 2的平方根 。
(2) 浮点数除法与整数除法
浮点数除法运算符 ( /) 执行标准除法操作,
其结果为浮点数 。 例如, 表达式 5/2的结
果为 2.5,与数学中的除法一样 。 整数除
法运算符 ( \) 执行整除运算, 结果为整
型值, 因此, 表达式 5\2的值为 2。
整除的操作数一般为整型值。当操作数带
有小数时,首先被四舍五入为整型数或
长整型数,然后进行整除运算。操作数
必须在( -2147483648.5,214748367.5)
范围内,其运算结果被截断为整型数
( Integer) 或长整数( Long),不再进
行舍入处理。
(3) 取模运算
取模运算符 ( Mod) 用来求余数, 其结果为第一
个操作数整除第二个操作数所得的余数 。
表 9-3按优先顺序列出了算术运算符。在 8个算术
运算符中,指数运算符( ^)优先级最高,其次
是取负( -)运算符、乘( *)、浮点除( \)、
整除( /)、加( +)、减( -)。其中乘和浮点
除是同级运算符,加和减是同级运算符。当一
个表达式中含有多种算术运算符时,必须严格
按上述顺序求值。此外,如果表达式中含有括
号,则先计算括号内表达式的值;有多层括号
时,先计算内层括号中的表达式。
字符串连接 ( &) 用来连接多个字符串 ( 字符串
相加 ) 。 例如:
A$="My"
B$="Home"
C$=A$+B$
运算结果为:变量 C$的值为 "MyHome"。
在 VBA中,, +” 既可用作加法运算符, 还可以
用作字符串连接符, 但, &” 专门用作
字符串连接运算符,其作用与,+”相同。在有
些情况下,用,&”比用,+”可能更安全。
2.字符串连接符与字符串表达式
( 1 ) 关系运算符与关系表达式
关系运算符也称比较运算符, 用来对两
个表达式的值进行比较, 比较的结果是
一 个 逻 辑 值, 即真 ( True) 或假
( False) 。 用关系运算符连接两个算术
表达式所组成的表达式叫做关系表达式 。
VBA提供了 6个关系运算符, 如表 6-8所
示 。
3.关系与逻辑运算符、逻辑表达式及其取

表 6-8 关系运算符列表
?? ?? ?? 2a ê? ?× ?μ aí ′? ê? ?ù ?ó
= ?- μè X = Y
<> o? >< 2o μè óù X < > Y
< D? óù X < Y
> ′? óù X > Y
<= D? óù μè óù X < = Y
>= ′? óù μè óù X > = Y
在 VBA中, 允许部分不同数据类型的量进
行比较, 但要注意其运算方法 。
关系运算符的优先次序如下:
( 1) =,<>或 ><的优先级别相同, <,>、
>=,<=优先级别也相同, 前两种关系运
算符的优先级别低于后四种关系运算符 。
( 最好不要出现连续的关系运算, 可以
考虑将其转化成多个关系表达式 。 )
( 2) 关系运算符的优先级低于算术运算符 。
( 3)关系运算符的优先级高于赋值运算
符( =)。
(2) 逻辑运算符
逻辑运算也称布尔运算, 由逻辑运算符连
接两个或多个关系式, 组成一个布尔表
达式 。
VBA的逻辑运算符有表 6-9所列 6种:
表 6-10列出了逻辑运算真值表。
表 6-9 逻辑运算符列表
?? ?? ?? òa ò?
N ot ?? £? óé ?? a? ?? o? óé ?? a? ??
A nd ó? £? à? ·? aí ′? ê? í? êa? a ?? ?? ?μ ?a ?? £? ?? ?? ?a ??
Or o? £? à? ·? aí ′? ê? ?D óD òo aí ′? ê? ?a ?? ?? ?a ?? £? ??
?? ?a ??
X or òì o? £? à? ·? aí ′? ê? í? êa ?a ?? o? í? êa ?a ?? £? ?? ?μ
?a ?? £? ?? ?? ?a ??
E qv μè ?ú £? à? ·? aí ′? ê? í? êa ?a ?? o? í? êa ?a ?? £? ?? ?μ
?a ?? £? ?? ?? ?a ??
Im p ?ì 1- £? μa μù òo ·? aí ′? ê? ?a ?? £? ?ò μù ?ú ·? aí ′? ê?
?a ?? £? ?? ?μ ?a ??
表 6-10 逻辑运算真值表
X Y N o t X X A n d Y X O r Y X X o r Y X E q v Y X I m p Y
T T F T T F T T
T F F F T T F F
F T T F T T F T
F F T F F F T T
( 1) 对象运算符
对象运算表达式中使用 ! 和, 两种运算符, 使用
对象运算符指示随后将出现的项目类型 。
① ! 运算符
! 运算符的作用是指出随后为用户定义的内容 。
使用 ! 运算符可以引用一个开启的窗体, 报表或
开启窗体或报表上的控件 。 表 9-7列出了 3种引
用方式 。
②, (点 ) 运算符
,(点 ) 运算符通常指出随后为 Microsoft Access
定义的内容。例如,使用, (点 )运算符可引用
窗体、报表或控件等对象的属性。
4.对象运算符与对象运算表达式
( 2) 在表达式中引用对象
在表达式中可以使用标识符来引用一个对
象或对象的属性 。 例如, 可以引用一个
开启的报表的 Visible属性,Reports! [发
货单 ]! [货主国家 ].Visible,[发货单 ]引用
,报表, 集合中的, 发货单, 报表, [货
主国家 ]引用, 发货单, 报表上的, 运货
商, 控件 。
例如:将标签 0的颜色设置为红色的代码为:
标签 0.color=255
! 运算表达式如表 6-11所示。
表 6-11 !的引用示例
aê ê? ?? òù ó?
F orm s £? [ ??
μ¤ ]
?a ?? μ? ??? ? μ¤ ?a′ ?ì ?
R e p ort s £? [ ?¢
o? μ¤ ]
?a ?? μ? ??? ¢ o? μ¤ ?aa ¨a í
F orm s £? [ ??
μ¤ ] £? [ ?? μ¤
ID ]
?a ?? μ? ?? ?? μ¤ ?a ′? ì? é?
μ? ??? ? μ¤ ID ?a? × ?ú