77

Click here to load reader

Access2010 数据库基础与应用

Embed Size (px)

DESCRIPTION

Access2010 数据库基础与应用. 第 7 章 模块与 VBA 本章要点 : 模块的概念与基本操作 VBA 的基础知识 VBA 程序设计中的流程控制方法. 7.1 模块. 第 7 章 模块与 VBA. 7.1.1 模块的概念 模块 是 Access 数据库中一个重要的对象,用 VBA 语言编写,以函数过程( Function )和子过程为单元的集合方式存储。 模块 可分为两种基本类型:标准模块和类模块。 标准模块 放置的 是可供数据库其他对象使用的公共过程,它通常由变量的通用声明部分和若干个过程组成。每一个模块有唯一的名称。 - PowerPoint PPT Presentation

Citation preview

Page 1: Access2010 数据库基础与应用

Access2010 数据库基础与应用

第 7 章 模块与 VBA

本章要点:模块的概念与基本操作VBA 的基础知识VBA 程序设计中的流程控制方法

Page 2: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.1.1 模块的概念 模块是 Access 数据库中一个重要的对象,用 VBA语言编写,以函数过程( Function )和子过程为单元的集合方式存储。 模块可分为两种基本类型:标准模块和类模块。 标准模块 放置的是可供数据库其他对象使用的公共过程,它通常由变量的通用声明部分和若干个过程组成。每一个模块有唯一的名称。 类模块:有窗体模块、报表模块,它们从属于各大自的窗体或报表。还有自定义的类模块。

7.1 模块

Page 3: Access2010 数据库基础与应用

第 7 章 模块与 VBA

窗体与报表模块数据库的每一个窗体和报表都有内置的窗体模块和报表模块,这些模块中包括事件过程模板,可以向其中添加程序代码,使得当窗体、报表或其上的控件发生相应的事件时,运行这些程序代码。自定义类模块不与窗体和报表相关联,允许用户自定义所需的对象、属性和方法。

Page 4: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.1.2 模块的创建1. 标准模块的创建标准模块的创建步骤如下:(1) 创建标准模块,进入标准模块的编辑窗口在“数据库”窗口中,选择“创建”选项卡,然后单击“宏

与代码”组中的“模块”按钮,即可进入标准模块的编辑窗口并创建新的标准模块。

(2) 在标准模块中加入过程两种方法:① 直接输入 Sub 过程名或 Function 过程② 单击“插入” |“ 过程”菜单命令

(3) 保存模块

Page 5: Access2010 数据库基础与应用

第 7 章 模块与 VBA

Sub 过程定义格式如下:Sub 过程名[程序代码 ] End Sub 函数过程定义格式如下:Function 函数名[程序代码 ] End Function

Page 6: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.1.2 模块的创建2. 窗体、报表模块的创建(1)进入窗体或报表模块的代码编辑窗口

使用属性表事件生成器窗口进入使用快捷键进入

(2)创建事件过程(3)保存窗体或报表3. 自定义类模块的创建

在“数据库”窗口中,选择“创建”选项卡,然后单击“宏与代码”组中的“类模块”按钮,即可进入类的编辑窗口,输入自定义类的代码并保存。

Page 7: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.1.3 将宏转换为模块1. 将窗体或报表中使用的宏转换为事件过程(1)用设计视图打开窗体,单击“窗体设计工具”的“设计”

选项卡的“工具”组中“将窗体的宏转换为 Visual Basic代码”按钮

(2)单击“转换”按钮,开始转换,当屏幕显示“转换完毕”对话框时,单击“确定”按钮完成转换。

报表中使用的宏转换同窗体中使用的宏转换类似

Page 8: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.1.3 将宏转换为模块1.将窗体或报表中使用的宏转换为事件过程(1) 在数据库窗口的导航窗格的“宏”类别中选中所需转换的

宏。(2) 单击“文件”选项卡中“对象另存为”命令(3) 在“另存为”对话框中,“保存类型”选模块,单击“确

定”按钮。(4) 单击转换按钮(5) 当弹出“转换完毕”对话框时,单击“确定”按钮完成转

换。

Page 9: Access2010 数据库基础与应用

7.2VBA 程序设计基础7.2.1 Visual Basic 编辑环境Visual Basic 编辑器简称为 VBE( Visual Basic Editor 的

缩写 ) ,是 Access 提供的 VBA 的开发环境,模块的编辑工作需要在 VBE 窗口中完成。 VBE 提供了完整的开发和调试工具。

VBE 窗口主要由菜单栏、标准工具栏、工程窗口、属性窗口、代码窗口、立即窗口等组成,如图 7-5 所示。

工程窗口 代码窗口

立即窗口 属性窗口

Page 10: Access2010 数据库基础与应用

( 1 )工具栏( 2 )工程窗口 工程窗口列出了在应用程序中用到的模块。使用该窗

口,可以在数据库内各个对象之间快速地浏览。( 3 )属性窗口 属性窗口列出了所选对象的各种属性。( 4 )代码窗口 在代码窗口中可以输入和编辑 VBA 代码。 在代码窗口的

顶部是两个组合框,左边是对象组合框,列出了所有可用的对象名称,右边是事件组合框,列出该对象所有的事件。( 5 )立即窗口 常用于程序在调试期间输出中间结果、在中断模式下测

试表达式的值等,也可以直接输入 VBA 命令并按 Enter 键后, VBA 会实时解释并执行该命令。例如,在立即窗口利用“ ?”或 Print或 Debug.Print 输出表达式的值。

7.2VBA 程序设计基础

Page 11: Access2010 数据库基础与应用

7.2.2VBA 的数据类型1 .标准数据类型

数据类型 类型标识 符号 存储空间 取值范围整型 Integer % 2字节 -32768~ 32767长整型 Long & 4字节 -2147 483 648 ~ 2147 483 647

单精度型 Single ! 4字节负值: -3.402 823E38 ~ -1.401 298E-45正 值 : 1.401 298E-45 ~ 3.402 823E38

双精度型 Double # 8字节负值 : -1.797 693 134 862 32E308~ -4.940 656 458 412 47E-324正值: 4.940 656 458 412 47E-324~1.797 693 134 862 32E308

货币型 Currency @ 8字节 -922 337 203 685 477.580 8~922 337 203 685 477.580 7

字符型 String $ 字符串长 0~ 65500 个字符日期型 Date   8字节 100年 1月 1日~ 9999年 12月 31日布尔型 Boolean   2字节 True 或 False变体类型 Variant   不定 由最终的数据类型确定

Page 12: Access2010 数据库基础与应用

2 .用户自定义数据类型用户定义的数据类型需要使用 Type……End Type 语句来定义,定义格式如下:Type [ 数据类型名 ]

<域名 > As < 数据类型 ><域名 > As < 数据类型 >……

End Type例 7-1 定义一个学生信息数据类型 StudentType 。Type StudentType strName As String ' 姓名,变长字符串存储 strSex As String*1 ' 性别, 1位定长字符串存储 IntAge As Integer ' 年龄,整型变量存储End Type例 7-2 定义和使用 StudentType 数据类型的变量。Dim NewStud As StudentTypeNewStud. strName= "王微 "NewStud. strSex= "女 "NewStud. IntAge=20

7.2.2VBA 的数据类型

Page 13: Access2010 数据库基础与应用

7.2.3 VBA中的常量、变量、运算符和表达式

1 .常量( 1 )直接常量 直接常量就是直接表示的具体数、日期、字符串、布尔常量等等,不同类型的常量有不同的表示方法。

① 数值型常量:十进制整数由数字 0~9 和正、负号组成,实数可采用小数表示形式或科学记数表示形式。科学计数法用 E 表示 10 的乘幂。② 字符串常量:用双引号括起来的字符序列。在字符串中,字母的大小写是有区别的。③ 布尔常量:有 True和 False 两个值。④ 日期常量:以字面上可被认作日期和时间的字符并用一对“ #” 括起来表示。如 #2013-03-01#, #05/23/2013#

Page 14: Access2010 数据库基础与应用

常量( 2 )符号常量用有意义符号代替常量,这就是符号常量。符号常量需要先声明后使用。声明符号常量的语法格式如下:Const 常量名 [As 类型 | 类型符 ]= 表达式例如: Const MyVar=488

Const MyString$="VBA"

Const MyStr$="Help",MyPi As Double =3.14159 用户一旦定义了符号常量,在以后的程序中不能用赋值语句来改变它们的值,否则,在运行程序时将出现错误。(3) 系统常量系统常量是 VBA预先定义好的常量,用户可以直接使用。例如, VBA用 vbKeyReturn来表示 Enter 键。可以在“对象浏览器”窗口中查看各种系统常量。

Page 15: Access2010 数据库基础与应用

变量

2 .变量( 1 )变量的命名规则为变量命名时,应遵循以下规则:变量名必须以字母或汉字开头;变量名中不能包含空格和除了下划线字符“ _” 以外的任何其他标点符号;变量名长度不超过 255 个字符;变量名不区别大小写,如 StuID、 stuid、 stuID 表示同一个变量;变量名不能使用系统保留字作为变量名,如Sub、 Rem、 Function 等。

Page 16: Access2010 数据库基础与应用

变量( 2 )变量的声明① 显示声明声明变量要使用 Dim 语句, Dim 语句的格式为:Dim 变量名 [As 数据类型|类型符 ] [ ,变量名 As 数据类型|类型符 ] …] 例如: Dim Var_1 As Integer Dim Var_2% , Sum!对于字符型变量,分为定长和变长字符串两种。例: Dim x As String , y As String*10②隐含声明在程序中并没有明确声明变量,而是直接将一个值指给变量名,或 Dim 声明中省略了 As 数据类型,同时也没有附加类型符来指明变量的数据类型,这时变量的数据类型为变体类型( Variant )。例如: Dim m ,n NewVar=528

Page 17: Access2010 数据库基础与应用

变量

③强制声明方法一: 在 VBE 代码窗口的顶部“通用—声明”区域中,加入Option Explicit 语句,要求本模块的所有变量必须先声明后使用。方法二:单击 VBE 窗口中“工具” |“ 选项”菜单命令,在弹击的“选项”对话框中,选中“要求变量声明”选项,可以为所有新模块都启用强制变量声明功能。

Page 18: Access2010 数据库基础与应用

变量

(3) 变量的作用域①局部变量 局部变量是指在过程内部定义的变量,在子过程和函数过程中使用 Dim 语句声明或直接使用的变量都是局部变量,作用范围是其所在过程,在其他过程中无效。② 模块变量 模块变量定义在模块的所有过程的上面,运行时在模块所包含的所有子过程和函数过程都可以使用该变量。模块变量可用 Dim 语句或 Private 语句声明。③全局变量 全局变量定义在标准模块所有过程的上面,运行时在所有类模块和标准模块的所有子过程与函数过程中均可使用。全局变量需用 Public 语句来定义,不能用 Dim或Private 语句来定义。

Page 19: Access2010 数据库基础与应用

变量(4) 变量的生命期变量存在的时间称变量的持续时间或生命周期,变量定义方法不同,变量的生命周期也不同。•局部变量的生命周期从变量的定义语句所在的过程第一次运行,到程序代码执行完毕并将控制权交回到调用的它的过程为止的时间。•模块级变量的持续时间是整个模块的执行的时间。•全局变量的持续时间是整个应用程序的执行期间。 按照变量的生命期,可以将局部变量分为动态局部变量和静态局部变量。①动态局部变量:以 Dim 语句定义的局部变量,每次子过程或函数过程被调用时,该变量会被设定为默认值。②静态的局部变量:用 Static 定义的局部变量。整个模块的执行的期间,静态局部变量可以保留它的值。

Page 20: Access2010 数据库基础与应用

变量(5) 数据库对象变量Access 数据库中各种对象及其属性,都可以作为 VBA 程序代码中的变量及其指定的值来加以引用。Access 中窗体对象的引用格式为:Forms!窗体名称!控件名称 [. 属性名称 ]

Access 中报表对象的引用格式为:Reports!窗体名称!控件名称 [. 属性名称 ]

例 7-3 学生管理窗体中“学号”文本框的引用。Forms!学生管理!学号 = "1123120304"

或Forms!学生管理! [学号 ]= "1123120304"

Page 21: Access2010 数据库基础与应用

变量( 6 )数组变量数组变量声明一般格式为:Dim 数组名 ([ 下标 1 下界 To] 下标 1 上界 [, [ 下标 2 下界 To] 下标 2 上界 ]…) As 数据类型下标下界的默认值为 0 ,在使用数组时,可以在模块的通用声明部分使“ Option Base 1” 语句来指定数组下标下界从 1开始。数组可以分固定大小数组和动态数组两种类型。固定大小的数组即数组的元素个数是固定的。动态数组中的数组元素个数是可以被改变的。① 声明固定大小的数组Dim IntAgeArray(10, 10) As Integer② 声明动态数组Dim IntArray() As Integer ’ 定义一个动态数组Redim IntArray(2) ’ 使用 Redim 语句IntArray(1)=10 ’ 为动态数组的元素赋值

Page 22: Access2010 数据库基础与应用

7.2.3 VBA中的常量、变量、运算符和表达式

算术运算符的优先级从高到低的顺序:先算乘幂,其次算乘除,再次算整除、求模、最后算加减。如果运算符的优先级相同,则按从左到右的顺序依次计算例 7-5 计算算术表达式 4+5\6*7/8 Mod (3+6) 的结果。

运算符 运算符的含义 举例 优先级^ 乘幂 3^2 结果为 9 1

* 乘 5*2 结果为 10 2

/ 除 10/2 结果为 5 2

\ 整除 5\2 结果为 2 3

Mod 求模 9 Mod 5 结果为4 4

+ 加 4+6 结果为 10 5

- 减 8-2 结果为 6 5

(1) 算术运算符

Page 23: Access2010 数据库基础与应用

7.2.3 VBA中的常量、变量、运算符和表达式

6 个关系运算符的优先级是相同的,如果它们出现在同一个表达式中,按照从左到右的顺序依次运算,但关系运算符比算术运算符的优先级低。

运算符 运算符的含义 举例> 大于 5>3 结果为 True

< 小于 3<5 结果为 True

= 等于 5=3 结果为 False

>= 大于等于 3>=5结果为 False

<= 小于等于 3<=5 结果为 True

<> 不等于 3<>5 结果为 True

(2) 关系运算符

Page 24: Access2010 数据库基础与应用

7.2.3 VBA中的常量、变量、运算符和表达式

常用的 3 个逻辑运算符之间的优先级,由高到低依次为:非( Not )、与 (And) 、或 (Or) 。逻辑运算符的优先级比关系运算符的优先级低。在 VBA 中,逻辑量可以参与算术运算, True 值被当成 -1、 False被当成 0处理。

运算符 运算符的含义 优先级Not 非 1

And 与 2Or 或 3

(3) 逻辑运算符

Page 25: Access2010 数据库基础与应用

7.2.3 VBA中的常量、变量、运算符和表达式

连接运算符作用是将两个字符串连接起来合成一个更大的字符串。 “+ ” 要求其前后的表达式必须是字符串表达式 “&” 的连接的表达式可以是字符串表达式,或是数值表达式等,若是数值表达式,先进行计算,然后将其转化为字符串,再进行字符串的连接。例如: "ACCESS "+ " 数据库 " 结果为 "ACCESS 数据库 "

例如: "2+3= " & 2+3 结果为 "2+3=5 “

四种运算符优先级从低到高依次为:逻辑运算符→关系运算符→连接运算符→算术运算符。

(4) 连接运算符

Page 26: Access2010 数据库基础与应用

7.2.4 常用函数

函数 函数功能说明 示例 结果Abs(N) 返回数值表达式 N的绝对值 Abs(-2) 2

Int(N)返回不大于数值表达式 N的最大整数

Int(-3.5)Int(3.5)

-43

Fix(N)去掉小数,返回数值表达式N的整数部分

Fix(-3.5)Fix(3.5)

-33

Sqr(N) 返回数值表达式 N的平方根 Sqr(9) 3

Rnd(N) 产生 0~1之间的随机数 Rnd(1)产生一个 0~1之间的新的随机数

Round(N1[,N2])

对数值表达式 N1 进行四舍五入,保留数值表达式 N2位小数,若 N2 缺省,则进入四舍五入,保留到整数位。

Round(3.255,2)Round(4.55)

3.265

Sgn(N)

返回数值表达式 N的符号 ,当 N大于 0时,返回 1,等于 0时,返回 0,小于 0时,返回 -1

Sgn(5)Sgn(0)Sgn(-20)

10-1

1. 算术函数

Page 27: Access2010 数据库基础与应用

2.字符串函数函数 函数功能说明 示例 结果Left(S,N) 从 S左侧取 N个字符 Left("数据库技术 ",2) "数据 "Right(S,N) 从 S右侧取 N个字符 Right("ABCD ",2) "CD"

Mid(S,N1,N2)从 S 的 N1 位置起,截取 N2个字符。 Mid("ABCDEF ",2,3) "BCD"

Len(S) 返回字符串所含字符数 Len("2013全运会 ") 7

LTrim(S) 删除字符串的开始空格 LTrim("□□ABC□□") "ABC□□"

RTrim(S) 删除字符串尾部空格 RTrim("□□ABC□□") "□□ABC "

Trim(S)删除字符串的开始空格和尾部空格 Trim("□□ABC□□") "ABC"

InStr(N,S1,S2)

从 S1 的第 N 个字符开始检索 S2在 S1中出现的位置。 N若缺省,则从左侧第一个字符开始检索。

InStr("ABCD","CD ") InStr(4 , "ABCDABCD ", "CD ")

3 7

UCase(S) 将 S中字母转成大写 UCase("abcd") "ABCD"LCase(S) 将 S中字母转成小写 LCase("ABCD") "abcd "

Space(N)生成 N个空格组成的字符串 Space(5) 5个空格

Page 28: Access2010 数据库基础与应用

3.日期 /时间函数函数 函数功能说明 示例 结果Date() 返回系统当前日期 Date()  

Now() 返回当前日期和时间 Now()  

Time() 返回系统的当前时间 Time()  Year(D) 返回日期 D的年份 Year(#2014-05-08#) 2014Month(D) 返回日期式 D的月份 Month(#2014-05-08#) 5Day(D) 返回日期 D的日 Day(#2014-05-08#) 8Hour(T) 返回时间表达式 T的小时 Hour(#08:30:15#) 8

DateAdd(C,N,D)

对日期 D增加特定的时间间隔值 N。

DateAdd("D",2, #2014-4-30#)DateAdd("M",2, #2014-4-30#)

2014-5-22014-6-30

DateDiff(C,D1,D2)

返回 D2与 D1之间的时间间隔

DateDiff("D", #2013-4-30#,#2014-4-30#)DateDiff("YYYY", #2013-4-30#,#2014-4-30#)

365  1

WeekDay(D)

计算日期 D为星期几,结果为 1-7之间的整数 WeekDay(#2014-5-1#) 5

Page 29: Access2010 数据库基础与应用

4.类型转换函数

函数 函数功能说明 示例 结果

Asc(S)返回字符串 S的首字符的ASCII码值 Asc("abc") 97

Chr(N)返回数值表达式 N所代表的字符 Chr(97) "a"

Str(N)将数值表达式 N转换为字符串。数值为正数时,返回的字符串含有一个前导空格

Str(99)Str(-6)

"□99 ""-6 "

Val(S) 将字符串 S转换为数值。 Val("2010.6")

2010.6

Page 30: Access2010 数据库基础与应用

5 .测试函数

函数 函数功能说明 示例 结果

IsArray(A) 测试数据 A是否是数组 Dim A(10)IsArray(A)

 True

IsDate(A) 测试数据 A是否是日期类型 IsDate(Date()) True

IsNumeric(A) 测试数据 A是否是数值类型 IsNumeric(5) True

IsNull(A)测试数据 A 是否是为 Null值 IsNull(Null) True

IsEmpty(A) 测试数据 A是否已经初始化 Dim v1IsEmpty(v1)

True

Page 31: Access2010 数据库基础与应用

7.3.1 顺序控制顺序控制结构的程序运行时按照语句排列的先后顺序逐条依次执行,它是程序中最基本的控制结构。常用的顺序控制结构的语句有注释语句、赋值语句、输入输出语句等。1. 注释语句Rem 注释文本 或' 注释文本例 7-6 使用 Rem 语句和“ '” 为程序添加注释。Rem 注释示例 Dim myStr1, myStr2 ' 定义变量语句myStr1 ="Hello" ' 变量赋值语句myStr2 ="Goodbye" ' 变量赋值语句

7.3 VBA 程序控制结构

第 7 章 模块与 VBA

Page 32: Access2010 数据库基础与应用

2. 赋值语句赋值语句为变量指定一个表达式的值。语句格式:[Let] 变量名 = 值或表达式其中, Let 为可选项。例 7-7 为变量赋值 , 并在立即窗口输出变量的值。Dim IntAge As Integer

IntAge=20

Debug.Print IntAge

7.3.1 顺序控制

VBA 程序控制结构

Page 33: Access2010 数据库基础与应用

VBA 程序控制结构3 .输入与输出( 1 )输入框函数—— InputBoxInpubBox 函数的作用是显示一个有提示信息输入框。语句格式为:InputBox(Prompt,[Title],[Default],[XPos],[YPos])

①Prompt 用于指定出现在输入框中的提示文字,其最大长度约为1024 个字符,如果提示信息需要显示在多行中,可在各行字符串表达式之间用回车符“ Chr(13)” 、换行符“ Chr(10)” 或回车换行符的组合“ Chr(13 & Chr(10)”来分隔行。②Title 用来指定显示在输入框的标题栏中的文字。若省略该参数,则应用程序名称显示在输入框的标题栏中。③Default 在没有输入其它值时作为缺省值。若省略该参数,则文本框为空。④Xpos 指定输入框的左边与屏幕左边的水平距离。⑤Ypos 指定输入框的上边与屏幕上边的垂直距离。

Page 34: Access2010 数据库基础与应用

VBA 程序控制结构( 2 )消息框函数—— MsgBox 函数MsgBox 函数的作用是在对话框中显示信息,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。 MsgBox函数的调用格式如下:变量名 =MsgBox(Prompt[, Buttons] [, Title] [, Helpfile, Context])

MsgBox在 VBA 程序中也可作为语句使用,其格式为:MsgBox Prompt,[Buttons],[Title]

Buttons 其值的总和用来指定显示按钮的类型与数目、使用的图标样式、缺省按钮以及消息框的强制回应模式等。如果省略,则 Buttons 的缺省值为 0。 Buttons 设置值如表

Page 35: Access2010 数据库基础与应用

VBA 程序控制结构分组 常量 值 说明

按钮类型与数目

vbOKOnly 0 仅显示“确定”按钮VbOKCancel    1 显示“确定”和“取消”按钮VbAbortRetryIgnore 2

显示“终止”、“重试”和“忽略” 按钮

VbYesNoCancel      3 显示“是”、“否”和“取消”按钮VbYesNo             4 显示“是”和“否”按钮VbRetryCancel      5 显示“重试”和“取消”按钮

图标样式

VbCritical          16 显示关键信息图标VbQuestion         32 显示警告询问图标VbExclamation     48 显示警告消息图标VbInformation        64 显示通知消息图标

缺省按钮vbDefaultButton1    0 第一个按钮是缺省值 ( 缺省设置 )

vbDefaultButton2    256 第二个按钮是缺省值vbDefaultButton3    512 第三个按钮是缺省值

强制返回模式

vbApplicationModal 0 应用程序一直被挂起vbSystemModal 4096 全部应用程序都被挂起

Page 36: Access2010 数据库基础与应用

VBA 程序控制结构

常数 值 说明

vbOK 1 确定

vbCancel 2 取消vbAbort 3 终止

vbRetry 4 重试vbIgnore 5 忽略

vbYes 6 是vbNo 7 否

Page 37: Access2010 数据库基础与应用

VBA 程序控制结构

 

例 7-8 使用 InputBox 接收用户的输入,用 MsgBox 语句显示结果。Sub ExpFunc() Dim strName As String ' 定义变量 strNmae = InputBox("请输入您的姓名 ", "登录 ") MsgBox “欢迎您 :” & strName & “ 同学” , _ vbInformation, "欢迎 " End Sub

Page 38: Access2010 数据库基础与应用

例 10-3 以下代码使用 InputBox 函数和 MsgBox 函数接收用户的输入并显示。Sub InputFunc() Dim str As String Str=InputBox("请输入您的姓名: ","登录 ") MsgBox "欢迎您: " & str & " 同学 ", vbInformation, "欢迎 "End Sub

程序在调用子过程 InputFunc 时,弹出输入对话框,要求用户输入数据,单击“确定”按钮后,弹出输出对话框。

VBA 程序控制结构

Page 39: Access2010 数据库基础与应用

7.3.2 选择控制1. If 语句(1) 单分支的 If 语句If <条件 > Then 语句块 1End If

单分支单行 If 语句格式: If 条件 Then 语句(2) 双分支的 If 语句If 条件 Then

语句块 1

Else

语句块 2

End If

双分支单行 If 语句格式: If 条件 Then 语句 1 Else 语句 2

条件

A B

T F

条件 F

AT

VBA 程序控制结构

Page 40: Access2010 数据库基础与应用

例 7-11 输入一个年份,判断该年是否为闰年。判断某年是否为闰年的规则是:如果此年号能被 400 整除,则是闰年;如果此年号能被 4 整除,但不能被 100 整除,则是闰年。Sub Leap()

Dim x As Integerx = Val(InputBox("请输入年份: "))If x Mod 400 = 0 Or (x Mod 4 = 0 And x Mod 100 <> 0) Then MsgBox Str$(x) & "年是闰年 "Else MsgBox Str$(x) & "年不是闰年 "End If

End Sub

VBA 程序控制结构

Page 41: Access2010 数据库基础与应用

( 3 )多分支 If 语句If 条件 1 Then 语句块 1ElseIf 条件 2 Then 语句块 2 …… [ElseIf 条件 n Then 语句块 n] [Else 语句块 n+1]End If

条件 1F

T

条件 2

条件 n

Else

F

F

语句块 1

语句块 2

语句块 n

语句块 n+1T

T

T

…F

VBA 程序控制结构

End If

Page 42: Access2010 数据库基础与应用

例 : 输入成绩 0-100 之间,判定成绩等级。判断成绩等级的规则是:如果成绩大于等于 85且小于等于 100 输出“优秀”,成绩大于等于 70且小于 85 输出“通过”,成绩大于等 60且成绩小于 70 输出“及格”,小于 60 ,输出“不及格”Sub Grade() Dim sngScore As Single Dim strResult As String sngScore = InputBox("请输入成绩 0~ 100") If sngScore >= 85 Then strResult = "优秀 " ElseIf sngScore >= 70 Then strResult = " 通过 " ElseIf sngScore >= 60 Then StrResult = "及格 " Else strResult = " 不及格 " End If MsgBox strResultEnd Sub

VBA 程序控制结构

Page 43: Access2010 数据库基础与应用

(4) If 语句的嵌套多分支结构也可用 If 语句嵌套来实现基本格式:If 条件 1 Then

语句块 1

Else

If 条件 2 Then

语句块 2

[Else

语句块 3]

End If

End If

VBA 程序控制结构

Page 44: Access2010 数据库基础与应用

(4) If 语句的嵌套例 7-13 根据 x 的值,计算表达式 y 的值。

部分代码如下:If x > 0 Then y = Sqr(x)Else If x = 0 Then y = 0 Else y = Abs(x) End IfEnd If

VBA 程序控制结构

Page 45: Access2010 数据库基础与应用

2.Select 语句在有些情况下,对某个条件判断后可能会出现多种取值的情况,使用 Select Case 语句。 Select 语句的基本格式:Select Case 表达式 Case 值列表 1 语句块 1 [Case 值列表 2 语句块 2] … … [Case 值列表 n 语句块 n] [Case Else 语句块 n+1 ]End Select

首先计算表达式的值,然后将表达式的值依次与各 Case 后列表中的值一一进行比较,若与其中某个值相同,则执行该列表后的相应语句块部分,然后执行 End Select 其后的语句;若出现与表列中的所有值均不相等的情况,则执行 Case Else 的语句块部分,然后退出 Select Case 结构,执行其后的语句,否则不执行任何结构内的语句,整个 Select Case 结构结束,再执行其后的语句。

VBA 程序控制结构

Page 46: Access2010 数据库基础与应用

说明:① 表达式可以是数值表达式或字符串表达式。② 值列表可以有如下 4 种格式: 值 1[, 值 2]…… :此种格式在表达式列表中有一个或多个值与表达式的值进行比较,多个取值之间用逗号分隔。如果表达式的值与这些值中的一个相等,即可执行此表达式列表后相应的语句块。 值 1 To 值 2 :此种格式在表达式列表中提供了一个取值范围,可以将此范围内的所有取值与表达式的值进行比较。如果表达式的值与此范围内的某个值相等,则可执行此表达式列表后的相应语句块。 Is 关系运算符 值 1[, 值 2]…… :此种格式将表达式的值与关系运算符后的值进行关系比较,检验是否满足该关系运算符。若满足,则执行此表达式列表后的相应语句块。这几种格式允许混合使用。

VBA 程序控制结构

Page 47: Access2010 数据库基础与应用

例 7-14

根据输入的字符,判断是大写字母、小写字母、数字还是其他特殊字符。部分代码如下:

Dim x As String Dim result As String x = InputBox("请输入一个字符 ") Select Case Asc(x) Case 97 To 122 result= "小写字母 " Case 65 To 90 result= " 大写字母 " Case 48 To 57 result= " 数字 " Case Else result= " 其他特殊字符 " End Select Msgbox result

VBA 程序控制结构

Page 48: Access2010 数据库基础与应用

3 .具有选择功能的函数VBA 提供了 3 个具有选择功能的函数,分别为 IIf 函数、Switch 函数和 Choose 函数。( 1) IIf 函数调用格式:IIf(条件式 , 表达式 1, 表达式 2)

如果条件式的值为真,则函数返回表达式 1 的值;如果条件式的值为假,则返回表达式 2 的值。例如:min=IIf(a>b,b,a)

min=IIf(min>c,c,min)

功能是将 a, b, c 中最小的数赋值给变量 min 。

VBA 程序控制结构

Page 49: Access2010 数据库基础与应用

( 2) Switch 函数Switch 函数根据不同的条件值来决定函数的返回值,其调用格式如下:Switch(条件式 1, 表达式 1,条件式 2, 表达式 2,…,条件式 n, 表达式 n)该函数从左向右依次判断条件式是否为真,而表达式则会在第一个相关的条件式为真时作为函数返回值返回。例如:city=Switch(prov="湖南 ","长沙 ", prov="湖北 ","武汉 ", prov="江西 ","南昌 ")该语句的功能是根据变量 prov 的值,返回与省份所对应的省会名称。

VBA 程序控制结构

Page 50: Access2010 数据库基础与应用

( 3) Choose 函数Choose 函数是根据索引式的值返回选项列表中的值,函数调用格式如下:Choose(索引式 , 选项 1, 选项 2,…, 选项 n)

当索引式的值为 1 时,函数返回选项 1 的值;当索引式的值为 2 时,函数返回选项 2 的值;依次类推。若没有与索引式相匹配的选项,则会出现编译错误。例如:Weekname=Choose(wkDay,"星期一 ","星期二 ","星期三 ","星期四 ","星期五 ","星期六 ","星期天 ")

该语句的功能是根据变量 wkDay 的值返回所对应的星期中文名称。

VBA 程序控制结构

Page 51: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.3.3 循环结构1. For循环语句For 循环变量 =初值 To 终值 [Step 步长 ] 循环体Next 循环变量其中循环变量为数值型变量,用于统计循环次数,此变量可以从初值变化到终值,每次变化的差值由步长决定。如果步长为 1 ,“ Step 1” 可以省略。循环体是在循环过程中被重复执行的语句组。

Page 52: Access2010 数据库基础与应用

For循环的执行步骤如下:(1) 循环变量取初值(2) 循环变量与终值比较,确定循环是否进行,有以下三下情况:步长 >0 时若循环变量 <=终值,循环继续,执行步骤 (3) ,如果循环变值 >终值,循环结束,退出循环。步长 =0 时若循环变量 <=终值,进入死循环,如果循环变值 >终值,一次也不执行循环,退出循环。步长 <0 时若循环变量 >=终值,循环继续,执行步骤 (3) ,如果循环变值 <终值,循环结束,退出循环。(3) 执行循环体(4) 循环变量值增加步长,即循环变量 =循环变量 + 步长,程序跳转到 (2)

循环结构

Page 53: Access2010 数据库基础与应用

• 例 17-15 利用 For循环语句求 s=1+2+3+4+…+100 之间数的和

Dim i As IntegerDim sum As Longsum = 0For i = 1 To 100 sum=sum+ iNext iMsgBox "1到 100 之间数的和为: " & sum

循环结构

Page 54: Access2010 数据库基础与应用

2. Do循环语句( 1) Do While…Loop 语句Do While 条件表达式 循环体 []Exit Do]Loop语句执行时,若条件表达式的值为真,则执行 Do和 Loop 之间的语句组,直到条件表达式的值为假则结束循环。( 2) Do Until…Loop循环语句Do Until 条件表达式 循环体Loop语句执行时,若条件表达式的值为假,则执行 Do和 Loop 之间的语句组,直到条件表达式的值为真才结束循环。

条件

Loop 后的语句

Y

N

Exit DO

循环体

循环结构

Page 55: Access2010 数据库基础与应用

例 7-16 将例 7-15 用 Do While…Loop循环语句实现。部分程序代码如下:Dim i As Integer Dim sum As Longi=1sum = 0Do While i<=100 sum= sum+ i i=i+1LoopMsgBox "1到 100 之间数的和为: " & sum

循环结构用 Do Until…Loop循环语句实现程序Dim i As Integer

Dim sum As Long

i=1

sum = 0

Do Until I>100

sum= sum+ i

i=i+1

Loop

MsgBox "1到 100 之间数的和为: " & sum

Page 56: Access2010 数据库基础与应用

循环结构

(3) Do…Loop While 语句语句格式为:Do

循环体Loop While 条件表达式

( 4) Do…Loop Until 语句语句格式为:Do 循环体Loop Until 条件表达式

语句执行时,首先执行一次循环体语句,执行到 Loop时判断条件表达式的值,如果为真,继续执行 Do和Loop 之间的语句组,否则,结束循环。

语句执行时,首先执行一次循环体语句,执行到Loop 时判断条件表达式的值,如果为假,继续执行Do和 Loop 之间的语句组,否则,结束循环。

Page 57: Access2010 数据库基础与应用

循环结构

例如,有下面两段程序,分析循环执行的次数。

注意:对于循环次数确定的循环问题使用 For 语句是比较方便的。但是,有些循环问题事先是无法确定循环次数的,是通过给定的条件来决定是否继续循环,这时可以使用 Do 语句来实现。

程序段 1 :k = 0Do While k <= 10k = k + 1Loop

程序段 2 :k = 0Do Until k <= 10k = k + 1Loop

对于程序段 1 ,循环次数为 11 ,对于程序段2, k为 0 时,条件表达式的值为真,循环次数为0 。

Page 58: Access2010 数据库基础与应用

程序段 1 :num = 0Donum = num + 1Debug.Print numLoop While num > 2

循环结构

程序段 1 ,首先执行一次 Do和 Loop 之间的语句块,变量 num的值变为 1 ,显示 num 的值 1 ,再判断条件 num>2 是否为成立,不成立,退出循环,程序运行结果是在立即窗口仅仅显示 1 。程序段 2 ,首先执行一次 Do和 Loop 之间的语句块,变量 num的值变为 1 ,显示 num 的值,然后判断条件 num>2 是否为成立,不成立,下一次循环,条件表达式的值为真时,退出循环。程序运行结果是在立即窗口分别显示 1、 2、 3 。

程序段 2 :num = 0Donum = num + 1Debug.Print numLoop Until num > 2

Page 59: Access2010 数据库基础与应用

循环结构

3. For Each…Next循环语句在不知道数组或集合中元素的数目时,对于数组中的每个元素或对象集合中的每一项重复执行一组语句 ,用 For Each…Next 语句,其语法格式如下:For Each 元素名 In 名称循环体Next [ 元素名 ]

其中,元素名是用来枚举数组元素或集合中所有成员的变量。对于数组,元素名只能是 Variant 变量。对于集合,元素名可能是Variant 变量、 Object 变量等。名称是指数组或对象集合的名称。4. While—Wend循环语句语句格式为:While条件表达式 循环体Wend

Page 60: Access2010 数据库基础与应用

循环结构例 7-18 使用 Do循环和 For Each—Next循环语句将 26 个英文字母存入数组并逐个输出。部分程序代码如下:Dim i As IntegerDim x As VariantDim s As StringDim str(26) As Stringi = 1' 将 26 个大写字母依次存入 str(1)…str(26) 中Do While i<= 26 str$(i) = Chr$(i + 64) i= i+ 1Loop' 利用 For Each…Next 语句取出数组元素中的字母,将这些字母连接成一个字符串 xFor Each x In str s= s+ x Next x MsgBox s

Page 61: Access2010 数据库基础与应用

下列四种形式的循环设计中,循环次数最少的是 ______ 。A、 a = 5 : b = 8 Do a = a + 1 Loop While a < bB、 a = 5 : b = 8 Do a = a + 1 Loop Until a < bC、 a = 5 : b = 8 Do Until a < b b = b + 1 LoopD、 a = 5 : b = 8 Do Until a > b a = a + 1 Loop

循环结构

Page 62: Access2010 数据库基础与应用

7.4 过程的调用和参数的传递

7.4.1 过程调用过程必须先定义后调用,不同的过程有不同的结构形式和调用格式。1. 子过程的定义和调用(1) 子过程的定义子过程的定义的格式如下:[Public|Private][Static] Sub 子过程名 ([形式参数列表 ]) [局部常量或变量的定义 ] [ 语句块 ] [Exit Sub] [ 语句块 ]End Sub ( 2 )子过程的调用

Call 过程名 ([ 实际参数列表 ])

过程名 [ 实际参数列表 ]

Page 63: Access2010 数据库基础与应用

例 编写一个求 n! 的子程序,然后调用它计算 10! 值。程序如下:Sub Factorial (n As Integer)

Dim i As Integer

Dim s as Single

s = 1

For i = 1 To n

s = s * i

Next i

Msgbox str(n) & ”!=” & s

End Sub

调用 Factorial ,求 10!,需要在主调过程中增添调用语句:Call Factorial(10)

或 Factorial 10

7.4 过程的调用和参数的传递

Page 64: Access2010 数据库基础与应用

2 .函数过程定义和调用( 1 )函数过程的定义Function 函数过程名 ([形式参数列表 ])[As 数据类型 ] [局部常量或变量的定义 ] [ 语句块 ] [ 函数名 = 表达式 ] [Exit Function] [ 语句序列 ] [ 函数名 = 表达式 ] End Function

说明:函数名 = 表达式:用来定义函数的返回值。As 数据类型:用来定义函数过程返回值的类型,若缺省, VBA将自动赋给该函数过程返回值一个最合适的数据类型。

7.4 过程的调用和参数的传递

Page 65: Access2010 数据库基础与应用

( 2 )函数过程的调用调用格式如下:函数过程名 ([ 实际参数 ])

函数过程的调用格式同内部函数的调用格式相同,主要有以下两种用法:① 将函数过程返回值赋给变量,格式为:变量 = 函数过程名 ([ 实际参数 ])

② 将函数过程返回值作为某个过程的实参使用

7.4 过程的调用和参数的传递

Page 66: Access2010 数据库基础与应用

7.4 过程的调用和参数的传递

例 7-20 编写一个求解圆面积的函数过程。Public Function Area(R As Single) As Single ' 函数名为 Area ,返回值为单精度型 ,R 为半径 , 单精度型 If R <= 0 ThenMsgBox "圆的半径必须是正数 !", vbCritical, "警告 "Area = 0Exit FunctionEnd IfArea = 3.14 * R * REnd Function如果调用该函数 , 计算半径为 5 时圆的面积,调用格式为 Area(5) 。

例 7-21 编写一个求两个整数的最大值函数,并且调用该过程求 x、y、 z 的最大值。Public Function MaxFunc(Num1 As Integer, Num2 As Integer) If Num1 > Num2 Then   MaxFunc = Num1 Else MaxFunc = Num2 End IfEnd Function调用 MaxFunc ,求 x、 y 的最大值。调用格式为: MaxFunc(x,y) 。求 x、 y、 z三者的最大值,需要将 MaxFunc(x,y) 作为其中的一个实参,调用格式为:MaxFunc(MaxFunc(x,y) ,z) 。

Page 67: Access2010 数据库基础与应用

7.4 过程的调用和参数的传递3. 事件过程事件过程也是 Sub 过程,但它是一种特殊的 Sub 过程,它附加在窗体和控件上。一个控件的事件过程由控件的实际名字( Name 属性)、下划线和事件名组成,而窗体事件过程由“ Form” 、下划线和事件名组成。也就是说,事件过程不能由用户任意定义,而是由系统指定。控件的事件过程的一般格式为:[Public |Private] Sub 控件名 _ 事件名 ([形式参数列表 ]) [局部常量或变量的定义 ] [ 语句块 ] [Exit Sub] [ 语句块 ]End Sub 窗体的事件过程的一般格式为:[Public |Private] Sub Form_ 事件名 ([形式参数列表 ]) [局部常量或变量的定义 ] [ 语句块 ] [Exit Sub] [ 语句块 ]End Sub

Page 68: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.4.2 过程参数传递过程定义时可以设置一个或多个形式参数,所以调用过程时,必须把一个或多个实际参数传送给被调用的过程,完成形式参数与实际参数的结合,然后用实际参数执行被调用的过程。1 .按位置传送在 VBA 中,实际参数传递给形式参数整体上采用按位置传送方式。也就是说实际参数的位置次序必须和形式参数的位置次序一致2. 参数传递方式形参定义的一般格式为: [ByRef|ByVal] 变量名 [()][As 数据类型 ]

ByRef 表示参数传递方式是引用传递, ByVal 表示参数传递方式是按值传递。若没有指明参数的传递方式,默认情况下采用引用传递,前提条件是实参必须是变量,若实参是常量或表达式,只能采用按值传递方式。

Page 69: Access2010 数据库基础与应用

引用传递例 7-22 阅读下面的程序,分析程序的运行结果。' 主调过程Sub cmd1_click()Dim a As Integer, b As Integera = 10: b = 20TryOut a, b Debug.Print "a="; a, "b="; bEnd Sub' 被调用过程Sub TryOut(x As Integer, y As Integer)x = x + 100y = y * 6Debug.Print "x="; x, "y="; yEnd Sub

TryOut 过程有两个形参 x与 y ,两个形参都没有指明传递方式,而实参 a与 b 是两个变量,所以采用默认的参数传递方式,即引用传递方式,调用该过程时,将 a、 b 的地址分别传递给了 x与 y ,即 x=10, y=20,然后进行如下计算:x=10+100=110

y=20×6=120

这样,在 TryOut 过程中输出 x与 y 分别为110与 120 , 由于按引用传递, TryOut 过程结束后, x 的值回传给了 a, a 变成 110, y 的值回传给了 b, b 变成 120 ,在事件过程中输出 a与 b ,同样为 110与 120 。因此,在立即窗口中显示结果如下:x= 110 y= 120

a= 110 b= 120

Page 70: Access2010 数据库基础与应用

按值传递 例 7-23 对比例 7-22 阅读下面的程序,分析程序的运行结果。 ' 主调过程Sub cmd1_click()Dim a As Integer, b As Integera = 10: b = 20TryOut a, b Debug.Print "a="; a, "b="; bEnd Sub' 被调用过程Sub TryOut(ByVal x As Integer, y As Integer)x = x + 100y = y * 6Debug.Print "x="; x, "y="; yEnd Sub

TryOut 过程的形参 x前面有 ByVal, x采用按传值传递, y采用引用传递。事件过程调用 TryOut 过程时,将 a 的值传送给了 x ,将 b的地址传送给了 y ,即x=10, y=20 ,执行TryOut 过程, x与 y 分别变为 110与 120, TryOut过程结束后, y 的值回传给了 b, b 变成 120, x 的值不能回传给 a, a仍然为 10,在立即窗口显示结果如下:x= 110 y= 120

a= 10 b= 120

Page 71: Access2010 数据库基础与应用

第 7 章 模块与 VBA

7.5 程序调试1. 程序调试的概念程序调试的任务就是发现并纠正程序中的错误,以保证程序能够可靠运行。调试通常分为三步进行:检查程序是否存在错误,确定出错位置,纠正错误。2. 程序中常见的错误(1) 编译错误编译错误也称语法错误码,通常是由于不正确书写代码而产生的。 (2) 运行错误运行错误是程序运行时执行了非法操作所发生的错误。 (3) 逻辑错误这类错误是因为代码中存在逻辑上的缺陷而引起的,例如,设置的选择条件不合适、循环次数设置不当等。

7.5 程序调试

Page 72: Access2010 数据库基础与应用

3. 程序的三种模式在 VBE 环境中测试或调试应用程序代码时,程序所处的模式有 3 种:设计模式、运行模式和中断模式。在设计模式下,创建应用程序。单击调试工具栏中的“运行子过程 / 用户窗体”按钮或“运行” |“ 运行子过程 / 用户窗体”菜单命令,就进入了程序的运行模式。程序运行后可以进入中断模式,中断模式主要用来进行程序调试•语句产生运行错误。•“ 添加监视”对话框中定义的中断条件为真时(与定义方式有关)。•执行到一个设有断点的代码行。•单击 “调试”工具栏中“中断”按钮或“运行” |“ 中断”菜单命令或按“ Ctrl+Break” 键。要从中断模式返回到设计模式,选择“运行” |“ 重新设置”菜单命令或调试工具栏中的“重新设置”按钮即可。

程序调试

Page 73: Access2010 数据库基础与应用

程序调试4. VBA 调试工具(1) 设置断点若程序执行到某个语句处能自动暂停运行,该处为断点。一个 VBA程序中可以设置多个断点。在设置断点时,应该先选择断点所在的语句行,必须是可执行语句,然后可以采用以下方法设置:

单击“调试”工具栏中“切换断点”按钮 执行“调试”菜单中的“切换断点”命令 按 F9 键 用鼠标单击语句行左端边缘

(2) 逐语句执行代码(3) 逐过程执行代码(4) 跳出执行的代码(5) 运行到光标处

Page 74: Access2010 数据库基础与应用

程序调试5. VBA 调试窗口(1) 本地窗口该窗口内部自动显示出所有在当前过程中的变量声明及变量值。(2) 立即窗口在中断模式下可以用 Print 方法检查变量及表达式的值,或者为变量赋新值。也可直接输入一行语句,按 Enter 键,立即显示结果。(3) 监视窗口在监视窗口中添加监视表达式,可以查看一些变量或表达式的变化情况,进而对代码的正确与否做出判断。(4) 快速监视窗口在中断模式下,在代码窗口中选定某个变量或表达式,然后单击调试工具栏上的“快速监视”按钮,可以打开“快速监视”窗口,从中可以快速观察到该变量或表达式的当前值,达到快速监视的效果。

Page 75: Access2010 数据库基础与应用

程序调试

7.7.2 错误处理1 .激活错误捕获在捕获运行错误之前,首先要激活错误捕获功能。此功能由 On Error 语句实现, On Error 语句有 3 种形式。( 1) On Error GoTo 行号( 2) On Error Rusume Next ( 3) On Error GoTo 0

Page 76: Access2010 数据库基础与应用

程序调试

2 .编写错误处理程序在捕获到运行错误后,将进入到错误处理程序。在错误处理程序中,要根据错误的类型,向用户提示出错信息并向用户提供解决方法,然后根据用户的选择,使用 Resume 语句,控制程序返回到指定位置继续执行。返回语句 Resume 有以下三种形式:(1) Resume [0] :程序返回到出错语句继续执行。(2) Resume Next :程序返回到出错语句下一条语句继续执行(3) Resume 标号:程序返回到标号处继续执行。

Page 77: Access2010 数据库基础与应用

7.6 综合案例

案例一 某次大奖赛有 7 个评委同时为一位选手打分,去掉一个最高分和一个最低分,其余 5 个分数的平均值为参赛者的最后得分。编写程序,输入各位评委的打分,输出参赛者的最后得分。案例二 设计一个用户登录窗体,界面如下图所示。如果用户名、密码正确,则显示欢迎使用信息;如果错误,则最多允许用户登录 3次,超过 3次,则退出登录。