第八章 - 山东工商学院

Download Report

Transcript 第八章 - 山东工商学院

第8章 模块与VBA
8.1
8.2
8.3
8.4
8.5
8.6
8.7
面向对象的基本概念
VBA编程环境(VBE)
模块
VBA编程基础
程序基本结构
过程调用
程序的调试与出错处理
 模块(标准模块)是Access数据库7个对象之一,
其实质就是没有界面的VBA程序。
 模块具有很强的通用性,窗体、报表等对象
都可以调用模块内部的过程。
 模块包含若干由VBA代码组成的过程。每个过
程完成一个相对独立的操作,不涉及界面,
是“纯”程序段。
 VBA是VB的子集。
 VBA简介
VBA(VB for Application)是MS Office内置的编程
语言,是基于VB的简化宏语言,可以认为VBA是VB的子集。
它与VB在主要的语法结构、函数命令上十分相似,但是
两者又存在着本质差别。VB用于创建标准的应用程序,
而VBA是使已有的应用程序(Word、Excel等)自动化。另
外,VB具有自己的开发环境,而VBA必须寄生于已有的应
用程序。
8.1 面向对象的基本概念
 1. 对象(Object)
 2. 类(Class)
 3. 属性(Property)
 4. 方法(Method)
 5. 事件(Event)
对象(Object)
 可以用来表示客观世界中的任何实体
 在ACCESS中包括数据库的七种对象以及可以添
加在窗体和报表上的各种控件对象
 包含其他对象的对象称为容器对象.例如窗体
类(Class)
 具有共同属性、共同操作性质的对象集合就称
为类。
 类是对象的抽象描述,对象是类的实例。
 例如学生类、汽车类
属性(Property)
 对象的特性即属性。
 描述该对象特性的具体数据称为属性值。
 在VBA中引用某对象的属性的方法:
 对象名.属性名
 例如:label1.caption=“姓名”
 注意:在ACCESS的属性窗口所看到的对象属性都为中文,
而编写代码时必须使用英文属性名.
 可以在某中文属性上单击F1键,查看其英文名及使用方法
方法(Method)
 即事件发生时对象执行的操作.
 属性和方法描述里对象的性质和行为
 方法的引用形式: 对象名.方法名
 DoCmd对象
事件(Event)
 对象可以识别和响应的操作.
 不同的对象能够识别不同的事件.
 事件驱动是面向过程编程和面向对象编程之间
的主要区别.
 在属性窗口,可以查看具体控件具有哪些事件.
8.2 VBA编程环境(VBE)
VBE是Visual Basic Editor的缩写,是编写VBA程序的一个编
程界面。进入VBE可以选择以下几种方式:
在窗体或者报表的“设计视图”中,进入VBE环境有两种方法。一种
方法是单击工具栏上的“代码”按钮。另一种方法是在某控件上单击鼠标
右键,从弹出的快捷菜单中选择“事件生成器”命令,并在打开的“选择生
成器”对话框中选择“代码生成器”项,然后单击“确定”按钮即可。
在窗体或者报表之外,进入VBE环境也有两种方法。一种方法是单
击“工具”菜单中的“宏”命令中的“Visual Basic 编辑器”。另一种方法
是在数据库的“模块”对象窗口中,单击“新建”按钮或者双击一个已经存
在的模块对象。
(1)VBE工具栏介绍
(2)VBE窗口介绍
8.3 模块
 8.3.1 标准模块
 8.3.2 类模块
 8.3.3 将宏转化为模块
 8.3.4 创建新过程
 模块是将VBA声明和过程作为一个单元进行保存
的集合.
 模块有两种类型:类模块和标准模块.
 模块中的每一个过程都可以是一个Function函
数过程或者一个Sub子过程.
模块有两种基本类型:类模块和标准模块。
(1)标准模块
标准模块包含的是通用过程和常用过程,这些通用
过程不与任何对象相关联,常用过程可以在数据库中的
任何位置运行。
标准模块的创建方法:
1)在数据库或VBE窗口,“插入”菜单“模块”命令
2)在数据库的“模块”对象窗口,单击“新建”按
钮
(2)类模块
含有类定义的模块,包含类的属性和方法的定义。窗体模块和
报表模块都是类模块,而且它们各自与某一窗体或报表相关联。窗
体和报表模块通常都含有事件过程,该过程用于响应窗体或报表中
的事件。可以使用事件过程来控制窗体或报表的行为,以及它们对
用户操作的响应,例如用鼠标单击某个命令按钮。
通过单击工具栏上的“代码”按钮可查看窗体或报表的模块。
类模块的创建方法:
1)在数据库或VBE窗口,“插入”菜单“类模块”命令
2)在VBE的“工程”窗口,右击“模块”项,选择“插
入”“类模块”项
图8.7 宏转换模块的VBE窗口
8.3.4 创建新过程
 Access模块在VBE界面的代码窗口中编写。
模块由若干个过程组成。
 过程分为2种类型:SUB子过程和Function函
数过程。
Option Compare Database(由系统自动给出)
Sub 子过程
Function 函数过程
Sub 过程名1()
语句行
——用户自行设计
End sub
Function 函数名1()
语句行
——用户自行设计
End function
例如:创建“模块入门”模块,在其中添加“Hello”子过程,内容是弹出一
“大家好!”消息框。
8.4 VBA编程基础
 8.4.1 数据类型
 8.4.2 常量
 8.4.3 变量
 8.4.4 数组
 8.4.5 数据库对象变量
 8.4.6 表达式
 8.4.7 标准函数
1 数据类型
规定数据的取值范围、存储方式和运算方
式。每个数据都要事先明确所属类型。
在VBA中,对不同的数据类型采用不同的处
理方式,并根据数据类型来进行存储空间的分
配和有效操作。
2 常量
指在程序运行过程中固定不变的量,用来表示一个具体的、不变的
值。常量可以分为文字常量、符号常量和系统常量三种。
1.文字常量
即常数,直接以数值或者字符串等形式来表示的量。数值型、货币
型、布尔型、字符型或日期型等不同类型的常量其表达方法有不同规定。
(1)数值型常量:以普通的十进制形式或者指数形式来表示。一般情
况下,较小范围内的数值用普通形式来表示。比如,123、-123、1.23
等。如果要表示的数据很精确或者范围很大,则可以用指数形式来表示。
比如,用0.123E4用来表示0.123×104。
(2)字符型常量:直接输入或者用双引号作为定界符括起来的字符串,例如,”
山东工商学院”、”COMPUTER SCIENCE”等。当字符串的长度为0时(””),
用来表示空字符串。
(3)日期型常量:表示日期和时间。
 范围从100年1月1日~9999年12月31日,表示时间的范围从
0:00:00~23:59:59;
 日期时间两边用“#”括起来。日期部分中的“年月日”之间可以用分隔符
“/”或“-”隔开,也可以用英文简写的方式表示月份。例如,
#2008/8/8#、#2008-8-8#、#Aug 8,2008#。
 时间部分中的“时分秒”用“:”隔开,可以用AM、PM分别表示上午和下午。
例如#15:44:23#、#3:44:23PM#。
 也可以将日期和时间连接起来表示一个日期时间值,日期和时间部分用空
格隔开如#2008/8/8 15:44:23#。
补充:
货币型常量:与数值型常量的表示方法类似,但是前面要加货币符
号以表示是货币值。例如,$123.45。
布尔型常量:用来表示逻辑值,只有True或者False两个值。当逻
辑值转换为整型时,True转换为-1,False转换为0;当将其他类
型数据转换为逻辑数据时,非0转换为True,0转换为False。
例如:7>6>0
2. 符号常量
对于代码中重复使用的常量或者有意义的常量,可以定义符号来
表示。例如,用PI代表3.1415926来表示圆周率。定义符号常量一般
要指明该常量的数据类型。
【语法】Const 常量名 [As 数据类型] = 常量
例如,定义常量:
Const PI as Single = 3.14159
Const st% =18
注意:在程序中符号常量不能二次赋值,与变量区别。
例如:Const a as interger =100
a=50
3. 系统常量
系统常量指的是已经预先在类库中定义好的常量,
编程者可以在宏或者VBA代码中直接拿来使用。
在VBE窗口中,可以使用“对象浏览器”查看系统
常量所来自的类库,以及其实际所表示的值。
8.4.3 变量
在程序运行的过程中允许其值变化的量称为变量。声明
变量的过程实际上是在内存区域开辟一个临时的存储空间用
来存放数据,变量值就是存放在这个存储空间里的数据。
变量的命名规则
 变量名必须以字母或汉字开头,由字母、下划线、数字和
汉字组成。变量名中不能包含空格,或者除了下划线“_”
以外的特殊字符。
 变量名不区分大小写。例如,变量a和变量A表示的是同一
个变量。
 长度不能超过255个字符。
 不能与VBA中的关键字重名。例如,不能用Const作为变量
的名称
1. 变量声明
 一般情况下,在使用变量之前应该先声明该变
量的变量名和数据类型。这种方式称为变量的
显式声明。
 VBA允许不声明该变量,而在程序中直接使用,
这个时候该变量被默认为Variant数据类型。这
种方式称为变量的隐式声明。
声明变量的一般方法是用Dim语句,其命令格式如下:
【语法1】Dim 变量名 [As 数据类型] [,变量名 [As 数据类型]]
【语法2】Dim 变量名 [类型符号] [,变量名 [类型符号]]
如果省略数据类型,则所定义的变量为Variant类型(变体型)。
定义多个变量的时候,可以用逗号隔开,也可以使用多个dim语句来
声明。例如使用如下的定义命令:
Dim a,b as Integer
Dim str1 as String*10,str2 as String
2. 变量赋值
声明变量的作用是指定变量的名称和变量的数据类型,
接下来就可以为变量赋值了。
【语法】 变量名 = 表达式
计算表达式的值,然后将计算结果赋给内存变量。
3.改变变量的值
x=x+1
8.4.4 数组
 数组是一种数据存储结构,它用一个标识符保存若干个
数据,用不同的下标予以区分。
Array(0)=17
Array(1)=19
……
 数组具有以下特性(数组中的每个数据称为元素):
 每个元素类型相同,占用同样大小的存储空间
 数组中的元素在内存中连续存放
 通过下标可访问数组中的每个元素。下标的类型可以是
整数,常量、变量或算术表达式。
 数组分为一维数组、二维数组和多维数组
 一维数组中的元素呈直线状排列,每个下标对应
一个元素。
 数组在使用前必须先行定义,语法格式是:
 Dim <数组名>([<下界>] To 上界) As 数据类型
 若省略下标下界,则数组的最小下标为0
 例如:
Dim A(10) As Double
A数组共有11个元素(下标的起止范围是0~10)
二维数组
 二维数组中数据排列呈平面状,可保存一个二维表的信息。
 数组元素使用行下标和列下标定位,定义格式:
Dim <数组名>([<下界> To] 上界,[<下界> To] 上界) As
数据类型
 如果省略下标的下界值,则下界值默认为0
 例如,Dim
元素。
A(3,4) As Integer ,声明的A数组有45=20个
 二维数组的操作通常需要与双重循环相结合。
8.4.6
运算符与表达式
 表达式是由常量、变量、函数及运算符组成的式子。表达
式按照运算规则经过运算求得结果,称为表达式的值。
b
b  4 ac
2
→
(-b+Sqr(b^2-4*a*c))/(2*a)
2a
 运算符规定对数据进行的某种操作,也称为操作符。不同
类型的数据其运算符种类不同。VBA中的运算符可分为5类:
算术运算符、字符串运算符、关系运算符、逻辑运算符和
日期运算符。
 按照运算符的不同,表达式也可以分为相应的五种类型。
补充
可在在VBE中的“立即窗口”使用输出语句查
看表达式运算的结果:
【语法】 PRINT | ? 表达式 [,表达式,…]
1.算术表达式
算术运算的对象一般是数值型或货币型数据(如果不是,则系统将
其转化为数值型再运算),运算结果仍然是数值型或货币型数据。
运算符:+、-、 *、/、 ^、 \、 Mod
加 减 乘
除 乘方 整除 取余
【例】计算并显示算术表达式的值。
(12*5-11*6)/3
‘结果为-2
(1+2^1/2)/2
‘结果为1
10 Mod -4
‘结果为2
10+True
10-False
“123”*2+123
‘结果为9,True转化为整数-1
‘结果为10, False转化为整数0
‘结果是369,字符串”123”转化为整数123
2.字符运算
字符运算,即将两个字符串强制连接到一起生成一个新
的字符串。字符运算符有“+”和“&”两种,其功能和使用
方法是一样的。参与字符运算的数据一般是字符串型,也可
以是数值型。如果是数值型,系统将其转化为字符串,然后
再做连接运算。
区别:+只用于字符串的连接;&可以连接不同类型的数据。
【例】计算字符表达式的值。
“山东 “ & ”烟台 ” + ”苹果”
‘结果为 ”山东 烟台 苹果”
“1234+5678” & “=” & (1234+5678)
‘结果为 ”1234+5678=6912”
3.关系比较运算
关系表达式是用来比较关系运算符两边操作数的大小的,结果
返回逻辑值True或False。关系运算符,它们的优先级是相同的。
注意:>=
<=符号中间不能有空格。
执行关系运算时应注意以下的规则:
(1)数值型和货币型数据按数值大小进行比较;日期型按日期的先
后进行比较,越早的日期越小,越晚的日期越大;逻辑型数据的大
小规定为:True<False。
(2)当比较两个字符串时,系统对两个字符串的字符从左到右逐个
比较,一旦发现两个对应的字符不同,就根据这两个字符的ASCII码
值进行比较,ASCII码大的字符串大。汉字的字符比西文字符大。
【例】计算关系表达式。
123<321
‘结果为True
“abc”<=”abcd” ‘结果为True
True>False
‘结果为False
#2008/8/1# >= #2007/12/31#
True
“abcd”=”abc”
‘结果为False
“abc” <> “ABC” ‘结果为True
‘结果为
4. 逻辑运算
逻辑表达式也称为布尔表达式。参与逻辑运算的操作数是
逻辑型数据或能得出逻辑值的表达式,返回的结果也是逻辑值。
优先顺序为:Not、And、Or
【例】计算逻辑表达式的值。
2^3<3^2 Or “abc”=”abcd” And 3<=4
‘结果为True
补充
日期与日期表达式
日期可以进行加减运算,运算符是“+”和“-”。两个
日期相减,得到两个日期之间相差的天数。日期可以加或减
一个数值,得到指定日期若干天后或若干天前的新日期。
【例】计算日期表达式的值
#2008/8/8# - #2008/7/8#
#2007/12/31#+1
求:咱有意义的活了多少天?
‘结果为31
‘结果为 #2008-1-1#
[例]输出当天日期及距2012年元旦的天数。
在“模块入门”模块中添加如下Today()过程:
Sub Today()
MsgBox "今天的日期是" & Date & ",距2012年
1月1日还有" & (#1/1/2012# - Date) & "天"
End Sub
运行结果
8.4.7 标准函数
 是预先编好的具有某种操作功能的程序,每一个函数都有特定的
数据运算或转换功能。
 函数包含函数名、参数和函数值三个要素。
 函数名是函数的标识,说明函数的功能。
 参数是自变量或函数运算的相关信息,一般写在函数名后的括
号中,也可以没有参数。例如函数Date,返回当前的系统日期。
调用函数时,应注意所给参数的个数、顺序和类型要与函数的
定义一致。在代码窗口中输入函数时,系统会自动提供相关函
数的定义。
 函数值是函数返回的值,函数的功能决定了函数的返回值。
 其格式为:
【语法】函数名[(参数1,[参数2],[参数3]…)]
8.4.7 标准函数
 1. 数学函数
 2. 字符函数
 3. 日期/时间函数
 4. 聚合函数
 5. 其他函数
(1)取整数函数
【语法】 Round(数值表达式1[,数值表达式2])
Fix(数值表达式)
Int(数值表达式)

Round()返回对数值表达式1四舍五入到数值表达式2
所指定的小数位数的数值表达式。如果数值表达式2缺省,
则表示要精确到整数位。

Fix()和Int()都返回数值表达式的整数部分,不同
之处在于,如果为负数,则Int()返回小于或等于数值表达
式的最大整数,Fix()返回大于或等于数值表达式最小整数。
【例】求以下函数的值。
Round(123.456,2),Round(123.456)
‘结果为 123.46 123
Fix(12.3),Fix(-12.3),Int(12.3),Int(-12.3)
‘结果为12
-12
12
-13
(1)求字符串长度函数。
【语法】 Len(字符表达式)
返回字符表达式中字符的个数。
注意,在VBA中,字符串长度以字为单位,也就是每
个西文字符和中文汉字都作为1个字,占两个字节。对于
字符型变量,则返回的长度是定义时的长度,与实际值
无关。
(2) 求子字符串函数。
【语法】 Left(字符表达式,数值表达式)
Right(字符表达式,数值表达式)
Mid(字符表达式,数值表达式1[,数值表达式2])
 一个字符串的一部分称为该字符串的子字符串。Left()从字
符表达式左边开始,截取数值表达式所指定长度的字符个数;
 Right()从字符表达式右边开始,截取数值表达式所指定长
度的字符个数;
 Mid()从数值表达式1指定的位置开始,截取数值表达式2所
指定的字符个数,返回子字符串。数值表达式2为可选项,
如果缺省,则返回从数值表达式1开始的所有字符。如果数
值表达式1大于字符表达式的长度,则返回零长度字符串。
【例】求函数值。
LEN("Access")
Left(“山东工商学院”,2)
‘结果为6
‘结果为山东
Right(“山上老妖”,2)
‘结果为老妖
Mid(“今日狗叫”,2,2)
‘结果为日狗
5、其他函数
(1)MsgBox()函数。
MsgBox()函数用来打开一个对话框,向用户显示提示
信息,并且等待用户单击指定的按钮,然后向系统返回用
户的选择。该函数可用于信息的输出和提示。
【语法】MsgBox(显示信息[,对话框类型][,对话框标题])
 显示信息是一个字符表达式,用来指定在对话框中显示的
文本信息,最多允许1024个字符,如果显示信息的内容超
过一行,可以在每一行之间用“回车符”(Chr(13)或“换
行符”(Chr(10)将各行分隔开来。
•
对话框类型指定对话框中出现的按钮、图标以及默认按钮,
分别由三个区域的数值确定。在设置时,可以使用内部常
数或数值。对话框类型的多个设定值用”+”连接起来。
 对话框标题指定在对话框标题栏中显示的字符表达式。如
果缺省,将应用程序名Microsoft Access放在标题栏中。
MsgBox()函数根据用户的选择,向系统返回一个数值,
由程序根据返回值决定下一步的流程。
【例】MsgBox函数的示例。
在代码窗口输入命令,然后执行。弹出如图所示的对话框。
Dim Ans as Integer
Ans = MsgBox(“欢迎使用本数据库系统”,1+64+0,”欢
迎信息”)
(2)InputBox 函数。
InputBox()函数用于打开一个对话框,在对话框中显示
提示信息和一个文本框,并等待用户输入,然后将用户在
文本框中的输入返回给系统,返回值的类型为字符串。
【语法】 InputBox(显示信息[,对话框标题][,默认值])
 显示信息是一个字符表达式,用来指定在对话框中显示的
文本信息。
 对话框标题指定对话框标题栏中显示的文字。
 默认值指定当用户无输入时,显示在文本框中的内容。
【例】InputBox函数示例。
Dim User as String
User=InputBox(“请输入你的用户名:”,“登录”,
“Administrator”)
Msgbox ”欢迎你: ”+User, VbOkOnly+VbInformation,”
欢迎”
8.5 程序基本结构
 8.5.1 编码规则
 8.5.2 顺序结构
 8.5.3 分支结构
 8.5.4 循环结构
8.5.2 顺序结构
图8.18添加过程“表达式练习”
图8.19添加了过程后的VBE窗口
图8.21添加了具体内容的过程窗口
图8.20更改了模块名称后的VBE窗口
【例8.2】在“教学管理”数据库的“模块”对象窗口中
新建模块“表达式练习”,模块内容参照图8.21中所
示,练习在模块中输出表达式的运算结果。
【例8.3】在“教学管理”数据库的“模块”对象窗口中新
建模块“消息框练习”,模块内容参照图8.25中所示,
练习在模块中使用MsgBox函数输出信息(对照表816和表8-17中各参数设置)。
图8.25模块“消
息框练习”的代
码窗口
图8.26运行模块“消息框练习”出现的六个消息对话框
图8.22运行过程得到的消息窗口
8.5.3 分支结构
 1. If语句
(1)单路分支
(1)单路分支
单路分支的语句格式如下:
格式一:If <表达式> then
<语句序列>
End If
格式二:If <表达式> then <语句>
图8.27单路分支语句的流程图
【例8.4】利用分支结构If语句,设计计算分段函数
的程序模块。
(2)双路分支
双路分支的语句格式如下:
(2)双路分支
格式一:If <表达式> then
<语句序列1>
Else
<语句序列2>
End If
( x  0)
图8.28双路分支语句的流程图
格式二:If <表达式> then <语句1> Else <语句2>
 2. Select Case语句
【例8.5】利用多路分支语句设计程序,实现输
入百分制考试成绩,输出成绩的五个等级之一。
假设:90分以上为“优秀”、80~89分为“良好”、
70~79分为“中等”、60~69分为“及格”、60分
以下为“不及格”。
功能:该语句执行时,根据<测试表达式>的值,
从上到下依次 检查n个<表达式值>,如果有一个
与<测试表达式>的值相匹配,程序将执行该<表
达式值>下的<语句序列>;当所有Case中的<表达
式值>都没有与<测试表达式>的值相匹配时,如
果有Case Else项,则执行<语句序列n+1>;执行
完上述语句后,都将转到End Select后面去执行
下一条语句;否则,直接执行End Select后面的
下一条语句。
( x  0)
图8.29模
块“分段
函数”的
代码窗口
图8.30在InputBox函数对话框中输入x值(5)
多路分支的语句格式:
Select Case <测试表达式>
Case <表达式值1>
<语句序列1>
Case <表达式值2>
<语句序列2>
……
Case <表达式值n>
<语句序列n>
[Case Else
<语句序列n+1>]
End Select
1  x
y
1  2 x
图8.34 多路分支的流程图
图8.35模块“多路分支练习”的代码窗口
图8.31通过Msgbox函数得到计算结果y=6
8.5.4 循环结构
100
【例8.6】利用For循环语句,求 sum 
 1. for循环语句
 n 函数的值。
n 1
For循环语句又称“计数”型循环控制语句,它以指定的次数重复执行一组
语句。
(1)For 循环语句的格式:
For <循环变量>=<初值> to <终值> [Step <步长>]
<循环体>
[Exit For]
Next <循环变量>
图8.37模块“求和函数”的代码窗口
例如:
For n = 1 To 100
sum = sum + n
Next n
图8.38运行“求和函
数”后在立即窗口中
得到输出结果
功能:执行该语句时,首先将<初值>赋给<循环变量>,然后判断<循环变量>是否超
过<终值>,若结果为真,则结束循环,执行Next后面的下一条语句;否则,执行<循环
体>内的语句,<循环变量>自动按<步长>增加或减少,再重新判断<循环变量>当前的值
是否超过<终值>,若结果为真(True),则结束循环,否则继续重复上述过程,直到
其结果为真。
 2. While循环语句
(1)Do While …Loop 循环
While循环语句又称“当”型循环控制语句,它是通过“循环条件”控制
重复执行一组语句。
(1)While 循环语句有两种常用格式可供选择:
格式一: Do While <循环条件>
<循环体>
Loop
格式二: While <循环条件>
<循环体>
Wend
100
【例8.7】利用While循环语句,求函数
sum 
n
的值。
n 1
例如:
Do While i <= 100
sum = sum + i
i=i+1
Loop
功能:当<循环条件>为真(True)时,执行<循
环体>内的语句,遇到Loop(或Wend)语句后,
再次返回,继续测试<循环条件>是否为True,
直到<循环条件>为假(False)结束循环,转去
执行Loop(或Wend)语句的下一条语句。
(2)While … Wend 循环
3. 按钮的单击事件代码设计
While i <= 100
sum = sum + i
i=i+1
Wend
【例8.8】按照图8.42所示,建立窗体“求1到n整数的和”,要求在文本框中
输入n的值后,单击“开始计算”按钮,即可求出1到n的整数的累加和,显示结
果如图8.43所示。
图8.43窗体的输出结果
图8.42 窗体“求1到n整数的和”的运行界面
“开始计算”按钮的“单击”事件设计:打开“开
始计算”按钮的属性对话框,单击“事件”卡“单击”
属性最右边的“选择生成器”按钮,在弹出的对话
框中选择“代码生成器”,单击“确定”按钮后进入
VBE窗口,光标位于按钮1的单击事件过程
(Command1_Click)之中,编写代码如下:
Private Sub Command1_Click()
Dim i As Integer
Dim sum As Long
Dim n As Integer
sum = 0
i=1
n = num
Do While i <= n
sum = sum + i
i=i +1
Loop
MsgBox "1到" + num + "的累加和="
+ CStr(sum)
End Sub
图8.40 用Do While和Loop循环设计求和函数
图8.39 While 循环语句的执行流程
图8.41用While和Wend循环设计求和函数
8.6 过程调用 (了解)
 8.6.1 带参数的Sub子过程
Sub子过程的功能是将一定的语句组合起来,可接受相应的参数,完成一定的任务 。
(1)Sub子过程的定义格式:
[Private|Public] Sub 子过程名([参数[as 类型],……])
语句
[Exit Sub]
语句
End Sub
(2)调用格式:
Call 过程名(实际参数)
【例8.9】修改例题8.8。将原来“开始计
算”按钮的单击事件代码中的“计算1到n的
累加和”部分设计成一个带参数的Public过
程,取名为addup(n),“开始计算”按钮
的单击事件代码改为调用该过程求得1到n
的累加和。
图8.44为过程addup添加参数和过程体代码
图8.45修改按钮“开始计算”
的单击事件代码(利用过程
调用语句)
 8.6.2 带参数的自定义函数
带参数的函数过程有自己独特的优势,即它可以向调用它的过程返回一个函数值,而带参数的
Sub子过程是没有返回值的。
(1) 函数定义格式:
[Private|Public] Function 函数名([参数[as 类型],……])[as 类型]
语句
[Exit Function]
语句
函数名=表达式
End Function
(2)函数调用格式
变量=函数名(实际参数)
图8.46 窗体“利用函数调用求n的阶乘”的运行界面
【例8.10】设计一个带参数的函数过程fact
(n),用于计算n的阶乘。再参照图8.46所
示,设计一个窗体“利用函数调用求n的阶乘”,
当运行窗体时,在文本框中接收一个来自键盘输
入的整数值n,然后单击“开始计算”按钮时调用
函数过程fact(n),计算出n的阶乘。
图8.48为函数过程fact添加参数和函数体代码
图8.49修改按钮“开始计算”的单击事件代码
(利用函数过程调用语句)
8.7 程序的调试与出错处理
 8.7.1 程序的错误类型
 1. 编译错误
 2. 运行错误
 3. 逻辑错误
 8.7.2 出错处理
 编译错误可以按照正确的语法修改程序。
 逻辑错误要对算法进行重新设计。
 运行错误的发生有时是有条件的。
 8.7.3 VBA程序调试
 1. 调试工具
 2. 设置断点
 3. 单步跟踪
 4. 设置监视点
【例8.15】使用调试工具调试例题8.10创建的窗体“利用函数调用求n的阶乘”。要
求单步调试“开始计算”按钮中的每条语句,并监视运行过程中各个变量的变化情况。
断点设置情况如图8.58所示。
图8.59 窗体“利用函数调用求n的阶乘”的运行界面
图8.60 程序进入调试界面后的VBE窗口情况
图8.61 程序执行函数调用语句后切换了模块
(进入函数过程)
图8.58断点设置参考图
图8.62 程序执行完函数调用过程后返回按钮单
击事件过程中
【例8.11】设计一个宏,如图8.50所示,使用命令OpenTable打开表“学生成绩表”
(但该表并不存在),为宏取名“打开一个不存在的表”,观察该宏运行时的错误提示。
【例8.12】排除窗体“利用过程调用求1到n的累加和”设计过程中的一处运行错误。
图8.53运行窗体时弹出的错误提示(类型不匹配)
图8.50宏“打开一个不存在的表”的设计窗口
图8.51找不到对象“学生成
绩表”的错误提示
图8.52本次“操作失败”的详细报告
图8.54单击“调试”按钮,系统会自动打开并追踪到错误所在行
【例8.13】排除窗体“利用函数调用求n的阶乘”设计过程中的一处编译错误。
图8.55运行窗体“利用函数调用求n的阶乘”时系统给出的编译错误提示
根据给出的编译错误提示:“Loop 没有 Do”,用户很容易联想到错误出在循环语句配
对上。For应该和Next配对,Do While 和Loop配对,只要按照一种循环语句格式修改
即可,例如此处可将Loop改为Next i。
根据图8.53中给出“类型不
匹配”的错误提示,以及图
8.54给出的错误位置,很容
易找出错误原因:变量n为
整型数据,与字符型数据无
法进行连接运算。只要将变
量n用转换函数Cstr转换为
字符型即可。语句应改为:
MsgBox "1到" + CStr(n) +
"的累加和=" + CStr(sum)