第八章 - 山东工商学院
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数组有45=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)