1、领航教育在线() 二级 access 讲义18.3.2 VBA 编程环境 一、 Visual Basic 编辑器(详见书本 P202)Visual Basic 编辑器 VBE( Visual Basic Editor)是编辑 VBA 代码时使用的界面。 VBE窗口主要由标准工具栏、工具窗口、属性窗口、代码窗口和立即窗口等组成。二、进入 VBA 编程环境Access 模块分成类模块和标准模块两种。 对于类模块,可以直接定位到窗体或报表,然后单击工具栏上的“代码”按钮进入;或定位到窗体、报表和控件上通过指定对象事件处理过程进入。其方法有两种:(1)右键单击控件对象,单击快捷菜单上的“事件生成器命令
2、”,打开“事件生成器”对话框,选择其中的“代码生成器”,单击 “确定”按钮即可进入;(2)单击属性窗口的“事件”选项卡,选中某个事件直接单击属性右侧的“”按钮,打开“事件生成器”对话框,选择其中的“代码生成器”,单击“确定”按钮即可进入。 对于标准模块,有 3 种方法进入:(1)对于已存在的标准模块,只需从数据库窗体对象列表上选择“模块”,双击要查看的模块对象即可进入;(2)要创建新的标准模块,需要从数据库窗体对象列表上选择“模块”,单击工具栏上的“新建”按钮即可进入;(3)在数据库对象窗体中,选择“工具”菜单里“宏”子菜单的“Visual Basic 编辑器”选项即可进入。 三、VBE 环境
3、中编写 VBA 代码 VBA 代码是由语句组成的,一条语句就是一行代码。例如intCount=3 将 3 赋值给变量 intCountDebug. Print intCount 在立即窗口打印变量 intCount 的值 3Access 的 VBE 编辑环境提供了完整的开发和调试工具。其中的代码窗口顶部包含两个组合框,左侧为对象列表,右侧为过程列表。操作时,从左侧组合框选定一个对象后,右侧过程组合框中会列出该对象的所有事件过程,再从该对象过程列表选项中选择某个事件名称,系统会自动生成相应的事件过程模块,用户添加代码即可。 双击工程窗口中的任何类或对象都可以在代码窗口中打开相应代码进行编辑处理。
4、 四、程序语句书写原则(详见书本 P206)8.3.3 数据类型和数据库对象一、标准数据类型(1)布尔型数据布尔型数据只有两个值 True 或 False。布尔型数据转换为其他类型数据时,Ture 转换为-1,False 转换为 0;其他类型数据转换为布尔型数据时,0 转换为 False,其他类型转换为Ture。(2)日期型数据“日期/时间”类型数据必须前后用 “#”号封住。如#2007-1-1#、#2002-5-4 14:30:00 PM#。(3)变体类型数据变体类型数据是特殊的数据类型。VBA 中规定,如果没有显示声明或使用符号来定义变量的数据类型,则默认为变体类型。二、用户定义的数据类型
5、 (详见书本 P208)应用过程中可以建立包含一个或多个 VBA 标准数据类型的数据类型,这就是用户定领航教育在线() 二级 access 讲义2义数据类型。它不仅包含 VBA 的标准数据类型,还包含其他用户定义的数据类型。 用户定义数据类型可以在 Type . End Type 关键字间定义,定义格式如下: Type数据类型名 域名As数据类型 域名As数据类型 End Type 三、数据库对象 (详见书本 P208)8.3.4 变量与常量变量是程序运行过程中值会发生变化的数据。如同一间旅馆客房,昨天可住旅客 A,今天住旅客 B,明天又有可能被闲置。变量的命名规则如下:(1)以字母或汉字开头
6、,后可跟字母、数字或下划线。(2)变量名最长为 255 个字符。(3)不区分变量名的大小写,不能使用关键字。(4)字符之间必须并排书写,不能出现上下标。以下是合法的变量名:a,x, x3, BOOK_1,sum5以下是非法的变量名:3s s*T -3x bowy-1 if 常量是在程序中可以直接引用的实际值,其值在程序运行过程中不变。在 VBA 中,常量可以分为 3 种:直接常量、符号常量和系统常量一、变量的声明 VBA 变量声明有两种方法。1、显式声明VBA 中定义变量的格式为:Dim 变量名 AS 类型格式中 Dim 是一个 VBA 命令,此处用于定义变量; As 是关键字,此处用于指定变
7、量的数据类型。例如:Dim bAge as Integer bAge 为整型变量2、隐含声明VBA 允许用户在编写应用程序时,不声明变量而直接使用,这就是隐式声明。所有隐式声明的变量都是 Variant 数据类型。例如:Dim m,n, m,n 为变体 Variant 变量 NewVar=528 NewVar 为 Variant 类型变量,其值为 258。二、强制声明 在默认情况下,VBA 允许在代码中使用未声明的变量,如果在模块设计窗口的顶部“通用声明”区域中,加入语句:Option Explicit强制要求所有变量必须定义才能使用。这种方法只能为当前模块设置了自动变量声明功能,如果想为所有
8、模块都启用此功能,可以单击菜单命令“工具”下“选项”对话框中,选中“要求变量声明”选项即可。三变量的作用域 (1)局部范围(Local)变量定义在模块的过程内部,过程代码执行时才可见。在子过程或函数过程中定义的或直领航教育在线() 二级 access 讲义3接使用的变量作用范围都是局部的。在子过程或函数内部使用 Dim、StaticAs 关键字说明的变量就是局部范围的。(2)模块范围(Module)变量定义在模块的所有过程之外的起始位置,运行时在模块所包含的所有子过程或函数过程中可见。在模块的通用说明区,用 Dim、Static、PrivateAs 关键字定义的变量作用域都是模块范围。(3)全
9、局范围(Public)变量定义在标准模块的所有过程之外的起始位置,运行时在类模块和标准模块的所有子过程或函数过程中都可见。在标准模块的变量定义区域,用 PublicAs 关键字说明的变量就属于全局的范围。变量的持续时间(生命周期)是从变量定义语句所在的过程第一次运行,到程序代码执行完毕并将控制权交回调用它的过程为止的时间。四数据库对象变量Access 建立的数据库对象及其属性,均可被看成是 VBA 程序代码中的变量及其指定的值来加以引用。 例如,Access 中窗体和报表对象的引用格式为:Forms !窗体名称 !控件名称 .属性名称或 Reports !报表名称 !控件名称 .属性名称关键字
10、 Forms 或 Reports 分别表示窗体或报表对象集合。感叹号“!”分隔开对象名称和控件名称。 “属性名称”部分缺省,则为控件基本属性。如果对象名称中含有空格或标点符号,就要用方括号把名称括起来。五数组数组是在有规则的结构中包含一种数据类型的一组数据,也称作数组元素变量。数组变量由变量名和数组下标构成,使用数组必须先定义数组。通常用 Dim 语句来定义数组,定义格式为: Dim 数组名(to)As 缺省情况下,下标下限为 0,数组元素从“数组名(0)”至“ 数组名( 下标上限)”;如果使用 to选项,则可以安排非 0 下限。例如,dim score(10)as Integer 定义了 1
11、1 个整形数构成的数组,数组元素为 score(0) 至 score(10)再如, dim score(1 to 10)as Integer定义了 10 个元素的整型数组,数组元素为 score(1)至 score(10) 注:(1)所有数组元素在内存连续存放(2)根据下标区分数组元素关于数组的定义,还有下面的几点说明:(1)定义数组时数组名的命名规则与变量名的命名规则相同。(2)一般在定义数组时应给出数组的上界和下界。但也可以省略下界,缺省 为0。例如,Dim a(10) As Single默认情况下,数组 a 由 11 个元素组成。若希望下标从 1 开始,可在模块的通用声明段使用 Opti
12、on Base 语句声明。其使用格式为Option Base 0|1 后面的参数只能取 0 或 1(3) 和不能使用变量,必须是常量,常量可以是字面常量或符号常量,一般是整型常量。(4)如果省略 As 子句,则数组的类型为 Varient 变体类型。领航教育在线() 二级 access 讲义4二维数组的定义 格式为:Dim 数组名(to ,to)As 例如,Dim c(1 To 3, 1 To 4)As Singlec(1,1) c(1,2) c(1,3) c(1,4)c(2,1) c(2,2) c(2,3) c(2,4)c(3,1) c(3,2) c(3,3) c(3,4)六、变量标识命名法
13、规在编写 VBA 程序代码时,会用到大量的变量名称和不同的数据类型。对于控件对象,可以用 VBA 的 Set 关键字将每个命名的控件对象指定为一个变量名称。 目前,VB 和 VBA 均推荐使用 Hungarian 符号法作为命名法则。该方法也被广泛用在C 和 C+等一些程序中。 Hungarian 符号法使用一组代表数据类型的码。用小写字母作为变量名的前缀。 七符号常量如果程序中多处用到某个常量,将其定义成符号常量可增加代码的可读性,也便于维护。符号常量用关键字 Const 来定义,格式如下:Const 符号常量名称 =常量值例如: Const PI as single=3.1415926定义
14、了一个符号常量 PI,其值为 3.1415926若是在模块的声明区中定义符号常量,则建立一个所有模块都可以用的全局符号常量。一般是 Const 前加 Global 或 Public 关键字。 八系统常量 这是一类特殊的符号常量,Access 系统内部包含若干个启动时就建立的系统常量,有True、False、 Yes、No、On、Off 和 Null 等。在编码时可以直接使用。 例如:VBA 类库中,vbRed 代表红色,vbBlue 代表蓝色。这里开始的两个字母表示所在的类库Access 类库的常量以 ac 开始,如 acForm 等。ADO 类库的常量以 ad 开始,如 adOpenKeys
15、et。8. 3.5 常用标准函数 (本节请详见书本 P213) 在 VBA 中,除在模块创建中可以定义子过程与函数过程完成特定功能外,又提供了近百个内置的标准函数,可以方便完成许多操作。 标准函数一般用于表达式中,有的能和语句一样使用。其使用形式如下: 函数名(参数 1,参数 2 ,参数 3,参数 4,参数 5) 其中,函数名必不可少,函数的参数放在函数名后的圆括号中,参数可以是常量、变量或表达式,可以有一个或多个,少数函数为无参函数。 8.3.6 运算符和表达式 (详见书本 P219)在 VBA 编程语言中,提供了许多运算符来完成各种形式的运算和处理。根据运算不同,可以分成 4 种类型的运算
16、符:算术运算符、关系运算符、逻辑运算符和连接运算符。 8.4 VBA 流程控制语句一个语句是能够完成某项操作的一条命令。VBA 程序的功能就是由大量的语句串命令构成。VBA 程序语句按照其功能不同分成两大类型: (1)声明语句,用于给变量、常量或过程定义命名;领航教育在线() 二级 access 讲义5(2)执行语句,用于执行赋值操作,调用过程,实现各种流程控制。 执行语句分为 3 种结构: (1)顺序结构,按照语句顺序顺次执行。 (2)条件结构,又称为选择结构,根据条件选择执行路径。 (3)循环结构,重复执行某一段程序语句。 8.4.1 赋值语句赋值语句是最基本的语句。它的功能是给变量或对象
17、的属性赋值。其格式为 或 例如:Rate = 0.1 给变量 Rate 赋值 0.1Me!Text1.Value = “欢迎来到领航教育 “ “给控件的属性赋值8.4.2 条件语句1IfThen 语句 例如:语句格式为If ThenEnd If输入一个数并在立即窗口输出其值Dim x As Integerx = InputBox(“请输入 x 的值:“)If x ThenDebug.Print xEnd If2IfThenElse 语句 语句格式为If ThenElseEnd If说明:(1)可以是任何表达式,一般为关系表达式或布尔表达式。如果是其他表达式,则非 0 认为是 True,0 认为
18、是 False。(2)执行时,先判断表达式的值,为 True 则执行语句块 1,否则执行语句块 2。例如:输入两个数并在立即窗口输出其中较大的数Dim x As Integer, y As Integerx = InputBox(“请输入 x 的值:“)y = InputBox(“请输入 y 的值:“)If x y ThenDebug.Print xElseDebug.Print yEnd If3IfThenElseIf 语句 语句格式为If ThenElseIf ThenElseIf ThenElse End If运行时,从表达式 1 开始逐个测试条件,当找到第一个为 True 的条件时,即
19、执行该条件后所对应的语句块。4Select CaseEnd Select 语句 语句格式为Select Case Case 语句块 1Case 语句块 2Case Else语句块 n+1End Select说明:(1)Select Case 后的变量或表达式只能是数值型或字符型表达式。(2)执行过程是先计算 Select Case 后的变量或表达式的值,然后从上至下逐个比较,决定执行哪一个语句块。如果有多个 Case 后的表达式列表与其相匹配,则只执行第一个Case 后的语句块。(3)语句中的各个表达式列表应与 Select Case 后的变量或表达式同类型。各个表达式列表可以采用下面的形式
20、表达式: a +5 用逗号分隔的一组枚举表达式: 2, 4, 6, 8 表达式 1 To 表达式 2 60 to 100 Is 关系运算符表达式 Is to Step Exit ForNext 说明:(1)循环控制变量的类型必须是数值型。(2)步长可以是正数,也可以是负数。如果步长为 1,Step 短语可以省略。(3)根据初值、终值和步长,可以计算出循环的次数,因此 For 语句一般用于循环次数已知的情况。(4)使用 Exit For 语句可以提前退出循环。例 编程用 For 语句求 1+2+3+10 之和 Public Sub gc2()Dim s As Integer, i As Inte
21、gers=0For i = 1 To 10 Step 1s = s + iNext iDebug.Print sEnd Sub2Do WhileLoop 语句 形式如下:Do While 循环体Exit Do语句块Loop说明:(1)这里的条件可以是任何类型的表达式,非 0 为真,0 为假。(2)执行过程是:在每次循环开始时测试条件,对于 Do While 语句,如果条件成立,则执行循环体的内容,然后回到 Do Whlie 处准备下一次循环;如果条件不成立,则退出循环。(3)Exit Do 语句的作用是提前终止循环。例如 :下面的程序用 Do WhileLoop 语句求 1+2+3+10 之和
22、。Dim s As Integer, i As Integers = 0i = 1Do While i 循环体Exit Do语句块Loop说明:(1)这里的条件可以是任何类型的表达式,非 0 为真,0 为假。(2)执行过程是:在每次循环开始时测试条件,对于 Do Until 语句,如果条件不成立,则执行循环体的内容,然后回到 Do Until 处准备下一次循环;如果条件成立,则退出循环。(3)Exit Do 语句的作用是提前终止循环。例如 :下面的程序用 Do UntilLoop 语句求 1+2+3+10 之和。Dim s As Integer, i As Integers = 0i = 1D
23、o Until i 10s = s + ii = i + 1LoopDebug.Print s4DoLoop While 语句 格式如下:Do 循环体Exit Do语句块Loop While说明:和 Do WhileLoop 不同的是, DoLoop While 语句在每次循环结束时测试条件。因此,二者的区别是如果一开始循环条件就不成立,则 Do WhileLoop 中的循环体部分一次也不执行,而 DoLoop While 中的循环体部分被执行一次。 5DoLoop Until 语句 格式如下:Do 循环体Exit Do语句块Loop Until说明:和 Do UntilLoop 不同的是,
24、DoLoop Until 语句在每次循环结束时测试条件。因此,二者的区别是如果一开始循环条件就不成立,则 Do UntilLoop 中的循环体部分一次也不执行,而 DoLoop Until 中的循环体部分被执行一次。 6While-Wend 语句 格式如下:While 条件式循环体Wend说明:(1) While-Wend 循环与 Do While Loop 结构类似,但不能在 While-Wend 循环中使用 Exit Do 语句。(2)在 VBA 中,尽量不要使用 While-Wend 循环。8.4.4 其他语句-标号和 GoTo 语句 GoTo 语句用于实现无条件转移。使用格式为:GoT
25、o 标号。 程序运行到此结构,会无条件转移到其后的“标号”位置,并从那里继续执行。GoTo 语句使用时,“标号”位置必须首先在程序中定义好,否则转移无法实现。 8.5 过程调用和参数传递 过程是一段可以实现某个具体功能的代码 与函数不同,过程没有返回值 既可以在类模块中,也可以在标准模块中创建过程1子过程的定义和调用 可以用 Sub 语句声明一个新的子过程、接收的参数和子过程代码。其定义格式为:Public|PrivateStatic Sub 子过程名()语句块Exit Sub子过程语句End Sub使用 Public 关键字可以使该过程适用于所有模块中的所有其他过程;使用 Private 关
26、键字可以使该子过程只适用于同一个模块中的其他过程。 创建过程的方法是:打开模块,选择菜单“插入”“过程”命令,在“添加过程”对话框中输入过程名。调用过程有以下两种格式:格式 1:call 过程名( 实参列表)格式 2:子过程名 实参列表 这里过程名后的参数叫实际参数。2函数过程的定义和调用 可以使用 Function 语句定义一个新函数过程、接收参数、返回变量类型及运行函数过程的代码。其格式如下: Public | PrivateStaticFunction 函数过程名形参As 数据类型 函数过程语句 函数过程语句表达式 Exit Function函数过程语句 函数过程语句=表达式 End F
27、unction 函数过程的调用格式只有一种:函数过程名(实参) 由于函数过程返回一个值,实际上,函数过程的上述调用形式主要有两种方法:一是将函数过程返回值作为赋值成分赋予某个变量,其格式为“变量函数过程名(实参)” ;二是将函数过程返回值作为某个过程的实参成分使用。 3参数传递 过程定义时可以设置一个或多个形参(形式参数的简称) ,多个形参之间用逗号分隔。其中,每个形参的完整定义格式: OptionalByVal |ByRefParamArrayvarname()As typedefaultvalue 含参数的过程被调用时,主调过程中的调用式必须提供相应的实参(实际参数的简称) ,并通过实参向
28、形参传递的方式完成过程操作 。在函数的调用过程中,一般会发生数据的传递,即将主调过程中的实参传给被调过程的形参。在参数传递过程中,可以有传址和传值两种形式。1传址如果在定义过程或函数时,形参的变量名前不加任何前缀,即为传址;若加前缀,须在形参变量名前加 ByRef。传递过程是:调用过程时,将实参的地址传给形参。因此如果在被调过程或函数中修改了形参的值,则主调过程或函数中实参的值也跟着变化。例如:如果输入 5 和 7,程序的结果会是多少?Public Sub swap(x As Integer, y As Integer)Dim t As Integert = x: x = y: y = tEn
29、d Sub按钮的单击事件如下:Private Sub Command0_Click()Dim x As Integer, y As Integerx = InputBox(“x=“)y = InputBox(“y=“)Debug.Print x, yswap x, yDebug.Print x, yEnd Sub2传值 如果在定义过程或函数时,形参的变量名前加 ByVal 前缀,即为传值。这时主调过程将实参的值复制后传给被调过程的形参,因此如果在被调过程或函数中修改了形参的值,则主调过程或函数中实参的值不会跟着变化。 例如:如果输入 5 和 7,程序的结果会是多少?Public Sub swa
30、p1(ByVal x As Integer, ByVal y As Integer)Dim t As Integert = x: x = y: y = tEnd Sub按钮的单击事件如下:Private Sub Command0_Click()Dim x As Integer, y As Integerx = InputBox(“x=“)y = InputBox(“y=“)Debug.Print x, yswap1 x, yDebug.Print x, yEnd Sub8.6 VBA 程序运行错误处理 VBA 中提供 On Error GoTo 语句来控制当有错误发生时程序的处理。 On Er
31、ror GoTo 指令的一般语法如下: On Error GoTo 标号 On Error Resume Next On Error GoTo 0 “On Error GoTo 标号”语句在遇到错误发生时程序转移到标号所指定位置的代码处执行。 “On Error Resume Next”语句在遇到错误发生时不会考虑错误,并继续执行下一条语句。“On Error GoTo 0”用于关闭错误处理。8.7 VBA 程序的调试 (详见书本 P238)8.7.1 设置断点 所谓“断点”就是在过程的某个特定语句上设置一个位置点以中断程序的执行。 “断点”的设置和使用贯穿在程序调试运行的整个过程中。 在程序
32、中人为设置断点,当程序运行到设置了断点的语句时,会自动暂停运行并进入中断状态。设置断点的方法是:在代码窗口中单击要设置断点的那一行语句左侧的灰色边界标识条。再次单击边界标识条可取消断点。8.7.2 单步跟踪 也可以单步跟踪程序的运行,即每执行一条语句后都自动进入中断状态。单步跟踪程序的方法是:将光标置于要执行的过程内,单击“调试”工具栏的“逐语句”按钮,或选择“调试”“逐语句”命令。8.7.3 设置监视点 即设置监视表达式。一旦监视表达式的值为真或改变,程序也会自动进入中断模式。设置监视点的方法如下。(1)选择“调试”“添加监视”命令,弹出“添加监视”对话框。(2)在“模块”下拉列表框中选择被监视过程所在的模块,在“过程”下拉列表框中选择要监视的过程,在“表达式”文本框中输入要监视的表达式。(3)最后在“监视类型”栏中选择监视类型。