模块与VBA程序设计_第1页
模块与VBA程序设计_第2页
模块与VBA程序设计_第3页
模块与VBA程序设计_第4页
模块与VBA程序设计_第5页
已阅读5页,还剩177页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7.1模块基本概念7.2VBA编辑环境7.3VBA程序设计基础7.4VBA的输入与输出7.5程序流程控制结构7.6面向对象程序设计的基本概念7.7过程调用和参数传递7.8变量的作用域和生存周期7.9VBA常用操作7.10VBA事件处理7.11VBA程序运行错误处理第7章模块与VBA程序设计模块是由VBA声明和一个或多个过程组成的单元。组成模块的基础是过程,VBA过程通常分为子过程(Sub过程)和函数过程(Function过程)。每个过程是一个独立的程序段,实现某个特定的功能。在Access中,通过模块的组织和VBA的代码设计么可以提高Access数据库的应用处理能力,解决复杂问题。模块分为标准模块和类模块两种类型。窗体和报表的特定模块一般称为窗体模块和报表模块,属于类模块。标准模块是指与窗体和报表等对象无关的程序模块,在Access中是一个独立的模块对象。7.1模块基本概念1.标准模块在标准模块中,放置的是Access数据库对象或代码使用的公共过程,这些过程不与任何对象相关联。如果想使设计的VBA过程具有在多个模块中使用的通用性,就把它放在标准模块中。在标准模块中定义的变量和过程可供整个数据库使用。2.类模块类模块以类的形式对模块进行了封装。Access的类模块有3种基本类型:窗体模块、报表模块和自定义模块。窗体模块中包含窗体或其上控件的事件所触发的所有事件过程代码,这些过程的运行用于响应窗体中的事件。使用事件过程可以控制窗体的行为及它们对用户操作的响应。报表模块与窗体模块类似,不同之处是过程响应和控制的是报表的行为。自定义模块允许用户自定义所需的对象、属性和方法。7.1模块基本概念Access以VisualBasic编辑器(VisualBasicEditor,VBE)作为VBA的开发环境。在VBE中,集成了编辑、编译和调试等功能于一体。在VBE中可以编辑已有过程,也可以创建新过程。1.启动VBE

启动VBE的方法有很多种,常用的方法有3种形式。(1)直接进入VBE

在数据库中,单击“数据库工具”选项卡,然后在“宏”组中单击“VisualBasic”按钮,如图7.1所示。7.2VBA编辑环境图7.1数据库工具选项卡(2)创建模块进入VBE

在数据库中,单击“创建”选项卡下“宏与代码”组中的“VisualBasic”按钮,如图7.2所示。(3)通过窗体或报表对象的设计进入VBE

通过窗体或报表对象的设计进入VBE有两种方法。一种是通过控件的事件响应进入VBE,如图7.3所示。另一种是通过窗体或报表设计试图“工具”组中的“查看代码”按钮,如图7.4所示。7.2VBA编辑环境图7.2“创建”选项卡7.2VBA编辑环境

图7.3代码生成器图7.4查看代码

启动VBE后,屏幕出现VBE窗口,这个就是VBA的开发环境,如图7.5所示。7.2VBA编辑环境图7.5VBE窗口2.VBE窗口组成VBE中的窗口主要由代码窗口、工程资源管理器窗口、属性窗口和立即窗口组成,另外还有对象窗口、对象浏览器、本地窗口和监视窗口等。可以通过VBE中“视图”菜单下的相应命令来控制这些窗口的显示。(1)VBE主窗口VBE主窗口有菜单栏和工具栏。VBE的菜单栏包括文件、编辑、视图、插入、调试、运行、工具、外接程序、窗口和帮助等10个菜单选项,其中包括了各种操作命令。

默认情况下,VBE窗口中显示“标准”工具栏,如需显示其他工具栏,可以通过“视图”菜单的“工具栏”选项来实现。7.2VBA编辑环境(2)代码窗口

在代码窗口中用于输入和编辑VBA程序代码。可以同时打开多个代码窗口来查看各个模块的代码,而且可以方便的在各个代码窗口之间进行复制和粘贴。(3)立即窗口

立即窗口常用于在程序调试期间输出中间结果及帮助用户在中断模式下测试表达式的值等,在可在立即窗口中直接输入VBA命令并按Enter键来执行该命令。(4)属性窗口

属性窗口列出了所选对象的各种属性,可按字母和分类排序来查看属性。可以直接在属性窗口中对属性进行编辑,还可以在代码窗口中用VBA语句设置对象的属性。7.2VBA编辑环境(5)工程资源管理器窗口

工程资源管理器窗口列出了在应用程序中用到的模块。使用该窗口,可以在数据库中各个对象之间快速浏览。各个对象以树型图的形式显示在该窗口中,包括Access对象、类模块和标准模块。要查看各个模块代码,只需在窗口中双击对象即可。(6)本地窗口

本地窗口用于查看正在运行的过程中的对象、变量、数组的信息,通常在调试代码过程中或者使用Stop语句中断程序运行后通过此窗口查看结果。(7)监视窗口

监视窗口的功能有3个。一是监视某个变量值的变化过程,二是监视任意表达式的值,三是监视表达式的值等于某个值时的中断过程。7.2VBA编辑环境7.3.1程序语句书写规定7.3.2标准数据类型7.3.3变量与常量7.3.4函数和运算符7.3VBA程序设计基础1.语句书写规定

通常一行书写一个程序句子。语句较长,一行写不完时,通常在本行的末尾使用续行符“_”将语句写在下一行。可以使用冒号“:”将一行中的多个句子隔开。当输入的一行语句有错误时,VBE会以红色文本显示(有时伴有错误信息出现)。2.注释语句

一个好的程序应该有注释语句,这对程序的维护有很大的好处。注释语句在计算机中并不执行,给程序加上注释是为了增加程序的可读性。

在VBA程序中,注释语句的书写格式有以下两种。使用Rem关键字,格式:Rem注释语句。使用单引号“’”,格式:’注释语句。7.3.1程序语句书写规定3.采用缩进格式书写程序

采用缩进格式书写程序可以使程序结构更加清晰,增加程序的可读性,便于程序维护。可以利用“编辑”菜单下的“缩进”或“凸出”命令进行设置。7.3.1程序语句书写规定

数据类型表明了数据在内存中的存储形式以及能参与的运算。VBA中的数据类型分为两大类:标准数据类型和用户自定义数据类型。1.标准数据类型VBA支持多种数据类型,表7.1列出了各个数据类型的标识符、存储空间以及取值范围。7.3.2标准数据类型7.3.2标准数据类型数据类型类型标识符号存储空间取值范围整数Integer%2字节-32768~32767长整数Long&4字节-2147483648~2147483647单精度Single!4字节负数-3.402823E38~-1.401298E-45正数1.401298E-45~3.402823E38双精度Double#8字节负数-1.79769313486232E308~-4.94065645841247E-324正数4.94065645841247E-324~1.79769313486232E308货币Currency@8字节-922337203685477.5808~92337203685477.5807字符串String﹩字符串长度0~65500个字符布尔型Boolean

2字节True或False日期型Date

1字节100年1月1日~9999年12月31日变体类型Variant

不定日期/数字/字符串表7.1

数据类型针对部分数据类型作如下说明。(1)布尔型数据布尔型数据只有两个值:True和False。布尔型数据转换为其他数据类型时,True转换为-1,False转换为0。其他类型数据转换为布尔型时,0转换为False,非0值转换为True。(2)日期型数据日期/时间型数据前后必须用“#”号括起来。例如,#2014-5-27#是一个日期数据。(3)字符串型数据字符串型数据前后必须用双引号“”括起来。例如,“2014-5-27”是一个字符串数据,#2014-5-27#是一个日期数据;“True”是一个字符串数据,True

是一个布尔数据;“100”是一个字符串数据,100是一个数字数据。

7.3.2标准数据类型(4)变体类型数据

变体类型是一种特殊的数据类型,具有很大的灵活性,可以表示多种数据类型,其最终的数据类型由赋予它的值来确定。如果在变量声明时没有指定数据类型,默认为变体类型。7.3.2标准数据类型2.用户自定义数据类型

在实际程序设计中,VBA允许用户自己来定义数据类型。用户自定义数据类型可包含一个或多个标准数据类型。用户自定义数据类型使用Type…EndType关键字定义。例如,定义一个学生信息数据类型TypeStuTypeStuNameAsStringStuSexAsStringStuAgeAsIntegerStuBirthDayAsDateEndType7.3.2标准数据类型声明和使用变量的形式如下:DimStudentASStuTypeStudent.StuName=”陈辉”Student.StuSex=”男”Student.StuAge=22Student.StuBirthDay=#1992-7-8#

在上述的例子中,定义了一个用户自定义数据类型StuType,在StuType中定义了4个分量StuName、StuSex、StuAge和StuBirthDay,并分别为这4个分量指定了标准数据类型。在声明变量后,分别对这4个分量进行了赋值。7.3.2标准数据类型1.常量VBA中的常量包括直接常量、符号常量和系统常量。(1)直接常量不同类型的常量有不同的表示方法,使用时遵循相应的语法规则。常用的常量有以下4种。①数字型常量,包括正数、负数、整数和小数等。②字符串常量,用双引号括起来的字符序列。③日期型常量,用#号括起来的可以表示日期/时间的字符。④布尔型常量,True和False两个值。7.3.3变量与常量(2)符号常量

符号常量用标识符来表示某个常量,用户一旦定义了符号常量,在以后的程序中不能用赋值语句来改变它们的值,否则,在程序运行时将出现错误。

标识符是用来表示用户所定义的常量、变量和过程的符号。在VBA中,标识符由字母、数字和下划线组成,只能以字母和下划线开头。此外,不能使用VBA中的关键字作为标识符,标识符不区分大小写。VBA中声明符号常量的语法格式:Const符号常量名称=常量值例如ConstPI=3.1415926ConstMyDate=#1992-8-6#ConstNDate=MyDate+5ConstMyString=“Howdoyoudo!”7.3.3变量与常量(3)系统常量

系统常量是VBA预先定义好的常量,在程序设计时,用户可以直接使用。VBA中常用系统常量包括True、False、Yes、No、On、Off和Null等。可在对象浏览器窗口中查看更多的系统常量。7.3.3变量与常量2.变量

变量是指程序运行时值会发生变化的数据。在VBA中,一个变量在内存中必须被分配一个存储空间,用来存放变量所表示数据。程序执行时,通过变量名称来访问变量所对应的存储空间。(1)变量的命名规则

为了区别存储不同数据的变量,需要对变量进行命名。变量的命名规则同标识符的命名规则一致,只能由字母、数字和下划线组成,只能由字母和下划线开头,不能和关键字重名。(2)变量的声明

变量声明就是定义变量的名称及其所对应的数据类型,使系统为其分配存储空间。VBA中声明变量有两种形式:显示声明和隐含声明。7.3.3变量与常量①显示声明:在变量声明中明确指定变量名称及类型。语句格式:Dim变量名称As数据类型例如:DimxAsInteger'声明一个变量x为整数类型 DimyAsSingle'声明一个变量y为单精度类型变量声明中的数据类型,也可以用类型符号来表示。例如:Dimx%'声明一个变量x为整数类型Dimy!'声明一个变量y为单精度类型可以在一个声明语句中声明多个变量。例如:DimxAsInteger,y!'声明变量x为整数类型,变量y为单精度类型。7.3.3变量与常量②隐含声明:没有直接定义变量或通过一个值指定给变量名。在这种情况下,变量默认为变体类型。例如:Dimx,y'变量x和y为变体类型m=125'变量m为变体类型注意,在上例中变量m的值125可以认为是整数125、小数125.0和字符串“125”。

虽然隐含声明在程序设计时很方便,但是,在程序运行时可能会产生严重的错误。因此,在程序设计时应养成良好的习惯,对变量应先声明后使用。在VBA中提供了OptionExplicit语句用于对变量强制要求作显示声明。7.3.3变量与常量(3)变量的赋值

对变量进行声明后,变量就代表了内存中的某个存储空间。在程序运行时,可以在该存储空间中存入数据。这个过程称为变量的赋值。语句格式:

变量名=常量或表达式例如:DimxAsIntegerx=125

程序运行时,在内存中分配一个存储空间给变量x,然后将125存入到变量x所对应的内存空间中。如图7.6所示。7.3.3变量与常量图7.6变量x所对应的存储空间3.数组

具有相同数据类型数据的集合称为一个数组。数组中的单个数据称为数组元素。每一个数组元素也称为数组元素变量。和变量一样,数组应先声明和使用。数组声明包括定义数组名称、类型、维数和各维的大小。数组的声明也是使用Dim…As…语句来实现,其语句格式:Dim数组名称([下标下限to]下标上限[,[下标下限to]下标上限]…)As数据类型

其中,下标表示数组元素在数组里的位置或序号。下标默认情况下从0开始。下标下限指数组中数组元素序号或位置的最小值,下标上限指数组中数组元素序号或位置的最大值。数组定义后,数组名代表所有数组元素,数组名加上下标表示一个数组元素,可以和普通变量等价使用。7.3.3变量与常量例如:DimA(1to5)AsInteger语句定义了一个整型数组A,数组中下标下限为1,上限为5,数组A中共有5个整数数据。单个数组元素表示为A(1)、A(2)、A(3)、A(4)、A(5)。DimA(5)AsString语句定义了一个字符串数组A,数组定义中没有给出下标下限,则下标下限默认为0,则数组中共有6个字符串数据。在VBA中也支持多维数组。在数组定义中加入多个下标,并以逗号隔开,由此来建立多维数组。多维数组最多可以定义60维。下面例子中定义了二维数组和三维数组。DimA(5,5)AsInteger语句定义了一个二维数组A,数组A中共有6×6=36个数组元素。二维数组的单个数组元素可以表示为A(0)(0)、A(0)(1)等。DimA(5,5,5)AsInteger语句定义了一个三维数组,数组A中共有6×6×6=216个数组元素。三维数组的单个数组元素可以表示为A(0)(0)(0)、A(0)(0)(1)等。7.3.3变量与常量

在VBA中,定义了近百个内置函数,可以方便的完成许多操作。根据内置函数的功能,可以将其分为算术函数、字符串函数、日期/时间函数、类型转换函数和验证函数等。1.常用标准函数(1)算术函数算术函数完成数学计算功能,常用算术函数如表7.2所示。7.3.4函数和运算符7.3.4函数和运算符函数名功能说明示例结果Abs(数值表达式)返回数值表达式的绝对值Abs(-7)7Cos(数值表达式)返回数值表达式的余弦值Cos(3.1415926)-1Sin(数值表达式)返回数值表达式的正弦值Sin(0)0Tan(数值表达式)返回数值表达式的正切值Tan(3.14/4)1Exp(数值表达式)返回e数值表达式的值Exp(1)2.718Log(数值表达式)返回数值表达式的自然对数Log(2.718)1Int(数值表达式)返回不大于数值表达式的最大整数Int(4.5)Int(-4.5)3-5Fix(数值表达式)返回数值表达式的整数部分Fix(4.5)Fix(-4.5)4-4Rnd(数值表达式)返回0~1之间的随机数Rnd产生0~1之间的随机数Sgn(数值表达式)返回-1,0,1Sgn(-6)Sgn(6)Sgn(0)-110Sqr(数值表达式)返回数值表达式的平方根Sqr(25)5Round(数值表达式,n)对数值表达式四舍五入保留n位小数Round(3.567,1)Round(3.567,0)3.64表7.2

常用算术函数(2)字符串函数VBA中常用字符串函数如表7.3所示。7.3.4函数和运算符函数名功能说明示例结果InStr(字符串表达式1,字符串表达式2)在字符串表达式1中找字符串表达式2第一次出现的位置InStr("ABCDAB","AB")1InStrRev(字符串表达式1,字符串表达式2)在字符串表达式1中找字符串表达式2最后一次出现的位置InStrRev("ABCDAB","AB")5Len(字符串表达式)计算字符串长度Len("计算机")3Left(字符串表达式,n)从字符串表达式左侧第一个字符开始向右边截取n个字符Left("ABCDEF",2)"AB"Right(字符串表达式,n)截取字符串表达式右侧的n个字符Right("ABCDEF",2)"EF"Mid(字符串表达式,m,n)从字符串表达式的第M个字符开始向右边截取n个字符Mid("ABCDEF",2,3)"BCD"UCase(字符串表达式)将字符串表达式中的所有小写字母转换成大写UCase("aBcdeF")"ABCDEF"LCase(字符串表达式)将字符串表达式中的所有大写字母转换成小写LCase("ABCdeF")"abcdef"LTrim(字符串表达式)去掉字符串表达式前导空格LTrim("ABC")"ABC"RTrim(字符串表达式)去掉字符串表达式尾部空格RTrim("ABC")"ABC"Trim(字符串表达式)去掉字符串表达式中间空格Trim("ABC")"ABC"Space(n)生成n个空格字符Space(3)""表7.3常用字符串函数(3)日期/时间函数常用日期/时间函数如表7.4所示。7.3.4函数和运算符函数名功能说明示例结果Date()返回当前系统的日期Date()#2014-5-29#Time()返回当前系统的时间Time()#13:35:40#Now()返回当前系统的日期和时间Now()#2014-5-2913:35:40#Year(日期表达式)返回日期表达式年的值Year(#2014-5-29#)2014Month(日期表达式)返回日期表达式月的值Month(#2014-5-29#)5Day(日期表达式)返回日期表达式日的值Day(#2014-5-29#)29WeekDay(日期表达式)返回日期表达式为星期几WeekDay(#2014-5-29#)3Hour(时间表达式)返回时间表达式小时的值Hour(#13:35:40#)13Minute(时间表达式)返回时间表达式分钟的值Minute(#13:35:40#)35Second(时间表达式)返回时间表达式秒的值Second(#13:35:40#)40DateAdd(时间间隔,n,日期表达式)对日期表达式增加或减少固定的时间间隔DateAdd("yyyy",2,#2014-5-29#)#2016-5-29#DateDiff(时间间隔,日期表达式1,日期表达式2)返回两个日期表达式的时间间隔DateDiff("yyyy",#2013-6-7#,#2014-5-29#)1DatePart(间隔类型,日期表达式)返回日期表达式中按照时间间隔类型所指定的时间部分值DatePart("m",#2014-5-29#)5DateSerial(数值表达式1,数值表达式2,数值表达式3)返回包含指定年月日的日期DateSerial(2014,5,29)#2014-5-29#表7.4常用日期/时间函数(4)类型转换函数常用类型转换函数如表7.5所示。7.3.4函数和运算符函数名功能说明示例结果Asc(字符串表达式)将字符串的首字符转换为对应的ASCII码值Asc("abcde")97Chr(ASCII码值)将ASCII码值转换为对应的字符Chr(70)“F”Str(数值表达式)将数值转换为字符串Str(100)“100”Val(字符串表达式)将字符串转换为数值Val(“100”)100表7.5常用类型转换函数(5)验证函数常用验证函数如表7.6所示。7.3.4函数和运算符函数名功能说明示例结果IsNumeric(表达式)测试表达式的结果是否为数值IsNumeric(7)TrueIsDate(表达式)测试表达式的结果是否为日期IsDate(Date())TrueIsNull(表达式)测试表达式的结果是否为空值IsNull(Null)TrueIsArray(表达式)测试表达式的结果是否为数组DimA(5)AsIntegerIsArray(A)TrueIsEmpty(变量)测试变量是已经初始化DimaAsIntegerIsEmpty(a)True表7.6常用验证函数2.运算符

在VBA中提供了多种运算符来构建各种表达式。表达式用来进行运算,由常量、变量、函数和运算符构成。VBA中的运算符包括算术运算符、关系运算符、逻辑运算符和连接运算符。(1)算术运算符

算术运算是指传统的数学运算,例如,加、减、乘、除以及乘方等。表7.7列出了VBA中的算术运算符。7.3.4函数和运算符运算符功能运算符功能^乘方\整除-负号Mod求余数*乘法+加法/除法-减法表7.7算术运算符

说明:算术运算符的优先级,乘方>负号>乘法和除法>整除>求余>加法和减法。对于整除(\)运算。用两个数作除法,结果只保留整数部分,舍去小数部分,不做四舍五入运算。如果整除运算的被除数和除数包含小数部分,则直接舍去小数部分后再作运算。对于求余运算(Mod)。用两个数作除法,结果为商的余数。如果求余运算的被除数和除数包含小数部分,则四舍五入取整数后再作运算。例如:3^2=93Mod2=13/2=1.53\2=17.3.4函数和运算符(2)关系运算符

关系运算符所组成的表达式称为关系表达式,其运算结果为布尔型数据。当关系表达式所表示的关系成立时,结果为True,否则为False。关系表达式通常用作程序语句跳转的条件。VBA中关系运算符如表7.8所示。7.3.4函数和运算符运算符功能运算符功能>

大于<=小于或等于>=大于或等于=等于<

小于<>

不等于表7.8关系运算符

说明:各个关系运算符间的优先级一样,按从左至右的顺序进行运算,有括号先计算括号中的表达式。字符串数据进行关系运算时,依据字符所对应的ASCII码值进行比较。ASCII码值大的字符串大,当第1个字符相等时,比较第2个字符,直到比较完所有字符为止。例如:4*5=20结果为True"a">="A"结果为True"abcd"="ab"结果为False8\2>=10结果为False7.3.4函数和运算符(3)逻辑运算符

逻辑运算符可以表示复杂的逻辑关系。逻辑运算符所组成的表达式结果是布尔型数据。VBA中常见逻辑运算符如表7.9所示。7.3.4函数和运算符运算符功能Not非运算And与运算Or或运算表7.9逻辑运算符

说明:逻辑运算符的优先级,非运算>与运算>或运算。逻辑运算的运算规则如表7.10所示。7.3.4函数和运算符ABAAndBAOrBAXorBNotATrueTrueTrueTrueFalseFalseTrueFalseFalseTrueTrueFalseFalseTrueFalseTrueTrueTrueFalseFalseFalseFalseFalseTrue表7.10逻辑运算规则例如:15>=4And3>=4结果为False15>=4Or3>=4结果为TrueNot(3=4)结果为True(4)连接运算符

连接运算符可以将两个或多个字符串连接成一个字符串。VBA中的连接运算符有“+”和“&”两种。“+”运算要求连接的两个数据都是字符型时,才能将两个字符串连接成一个新字符串。“&”运算可以做强制连接,连接的两个数据可以是字符型也可以不是字符型。当连接数据不是字符型时,可以将其转换成字符型再进行连接。例如:"VBA"+"程序设计"结果为"VBA程序设计""Access"+"数据库"结果为"Access数据库""5+5="&5+5结果为"5+5=10"7.3.4函数和运算符任何一个程序都离不开输入和输出。程序需要执行的数据一般是通过输入确定的,程序运行后的结果也需要以某种方式输出。在VBA中提供了图形化的输入函数InputBox和输出函数MsgBox。另外,Print方法也可以实现输出,在窗体中也可以利用文本框等控件实现输入和输出功能。7.4VBA的输入与输出1.InputBox函数InputBox函数用于显示一个输入对话框。在对话框中显示提示信息、等待用户输入信息的文本框以及可以单击的命令按钮。在用户输入信息并单击命令按钮后,函数返回一个字符串类型的数据。InputBox的使用格式:

InputBox(Prompt,[Title],[Default],[XPos],[YPos])相关参数说明如下。Prompt指定在对话中显示的提示信息,不能省略。Title指定对话框标题栏显示的信息,可以省略。如果省略Title,则把应用程序名放入标题栏中。Default在用户向输入文本框输入信息之前的默认信息,可以省略。如果省略Default,则输入文本框为空。XPos指定对话框的左边距离屏幕左边的水平距离,可以省略。如果省略XPos,则输入对话框水平方向居中。7.4VBA的输入与输出YPos指定对话框的上边距离屏幕上边的垂直距离,可以省略。如果省略YPos,则输入对话框垂直方向居中。在实际应用中,可以将用户输入的信息赋值给一个变量。例如:StrName=InputBox(“请输入姓名”,“信息”)将用户的输入信息赋值给变量StrName,其执行结果如图7.7所示。7.4VBA的输入与输出图7.7InputBox对话框2.MsgBox函数

消息框函数MsgBox用于显示一个对话框,并在对话框中显示提示信息。可以将程序的运行结果作为消息框函数中的提示信息输出。在消息框中显示提示信息后,用户单击命令按钮,返回一个整型值告诉用户单击的是哪一个按钮。MsgBox的使用格式:MsgBoxPrompt[,Buttons][,title]相关参数说明如下。Prompt指定在对话中显示的提示信息,不能省略。Buttons指定按钮的显示数量及类型、图标样式以及默认按钮选项,可以省略。如果省略Buttons,默认情况下显示一个“确定”按钮。Buttons参数各个取值如表7.11所示。Title指定对话框标题栏显示的信息,可以省略。如果省略Title,则把应用程序名放入标题栏中。7.4VBA的输入与输出7.4VBA的输入与输出分类常量值功能说明按钮数量及类型VbOkOnly0只显示确定按钮VbOkCancel1显示确定和取消按钮VbAbortRetryIngore2显示中止、重试和忽略按钮VbYesNoCancel3显示是、否和取消按钮VbYesNo4显示是和否按钮VbRetryCancel5显示重试和取消按钮图标类型VbCritical16显示

图标VbQuestion32显示

图标VbExclamation48显示

图标VbInformation64显示

图标默认按钮VbDefaultButton10第1个按钮为默认按钮VbDefaultButton2256第2个按钮为默认按钮VbDefaultButton3512第3个按钮为默认按钮VbDefaultButton4768第4个按钮为默认按钮表7.11MsgBox函数Bottons取值

在用户单击命令按钮后,消息框函数会产生一个返回值。返回值及含义如表7.12所示。7.4VBA的输入与输出常量值说明VbOk1确定VbCancel2取消VbAbort3中止VbRetry4重试VbIngore5忽略VbYes6是VbNo7否表7.12MsgBox函数的返回值及含义图7.8所示的是消息框函数MsgBox的一个例子。语句:MsgBox"数据处理中!",vbAbortRetryIgnore+vbExclamation+vbDefaultButton3,"信息"7.4VBA的输入与输出图7.8MsgBox消息框7.5.1顺序结构7.5.2选择结构7.5.3循环结构7.5.4标号和GoTo语句7.5程序流程控制结构

顺序结构是在程序执行时,依据程序语句的书写顺序自上向下依次执行。顺序结构的执行流程如图7.9所示。7.5.1顺序结构图7.9顺序结构流程图在图7.9中,矩形表示程序语句,箭头表示程序的执行方向。在该图中先执行语句A,语句A执行完后接着执行语句B。例如:

DimAgeAsIntegerAge=23

程序中首先定义一个整型变量Age,然后对其赋值为23。例7-1有如下程序段:DimD1AsDateDimD2AsDateD1=#2013-12-25#D2=#2014-1-6#MsgBoxDateDiff("ww",D1,D2)

程序执行后,求消息框中的显示结果。程序说明:本程序中定义了2个日期变量D1和D2,D1的值为#2013-12-25#,D2的值为#2014-1-6#,DateDiff求2个日期的时间间隔值,间隔类型为周。程序结果为在消息框中显示2。7.5.1顺序结构例7-2有如下程序段:a=Instr(4,"WellcometoBeijing","e")b=Sgn(5>=4)c=a+bMsgBoxc程序运行后,求变量c的值。程序说明:本程序中有3个变量a、b、c。Instr(4,"WellcometoBeijing","e")的含义是从“WellcometoBeijing”字符串的第4个字符开始找字符“e”第一次出的位置,它在第8个位置出现,因此,a的值8。Sgn函数返回表达式的符号,这里5>=4结果为True,可以将其转换为-1,因此b的值为-1。c的值由a+b得到,因此,c的值为7。7.5.1顺序结构

选择结构根据条件成立与否来判断语句是否执行。根据可选择的语句数量不同,选择结构又分为单选择结构、双选择结构和多选择结构。1.单选择结构

单选择结构中只有一个语句可供执行。语句结构:If条件表达式

Then条件表达式成立时要执行的语句块EndIf

执行时,先判断条件,条件成立,执行语句;条件不成立,不执行语句。单选择结构的流程图如图7.10所示。7.5.2选择结构7.5.2选择结构图7.10单选择结构流程图例7-3根据系统当前时间,在屏幕上用消息框显示“下午好!”。程序代码如下:

SubS1()IfHour(Time())>=12And(Time())<=18ThenMsgBox“下午好!” EndSub程序说明:Hour(Time())对当前计算机上的时间取小时的值,当小时的值在12到18之间时,屏幕上出现一个消息框,消息框中显示“下午好!”。2.双选择结构

双选择结构中有两条语句可供选择执行。语句结构:

If条件表达式

Then条件表达式成立时要执行的语句块1Else条件表达式不成立时要执行的语句块2EndIf

执行时,先判断条件,条件成立,执行语句块1;条件不成立,执行语句块2。双选择结构的流程图如图7.11所示。7.5.2选择结构7.5.2选择结构图7.11双选择结构流程图例7-4对例7-3中的程序代码进行修改,如果系统当前时间在12到18之间,在屏幕上用消息框显示“下午好!”,否则,消息框中显示“欢迎下次光临!”。程序代码如下:SubS2()IfHour(Time())>=12And(Time())<=18ThenMsgBox“下午好!”ElseMsgBox“欢迎下次光临!” EndSub

程序说明:Hour(Time())对当前计算机上的时间取小时的值,当小时的值在12到18之间时,屏幕上出现一个消息框,消息框中显示“下午好!”,如果当前时间小时的值没有在12到18之间,则消息框上显示“欢迎下次光临!”。3.多选择结构

多选择结构中有多条语句可供选择执行。其结构有两种。一种用If语句实现,另一种用Select语句实现。(1)If语句结构:

If条件表达式1Then条件表达式1成立时要执行的语句块1ElseIf条件表达式2Then条件表达式2成立时要执行的语句块2

ElseIf条件表达式3Then条件表达式3成立时要执行的语句块3

……

Else语句块n+1EndIf执行时,先判断条件表达式1,条件表达式1成立,执行语句块1;条件表达式1不成立并且条件表达式2成立,执行句块2;条件表达式1与条件表达式2都不成立并且条件表达式3成立,执行语句块3……,以此类推,当前面n个条件表达式都不成立时,执行语句块n+1。If多选择结构的流程图如图7.12所示。7.5.2选择结构7.5.2选择结构图7.12If多选择结构流程图例7-5对例7-4中的程序代码进行修改,如果系统当前时间在8到12之间,在屏幕上用消息框显示“上午好!”,当系统时间在12到18之间,消息框中显示“下午好!”,否则显示“欢迎下次光临!”。程序代码如下:SubS3()IfHour(Time())>=8And(Time())<12ThenMsgBox“上午好!”ElseIfHour(Time())>=12And(Time())<=18MsgBox“下午好!”ElseMsgBox“欢迎下次光临!” EndSub程序说明:Hour(Time())对当前计算机上的时间取小时的值,当小时的值在8到12之间时,屏幕上出现一个消息框,消息框中显示“上午好!”;如果当前时间小时的值在12到18之间时,消息框显示“下午好!”;如果当前时间即没有在8到11之间也没有12到18之间时,则消息框显示“欢迎下次光临!”。7.5.2选择结构(2)Select语句结构:

SelectCase表达式

Case表达式1

表达式的值与表达式1的值相等时执行的语句块1

Case表达式2To表达式3

表达式的值在表达式2的值和表达式3的值之间时执行的语句块2

CaseIs关系运算符表达式4

表达式的值与表达式4的值之间满足关系运算为真时执行的语句块

……

CaseElse

以上情况均不符合时执行的语句块n+1EndSelect7.5.2选择结构

执行时,首先计算表达式的值。接下来先判断表达式的值与表达式1的值是否相等,如相等,执行语句块1;如不相等,判断表达式的值是否在表达式2的值和表达式3的值之间,如匹配成功,执行语句块2;如匹配不成功,判断表达式的值与表达式4的值之间是否满足关系运算,如满足关系运算,执行语句块3;如不满足,则继续匹配下一表达式,依次类推;当表达式与Case后的条件匹配都不成功时,执行语句块n+1。Select多选择结构的流程图如图7.13所示。7.5.2选择结构7.5.2选择结构图7.13Select多选择结构流程图例7-6使用Select结构,完成例7-3的功能。程序代码如下:

SubS4()SelectCaseHour(Time())Case8to11MsgBox“上午好!”Case12to18MsgBox“下午好!”CaseElseMsgBox“欢迎下次光临!”EndSelectEndSub程序说明:首先计算Hour(Time())求出当前系统时间小时的值,当小时的值在8到11之间时,屏幕上出现一个消息框,消息框中显示“上午好!”;如果当前时间小时的值在12到18之间时,消息框显示“下午好!”;如果当前时间即没有在8到11之间也没有12到18之间时,则消息框显示“欢迎下次光临!”。7.5.2选择结构例7-7已知下列程序段,求变量z的值。x=65y=567SelectCasey\10Case0z=x*10+yCase1to9z=x*100+yCase10to99z=x*1000+yEndSelect程序说明:首先计算出表达式y\10的值为56,然后拿表达式的值和下面Case后的条件式进行匹配,执行语句z=65*1000+567,程序结果为65567。7.5.2选择结构4.选择函数

除了上述的选择结构外,VBA中还提供了3个函数来完成选择功能。(1)IIf函数函数格式:IIf(条件表达式,表达式1,表达式2)函数执行时,首先判断条件表达式,条件表达式为真,函数返回表达式1;条件表达式为假,函数返回表达式2。例如:将变量x,y中的最大值赋给变量Max。Max=IIf(x>y,x,y)7.5.2选择结构(2)Switch函数函数格式:Switch(条件表达式1,表达式1,条件表达式2,表达式2……,条件表达式n,表达式n)函数执行时,首先判断条件表达式1,如果条件表达式1成立,函数返回表达式1;如果条件表达式1不成立并且条件表达式2成立,函数返回表达式2;依次类推,如果条件表达式n成立,函数返回表达式n。如果条件表达式n不成立,函数返回无效值(Null)。例如,根据变量x的值来给变量y赋值。y=Switch(x>0,1,x=0,0,x<0,-1)7.5.2选择结构(3)Choose函数函数格式:Choose(索引式,选项1,选项2,选项3,……,选项n)函数执行时,首先计算索引式的值。索引式的值为1,函数返回选项1;索引式的值为2,函数返回选项2;依此类推,索引式的值为n,函数返回选项n。如果索引式的值为n+1,函数返回无效值(Null)。例如,根据变量x的值来给变量y赋值。y=Choose(x,z,z+5,z-5)7.5.2选择结构循环结构可以将程序中的一个语句或多个语句重复执行有限次。要使程序中的语句重复执行有限次,可以通过条件来进行限制。VBA中提供了6种常用的循环结构,分别是For……Next结构、DoWhile……Loop结构、DoUntil……Loop结构、Do……LoopWhile结构、Do……LoopUntil结构、While……Wend结构。7.5.3循环结构1.For语句实现循环For语句能够事先确定程序语句的循环次数,属于计数型循环。其语句格式:For循环变量=初值to终值[Step步长值]

循环体Next循环变量For语句的执行过程根据步长值分成3种情况:步长值>0、步长值<0、步长值=0。(1)步长值>0时执行步骤如下。①循环变量取初值。②循环变量值和终值进行比较,确定循环是否进行;若循环变量值小于或等于终值,循环继续,执行步骤③;若循环变量值大于终值,循环结束,退出循环。③执行循环体。④循环变量值增加步长值(循环变量=循环变量+步长值),程序跳转至②。For语句步长值>0时流程图如图7.14所示。7.5.3循环结构7.5.3循环结构图7.14For循环步长值大于0流程图例7-8分析下列程序段中循环结构的运行过程。程序段1:x=0Fora=1to3Step1x=x+1Nexta程序说明:本程序循环结构中循环变量为a,初值为1,终值为3,步长值为1;循环体只有一个句子x=x+1。其执行过程如下所示:①a=1,a<=3成立,执行循环体x=0+1=1,循环变量增加步长值a=1+1=2;②a=2,a<=3成立,执行循环体x=1+1=2,循环变量增加步长值a=1+2=3;③a=3,a<=3成立,执行循环体x=2+1=3,循环变量增加步长值a=3+1=4;④a=4,a<=3不成立,循环结束。分析:在该程序段中,最后变量x的值为3,循环变量a的值为4。循环语句x=x+1重复执行了3次。需要注意的是,只有当循环变量a的值为4时,循环变量值大于终值,循环结束。7.5.3循环结构程序段2:x=0Fora=3to1Step1x=x+1Nexta执行过程如下:a=3,a<=1不成立,循环不执行既结束。分析:在该程序段中,由于循环变量a的值为3大于终值1,循环语句x=x+1没有执行。最后变量x的值为0,循环变量a的值为3。7.5.3循环结构(2)步长值<0时执行步骤如下。①循环变量取初值。②循环变量值和终值进行比较,确定循环是否进行;若循环变量值大于或等于终值,循环继续,执行步骤③;若循环变量值小于终值,循环结束,退出循环。③执行循环体。④循环变量值增加步长值(循环变量=循环变量+步长值),程序跳转至②。For语句步长值>0时流程图如图7.15所示。7.5.3循环结构7.5.3循环结构图7.15For循环步长值小于0流程图例7-9分析下列程序段中循环结构的运行过程。程序段1:x=0Fora=3to1Step-1x=x+1Nexta程序说明:本循环结构中循环变量为a,初值为3,终值为1,步长值为-1;循环体只有一个句子x=x+1。其执行过程如下所示:①a=3,a>=1成立,执行循环体x=0+1=1,循环变量增加步长值a=3+(-1)=2;②a=2,a>=1成立,执行循环体x=1+1=2,循环变量增加步长值a=2+(-1)=1;③a=1,a>=1成立,执行循环体x=2+1=3,循环变量增加步长值a=1+(-1)=0;④a=0,a>=1不成立,循环结束。分析:在该程序段中,最后变量x的值为3,循环变量a的值为0。循环语句x=x+1重复执行了3次。只有当循环变量a的值为0时,循环变量值小于终值,循环结束。7.5.3循环结构程序段2:x=0Fora=1to3Step-1x=x+1Nexta

执行过程如下:a=1,a>=3不成立,循环不执行既结束。分析:在该程序段中,由于循环变量a的值为1小于终值3,循环语句x=x+1没有执行。最后变量x的值为0,循环变量a的值为1。7.5.3循环结构(3)步长值=0时执行步骤如下:若循环变量值小于或等于终值,循环语句执行无限次(死循环);若循环变量值大于终值,循环语句一次也不执行。7.5.3循环结构例7-10分析下列程序段中循环结构的运行过程。程序段1:x=0Fora=1to3Step0x=x+1Nexta程序说明:本循环结构中循环变量为a,初值为1,终值为3,步长值为0;循环体只有一个句子x=x+1。其执行过程如下所示:①a=1,a<=3成立,执行循环体x=0+1=1,循环变量增加步长值a=1+0=1;②a=1,a<=3成立,执行循环体x=1+1=2,循环变量增加步长值a=1+0=1;③a=1,a<=3成立,执行循环体x=2+1=3,循环变量增加步长值a=1+0=1;……分析:在该程序段中,循环变量a的值为1,步长值为0。在每一次循环语句执行完之后,循环变量a都要加上步长值0,循环变量a的值永远为1,a的值永远小于3,循环语句x=x+1会重复执行无限次,程序进入死循环。7.5.3循环结构程序段2:x=0Fora=3to1Step0x=x+1Nexta

执行过程如下:a=3,a<=1不成立,循环不执行既结束。分析:在该程序段中,由于循环变量a的值为3大于终值1,循环语句x=x+1一次也没有执行。最后变量x的值为0,循环变量a的值为3。需要注意的是,步长值可以省略,默认情况下,步长值为1。7.5.3循环结构例7-11已知程序段:s=0Fora=1to15Step2s=s+1a=a*2Nexta当循环结束后,变量a和变量s的值分别为多少?程序说明:本程序中循环变量为a,初值为1,终值为15,步长值为2。循环体中有2个程序语句需要重复执行。执行过程如下:①a=1,a<=15成立,执行循环体s=0+1=1,a=1*2=2,循环变量增加步长值a=2+2=4;②a=4,a<=15成立,执行循环体s=1+1=2,a=4*2=8,循环变量增加步长值a=8+2=10;③a=10,a<=15成立,执行循环体s=2+1=3,a=10*2=20,循环变量增加步长值a=20+2=22;④a=22,a<=15不成立,循环结束。最后,变量s的值为3,变量a的值为22。7.5.3循环结构例7-12有如下VBA程序段,求变量sum的值。sum=0n=0Fora=1to5

x=n/an=n+1sum=sum+xNexta程序说明:本程序中循环变量为a,初值为1,终值为5,步长值默认为1。循环体中有3个程序语句需要重复执行。7.5.3循环结构执行过程如下:①a=1,a<=5成立,执行循环体x=0/1=o,n=0+1=1,sum=0+0=0,循环变量增加步长值a=1+1=2;②a=2,a<=5成立,执行循环体x=1/2,n=1+1=2,sum=0+1/2=1/2循环变量增加步长值a=2+1=3;③a=3,a<=5成立,执行循环体x=2/3,n=2+1=3,sum=1/2+2/3,循环变量增加步长值a=3+1=4;④a=4,a<=5成立,执行循环体x=3/4,n=3+1=4,sum=1/2+2/3+3/4,循环变量增加步长值a=4+1=5;⑤a=5,a<=5成立,执行循环体x=4/5,n=4+1=5,sum=1/2+2/3+3/4+4/5,循环变量增加步长值a=5+1=6;⑥a=6,a<=5不成立,循环结束。最后,变量sum的值为1/2+2/3+3/4+4/5。7.5.3循环结构(4)两层循环结构

在一个循环结构中嵌套一个循环结构就构成了两层循环结构。For语句的两层循环结构格式为:

For循环变量1=初值1to终值1[Step步长值1]For循环变量2=初值2to终值2[Step步长值2]

循环体Next循环变量2Next循环变量17.5.3循环结构

在两层循环的执行过程中,外层循环每执行一次,内层循环就要从头至尾执行一遍。例如:x=0Fora=1to3Step1Forb=1to3Step1x=x+1NextbNexta

在以上的两层循环中,外层循环变量a=1时,内层循环变量b的取值分别为1,2,3,内层循环需要执行3次;外层循环变量a=2时,内层循环同样要执行3次……,以此类推,直到整个两层循环执行完成,循环体x=x+1共执行了3×3=9次。其执行过程如下。7.5.3循环结构①a=1,a<=3成立,b=1,b<=3成立,执行循环体x=0+1=1,循

环变量b增加步长值b=1+1=2; b=2,b<=3成立,执行循环体x=1+1=2,循环

变量b增加步长值b=1+2=3; b=3,b<=3成立,执行循环体x=2+1=3,循环

变量b增加步长值b=3+1=4; b=4,b<=3不成立,内层循环结束;循环变量a增加步长值a=1+1=2。7.5.3循环结构②a=2,a<=3成立,b=1,b<=3成立,执行循环体x=3+1=4,循环

变量b增加步长值b=1+1=2; b=2,b<=3成立,执行循环体x=4+1=5,循环

变量b增加步长值b=1+2=3; b=3,b<=3成立,执行循环体x=5+1=6,循环

变量b增加步长值b=3+1=4; b=4,b<=3不成立,内层循环结束;循环变量a增加步长值a=2+1=3。7.5.3循环结构③a=3,a<=3成立,b=1,b<=3成立,执行循环体x=6+1=7,循环

变量b增加步长值b=1+1=2; b=2,b<=3成立,执行循环体x=7+1=8,循环

变量b增加步长值b=1+2=3; b=3,b<=3成立,执行循环体x=8+1=9,循环

变量b增加步长值b=3+1=4; b=4,b<=3不成立,内层循环结束;循环变量a增加步长值a=2+1=3。④a=4,a<=3不成立,外层循环结束。程序运行结束后,变量x的值为9,变量a的值为4,变量b的值为4。7.5.3循环结构例7-13有如下程序段,求变量c的值。

Dima,b,cAsIntegerFora=1to3Forb=3to1Step-1c=a*bNextbNexta程序说明:本程序为两层循环结构,外层循环变量为a,初值为1,终值为3,步长值默认为1;内层循环变量为b,初值为3,终值为1,步长值为-1;循环体只有一个句子c=a*b。执行过程如下。7.5.3循环结构①a=1,a<=3成立,b=3,b>=1成立,执行循环体c=1*3=3,循

环变量b增加步长值b=3+(-1)=2; b=2,b>=1成立,执行循环体c=1*2=2,循环

变量b增加步长值b=2+(-1)=1; b=1,b>=1成立,执行循环体c=1*1=1,循环

变量b增加步长值b=3+(-1)=0; b=0,b>=1不成立,内层循环结束;循环变量a增加步长值a=1+1=2。7.5.3循环结构②a=2,a<=3成立,b=3,b>=1成立,执行循环体c=2*3=6,循环

变量b增加步长值b=3+(-1)=2; b=2,b>=1成立,执行循环体c=2*2=4,循环

变量b增加步长值b=2+(-1)=1; b=1,b>=1成立,执行循环体c=2*1=2,循环

变量b增加步长值b=3+(-1)=0; b=0,b>=1不成立,内层循环结束;循环变量a增加步长值a=2+1=3。7.5.3循环结构③a=3,a<=3成立,b=3,b>=1成立,执行循环体c=3*3=9,循环

变量b增加步长值b=3+(-1)=2; b=2,b>=1成立,执行循环体c=3*2=6,循环

变量b增加步长值b=2+(-1)=1; b=1,b>=1成立,执行循环体c=3*1=3,循环

变量b增加步长值b=3+(-1)=0; b=0,b>=1不成立,内层循环结束;循环变量a增加步长值a=3+1=4。④a=4,a<=3不成立,外层循环结束。程序运行结束后,变量c的值为3。7.5.3循环结构例7-14有如下VBA程序段,求变量x的值。Dima,b,cAsIntegerFora=1to20Step3x=0Forb=ato20Step3x=x+1NextbNexta程序说明:本程序为两层循环结构,外层循环变量为a,初值为1,终值为20,步长值为2;内层循环变量为b,初值为变量a的值,终值为20,步长值为3;循环体有两个句子x=0,x=x+1。需要注意的是x=0重复执行的次数。执行过程如下:7.5.3循环结构①a=1,a<=20成立,执行循环体x=0,b=1,b<=20成立,执行循环体x=0+1=1,循环变量b增加步长值b=1+3=4; b=4,b<=20成立,执行循环体x=1+1=2,循环变量b增

加步长值b=4+3=7; b=7,b<=20成立,执行循环体x=2+1=3,循环变量b增

加步长值b=7+3=10; b=10,b<=20成立,执行循环体x=3+1=4,循环变量b 增加步长值b=10+3=13; b=13,b<=20成立,执行循环体x=4+1=5,循环变量b 增加步长值b=13+3=16; b=16,b<=20成立,执行循环体x=5+1=6,循环变量b 增加步长值b=16+3=19; b=19,b<=20成立,执行循环体x=6+1=7,循环变量b 增加步长值b=19+3=22; b=22,b<=20不成立,内层循环结束;循环变量a增加步长值a=1+3=4。7.5.3循环结构②a=4,a<=20成立,执行循环体x=0,b=4,b<=20成立,执行循环体x=0+1=1,循环变量b增加步长值b=4+3=7; b=7,b<=20成立,执行循环体x=1+1=2,循环变量b增

加步长值b=7+3=10; b=10,b<=20成立,执行循环体x=2+1=3,循环变量b 增加步长值b=10+3=13; b=13,b<=20成立,执行循环体x=3+1=4,循环变量b 增加步长值b=13+3=16; b=16,b<=20成立,执行循环体x=4+1=5,循环变量b 增加步长值b=16+3=19; b=19,b<=20成立,执行循环体x=5+1=6,循环变量b 增加步长值b=19+3=22; b=22,b<=20不成立,内层循环结束;循环变量a增加步长值a=4+3=7。7.5.3循环结构③a=7,a<=20成立,执行循环体x=0,b=7,b<=20成立,执行循环体x=0+1=1,循环变量b增加步长值b=7+3=10; b=10,b<=20成立,执行循环体x=1+1=2,循环变量b 增加步长值b=10+3=13; b=13

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论