Access数据库实用教程第8章_第1页
Access数据库实用教程第8章_第2页
Access数据库实用教程第8章_第3页
Access数据库实用教程第8章_第4页
Access数据库实用教程第8章_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

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

文档简介

第8章模块与VBA程序设计模块与VBA程序设计概述

VBA编程基础VBA程序流程控制

VBA数组VBA模块的创建

VBA程序的调试VBA的数据库编程18.1模块与VBA程序设计概述

8.1.1模块类型8.1.2模块组成8.1.3VBA编程环境8.1.4面向对象程序设计的概念2模块是Access数据库中的一个数据库对象,它以VBA语言为基础编写。通俗来说,模块是Access数据库中用于保存VBA程序代码的容器。模块基本上是由声明、语句和(Sub和Function)过程组成的集合,它们作为一个已命名的单元存储在一起,对VBA程序代码进行组织。38.1模块与VBA程序设计概述

BASICBeginner’sAll-purposeSymbolicInstructionCode初学者万用符号指令代码VBA

VisualBasicforApplicationMicrosoftOffice内置的编程语言是根据VB简化的宏语言,其基本语法、词法与VB基本相同,具有简单、易学的特点。8.1.1模块类型Access有两种类型的模块:标准模块和类模块。1.标准模块标准模块包含与任何其他对象都无关的常规过程,以及可以从数据库任何位置运行的经常使用的过程。在标准模块中,可以放置希望供整个数据库的其他过程使用的Sub过程和Function过程。标准模块中的公共变量或公共过程具有全局特性,其作用范围在整个应用程序里,生命周期是伴随着应用程序的运行而开始、关闭而结束。48.1模块与VBA程序设计概述

1.类模块

类模块是可以包含新对象的定义的模块。一个类的每个实例都新建一个对象。窗体模块和报表模块都是类模块,它们从属于各自的窗体和报表。窗体模块和报表模块通常都含有事件过程,而过程的运行用于响应窗体或报表上的事件。窗体模块和报表模块中的过程可以调用标准模块中已经定义好的过程。为窗体或报表创建第一个事件过程时,Access将自动创建与之关联的窗体模块或报表模块。类模块具有局部特性,其作用范围局限在所属窗体或报表内部,而生命周期则是伴随着窗体或报表的打开而开始、关闭而结束58.1模块与VBA程序设计概述

8.1.2模块的组成

模块是装着VBA代码的容器。一个模块包含一个声明区域,包含一个或多个过程。如下图所示。过程是模块的单元组成,用VBA代码编写而成。过程分为Sub过程和Function过程两种类型。68.1模块与VBA程序设计概述

8.1.3VBA编程环境在Office中使用的VBA开发界面被称为VBE具有编辑、调试和编译VisualBasic程序的功能78.1模块与VBA程序设计概述

切换到VBE环境方法1:“创建”-“宏与代码”-“VisualBasic”方法2:Alt+F11方法3:设计窗体、报表时转到VBE环境88.1模块与VBA程序设计概述

代码窗口立即窗口工程资源管理器属性窗口标准工具栏98.1.4面向对象程序设计的概念VBA采用了面向对象的程序设计方法。对象:在采用面向对象程序设计方法的程序中,程序被抽象成了一个个对象,每个对象具有各自的属性、方法和事件类:是对一类相似对象的定义和描述。因此类可看做是对象的模板,每个对象由类来定义。对象集合:是由一组对象组成的集合,这些对象的类型可以相同,也可以不同。108.1模块与VBA程序设计概述

常用对象对象名称说明Application应用程序,即AccessDebug该对象可在调试阶段用Print方法在立即窗口输出信息Forms所有处于打开状态的窗体构成的集合Reports所有处于打开状态的报表构成的集合Screen屏幕对象Docmd使用该对象可从VisualBasic中运行Access操作118.1模块与VBA程序设计概述

8.1.4面向对象程序设计的概念属性:用来表示对象的状态,如窗体的Name(名称)属性、Caption(标题)属性等。方法:用来描述对象的行为,如窗体有Refresh方法,Debug对象有Print方法等。引用对象的属性或方法时应该在属性名或方法名前加对象名,并用对象引用符“.”连接。128.1模块与VBA程序设计概述

8.1.4面向对象程序设计的概念事件:是对象可以识别的动作,通常由系统预先定义事件过程:对象在识别了所发生的事件后执行的程序PrivateSubCommand1_Click()Me!Label1.Caption=“学校名称:"Me!Text0=“湖北汽车工业学院"EndSub138.1模块与VBA程序设计概述

PrivateSubCommand1_Click()Me!Label1.Caption="学校名称:"Me!Text0="湖北汽车工业学院"EndSub8.2.1数据类型8.2.2常量8.2.3变量8.2.4函数8.2.5表达式148.2VBA编程基础8.2.1数据类型VBA的数据类型共有13种存储时所占的存储空间和处理时能够进行的运算都不相同158.2VBA编程基础数据类型存储字节范围Byte(字节型)10~255Boolean(布尔型)2True或FalseInteger(整型)2−32768~+32767Long(长整型)4−2147483648~2147483647Single(单精度型)4负数:−3.402823×1038~−1.401298×10-45正数:1.401298×10-45~3.402823×1038Double(双精度型)8负数:−1.79769313486232E308~−4.94065645841247E−324正数:4.94065645841247E−324~

1.79769313486232E308Decimal(小数型)12与小数点右边的数字个数有关168.2VBA编程基础数据类型存储字节范围Currency(货币型)8−922337203685447.5808~922337203685447.5807Date(日期型)8100年1月1日~9999年12月31日String(字符型)与字符串的字长有关定长:1~65400变长:0~20亿Object(对象型)4任何对象引用Variant(变体型)与具体数据类型有关每个元素数据类型的范围自定义型各元素所需字节之和续表178.2VBA编程基础8.2.2常量其值在程序运行期间不变的量字面常量符号常量固有常量188.2VBA编程基础8.2.2常量其值在程序运行期间不变的量字面常量(1)各种数字型常量(2)字符型常量(3)日期型常量(4)布尔型常量198.2VBA编程基础8.2.2常量其值在程序运行期间不变的量符号常量可以定义用符号代替常量。如果程序中多处用到某个常量,将其定义成符号常量可增加代码的可读性,也便于维护。关键字ConstConstPIassingle=3.1415926208.2VBA编程基础8.2.2常量其值在程序运行期间不变的量固有常量一类特殊的符号常量,通常已经预先在类库中定义好,编程者只要直接使用这些已经定义好的符号常量即可.例如:VBA类库中定义的颜色常量vbRed代表红色vbBlue代表蓝色218.2VBA编程基础8.2.3变量其值在程序运行期间变化的量变量的声明格式为:Dim变量名[AS类型]如果省略“AS类型”,则所定义的变量为Variant型。建议在程序中显式声明变量228.2VBA编程基础8.2.4函数大量的内置函数极大地丰富了VBA的功能函数名参数(指参数的个数、顺序和类型)函数值238.2VBA编程基础8.2.4函数大量的内置函数极大地丰富了VBA的功能按照函数的功能,VBA的内置函数可分为数学函数字符串函数日期函数转换函数248.2VBA编程基础MsgBox函数

MsgBox(提示[,按钮、图标和默认按钮][,标题])258.2VBA编程基础InputBox函数

InputBox(提示[,标题][,默认])268.2VBA编程基础8.2.5表达式表达式是将常量、变量、字段名称、控件的属性值和函数用运算符连接而成的运算式算术表达式字符表达式关系表达式布尔表达式对象引用表达式278.2VBA编程基础8.2.5表达式算术运算式288.2VBA编程基础8.2.5表达式算术运算式字符串表达式&—作用是连接两个字符串298.2VBA编程基础8.2.5表达式算术运算式字符串表达式关系表达式运算符意义示例结果<小于5<2False<=小于等于5<=2False>大于5>2True>=大于等于5>=2True=相等5=2False<>不等5<>2TrueLike字符串匹配"This"Like"*is"True308.2VBA编程基础8.2.5表达式算术运算式字符串表达式关系表达式布尔表达式运算符意义示例结果优先级Not非,将True变False或将False变TrueNotTrueFalse3And与,两边都是真,结果才为真5>2And“ab”=“bc”False2Or或,两边有一个为真,结果就为真5>2Or“ab”=“abc”True1318.2VBA编程基础对象引用表达式运算符意义示例示例说明!引用某个对象,该对象通常由用户定义Forms![系统登录]引用Forms集合中的“系统登录”窗体.引用对象的属性或方法,该属性或方法通常由Access定义Forms![系统登录].visible引用Forms集合中的“系统登录”窗体的visible属性328.2VBA编程基础8.3VBA程序流程控制8.3.1程序的顺序控制8.3.2程序的分支控制8.3.3程序的循环控制338.3VBA程序流程控制程序由语句组成语句由关键字、标识符、运算符和表达式组成每条语句指明了计算机要进行的具体操作按照语句所执行的功能,有赋值语句声明语句控制语句注释语句348.3VBA程序流程控制赋值语句给变量或对象的属性赋值<变量名>=<表达式>或

<对象名.属性>=<表达式>358.2VBA编程基础8.3.1程序的顺序控制程序的三种基本控制结构顺序结构分支结构循环结构36例8-1创建如图8-5所示的窗体“计算圆的面积和周长”。要求在文本框中输入了圆的半径后,单击“计算”按钮,在窗体的另外两个文本框中分别输出圆的面积和周长。8.3VBA程序流程控制37“计算”按钮的Click事件过程如下。PrivateSubcmd计算_Click()'定义变量和符号常量DimrAsSingle'r为圆的半径DimsAsSingle's为圆的面积DimlAsSingle'l为圆的周长ConstPIAsSingle=3.1415926'给变量r赋值r=Me!txt半径'计算圆的面积和周长s=PI*r^2l=2*PI*r'用文本框输出结果Me!txt面积=sMe!txt周长=lEndSub8.3VBA程序流程控制388.3VBA程序流程控制8.3.2

程序的分支控制用条件来控制语句的执行有If语句和SelectCase语句39If…Then…Else语句语句格式为If<表达式>Then<语句块1>Else<语句块2>EndIf‘输入两个数并在立即窗口输出其中较大的数DimxAsInteger,yAsIntegerx=InputBox("请输入x的值:")y=InputBox("请输入y的值:")Ifx>yThenDebug.PrintxElseDebug.PrintyEndIf8.3VBA程序流程控制40<表达式>可以是任何表达式,一般为关系表达式或布尔表达式。如果是其他表达式,则非0认为是True,0认为是False。执行时,先判断表达式的值,为True则执行语句块1,否则执行语句块2。如果语句较短Ifx>yThenDebug.PrintxElseDebug.Printy使用过程中有时没有语句块2,这时If语句变为单分支结构。8.3VBA程序流程控制41例8-2用VBA程序实现窗体“系统登录”8.3VBA程序流程控制42“确定”按钮的Click事件过程PrivateSubcmd确定_Click()DimnameAsString,passAsStringDimrAsInteger'存放MsgBox消息框的返回值

name=Me!txt用户名

pass=Me!txt口令

Ifpass="1234"Andname="cueb"Then

'如果用户名和口令正确,显示消息框,运行"学生管理模块"窗体

MsgBox"欢迎进入学生管理模块!",vbOKOnly+vbCritical,"欢迎"DoCmd.Close '关闭系统登录窗体

DoCmd.OpenForm"学生管理模块" '打开"学生管理模块"窗体

ElseMsgBox"密码错误!",vbOKOnly '显示消息框

Me!txt用户名="" '使文本框清空

Me!txt口令=""Me!txt用户名.SetFocus '使文本框获得焦点,准备重新输入

EndIfEndSub43If…Then…ElseIf语句

If<表达式1>Then<语句块1>ElseIf<表达式2>Then<语句块2>… [ElseIf<表达式n>Then<语句块n>Else<语句块n+1>]EndIf运行时,从表达式1开始逐个测试条件,当找到第一个为True的条件时,即执行该条件后所对应的语句块。8.3VBA程序流程控制44例8-3编程根据输入的学生成绩,评定其等级。标准是90~100“优秀”80~89“良好”70~79“中等”60~69“及格”60分以下“不合格”。8.3VBA程序流程控制45PublicSubgc1()DimxAsIntegerx=InputBox("请输入成绩:")Ifx>=90ThenDebug.Print"优秀"ElseIfx>=80ThenDebug.Print"良好"ElseIfx>=70ThenDebug.Print"中等"ElseIfx>=60ThenDebug.Print"及格"ElseDebug.Print"不及格"EndIfEndSubSelectCase语句

SelectCase<变量或表达式>Case<表达式列表1>

语句块1Case<表达式列表2>

语句块2…[CaseElse

语句块n+1]EndSelect8.3VBA程序流程控制46SelectCase后只能是数值型或字符型表达式。执行过程:先计算SelectCase后的变量或表达式的值,然后从上至下逐个比较,决定执行哪一个语句块语句中的各个表达式列表应与SelectCase后的变量或表达式同类型。采用下面的形式表达式:a+5用逗号分隔的一组枚举表达式:2,4,6,8表达式1To表达式260to100 Is关系运算符表达式Is<608.3VBA程序流程控制47DimxAsIntegerx=InputBox("请输入成绩:")SelectCasexCase90To100Debug.Print"优秀"Case80To89Debug.Print"良好"Case70To79Debug.Print"中等"Case60To69Debug.Print"及格"CaseElseDebug.Print"不及格"EndSelect特别提示:SelectCase语句和If…Then…ElseIf语句并不完全等同。SelectCase语句适用于对一个条件的多个不同取值进行测试的情况,而If…Then…ElseIf语句则可对多个条件进行测试,因此后者的使用范围更广一些。8.3VBA程序流程控制48分支嵌套Ifx>yThenIfx>yThen…Else…EndIfElse…EndIf8.3VBA程序流程控制49PrivateSubcmd确定_Click()DimnameAsString,passAsStringDimrAsInteger '存放MsgBox消息框的返回值

name=Me.txt用户名

pass=Me.txt口令

Ifpass="1234"Andname=“hzh"Then

'如果用户名和口令正确,显示消息框,运行"学生管理模块"窗体

MsgBox"欢迎进入学生管理模块!",vbOKOnly+vbCritical,"欢迎"DoCmd.Close '关闭系统登录窗体

DoCmd.OpenForm"学生管理模块"'打开"学生管理模块"窗体

Elser=MsgBox("密码错误!要继续吗?",vbYesNo)'显示消息框

Ifr=vbYesThen '继续输入

Me.txt用户名=""'使文本框清空

Me.txt口令=""Me.txt用户名.SetFocus '使文本框获得焦点,准备重新输入

Else '关闭窗体,不继续输入

DoCmd.CloseEndIfEndIfEndSub508.3VBA程序流程控制8.3.3

程序的循环控制称重复控制结构特点是程序执行时,该语句中的一部分操作即循环体被重复执行多次有For语句Do…Loop语句51For循环语句For<循环变量>=<初值>to<终值>[Step<步长>] <语句块>[ExitFor]<语句块>Next<循环变量>8.3VBA程序流程控制52循环控制变量的类型必须是数值型步长可以是正数,也可以是负数。如果步长为1,Step短语可以省略根据初值、终值和步长,可以计算出循环的次数,因此For语句一般用于循环次数已知的情况使用ExitFor语句可以提前退出循环8.3VBA程序流程控制53例8-4编程用For语句求1+2+3+…+10之和gc2的程序代码PublicSubgc2()DimsAsInteger,iAsIntegers=0Fori=1To10Step1s=s+iNextiDebug.PrintsEndSub该循环的执行过程如下。(1)首先给i赋初值1。(2)测试i是否超过终值10。如果没有,则执行累加;否则,退出循环转到步骤(5)。(3)将i加上一个步长。(4)重复步骤(2)和步骤(3)。(5)继续执行Next后面的语句。8.3VBA程序流程控制54Do…Loop循环语句形式1:Do{While|Until}<条件>

语句块

[ExitDo]

语句块Loop‘下面的程序用DoWhile…Loop语‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1DoWhilei<=10s=s+ii=i+1LoopDebug.Prints8.3VBA程序流程控制55这里的条件可以是任何类型的表达式,非0为真,0为假。执行过程是:在每次循环开始时测试条件,对于DoWhile语句,如果条件成立,则执行循环体的内容,然后回到DoWhlie处准备下一次循环;否则,退出循环。对于DoUntile语句,则正好相反,当条件满足时退出循环。ExitDo语句的作用是提前终止循环。8.3VBA程序流程控制56与For语句相比,有下列几点不同Do…Loop语句不仅可用于循环次数已知的情况,而且可用于循环次数未知的情况,因此适用的范围更广。Do…Loop语句没有专门的循环控制变量,但一般应有一个专门用来改变条件表达式中变量的语句,使得随着循环的执行,条件趋于不成立(或成立),最后达到退出循环。8.3VBA程序流程控制57形式2:Do

语句块

[ExitDo]

语句块Loop{While|Until}<条件>说明:和形式1不同的是,在每次循环结束时测试条件。因此,二者的区别是如果一开始循环条件就不成立,则形式1中的循环体部分一次也不执行,而形式2中的循环体部分被执行一次。8.3VBA程序流程控制58问题:下面的程序执行结果是什么?控制循环执行的判断被执行了几次?‘下面的程序用Do…LoopWhile语‘句求1+2+3…+10之和。DimsAsInteger,iAsIntegers=0:i=1Dos=s+ii=i+1LoopWhilei<=10Debug.Prints8.3VBA程序流程控制59例8-5编程求两个整数的最大公约数和最小公倍数

算法:设两个整数分别为m和n,(1)保证m大于n,否则将m和n互换;(2)求m除以n的余数r;(3)若r不为0,则将n赋给m,r赋给n;(4)重复步骤(2)和步骤(3),直到r为0,此时最大公约数为n。将m和n互换的算法是借助于第3个变量t:t=m:m=n:n=t8.3VBA程序流程控制60gc3中的程序代码。PublicSubgc3()DimnAsInteger,mAsInteger,tAsIntegerDimrAsInteger 'r为m/n的余数

DimmnAsInteger 'mn为m和n的乘积

m=Val(InputBox("m="))n=Val(InputBox("n="))mn=n*mIfm<nThent=m:m=n:n=tr=mModnDoWhile(r<>0)m=nn=rr=mModnLoopDebug.Print"最大公约数=",nDebug.Print"最小公倍数=",mn/nEndSub61循环嵌套Dowhile…Dowhile…Loop…LoopDowhile…if…Endif…Loop8.3VBA程序流程控制628.4.1数组的概念及定义8.4.2数组的应用8.4VBA数组638.4VBA数组8.4.1数组的概念及定义问题:求10个成绩的平均值,并对它们按照从大到小排序,这10个数怎么组织?放在10个变量中?放在一个数组中?如果在程序中要对一组数据进行处理,通常的解决方法是将这组数放在数组中。64一维数组的定义使用数组必须先定义数组,格式为Dim数组名([<下界>to]<上界>)[As<数据类型>]所有数组元素具有同一个标识即数组名,数组名后括号内的序号称为数组元素的下标。(1)所有数组元素在内存连续存放(2)根据下标区分数组元素8.4VBA数组65命名规则与变量名的命名规则相同。一般在定义数组时应给出数组的上界和下界。但也可以省略下界,<下界>缺省为0。例如,Dima(10)AsSingle若希望下标从1开始,可在模块的通用声明段声明OptionBase0|1'后面的参数只能取0或1<下界>和<上界>不能使用变量,必须是常量。如果省略As子句,则数组的类型为Varient变体类型。8.4VBA数组66二维数组的定义

Dim数组名([<下界>to]<上界>,[<下界>to]<上界>)[As<数据类型>]例如,Dimc(1To3,1To4)AsSinglec(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)存放的顺序是先行后列8.4VBA数组67一旦定义了数组,就可以用前面介绍的对变量的处理方法处理数组,并且可以用循环语句对数组进行处理,提高程序的可读性。8.4VBA数组8.4.1数组的应用68例8-5编程产生10个0-99之间的随机数,并找出其中的最大值和最小值用内置函数Rnd()生成随机数:Int(Rnd()*100)8.4VBA数组69程序代码如下:PublicSubgc4()Dima(1To10)AsIntegerDimiAsInteger,maxAsInteger,minAsInteger

'生成并输出数组

Fori=1To10a(i)=Int(Rnd()*100)Debug.Printa(i);NextiDebug.Print '另起一行

'寻找最大值和最小值

max=a(1):min=a(1)Fori=2To10Ifmax<a(i)Thenmax=a(i)Ifmin>a(i)Thenmin=a(i)Nexti

'输出结果

Debug.Print"max=";maxDebug.Print"min=";minEndSub70111222333OptionBase1PublicSubgc5()Dimc(3,3)AsIntegerDimiAsInteger,jAsIntegerFori=1To3 '赋值

Forj=1To3c(i,j)=iNextjNextiFori=1To3 '输出

Debug.PrintForj=1To3Debug.Printc(i,j);NextjNextiEndSub8.4VBA数组例8-7

编程在立即窗口输出所示矩阵71例8-8编程输入5个整数,并将这5个数按升序排序。有多种算法可以实现排序。本例采用选择法,其基本思路如下。找出a(1)-a(5)中的最大值,放在a(1)中找出a(2)-a(5)中的最大值,放在a(2)中…找出a(4)-a(5)中的最大值,放在a(4)中问题归结为寻找4次最大值8.4VBA数组72OptionBase1PublicSubgc6()Dimp(5)AsInteger'存放最小值的下标

DimiminAsInteger DimiAsInteger,jAsInteger,tAsInteger

Debug.Print"排序前:"Fori=1To5 '赋值并输出

p(i)=InputBox("p("&i&")=")Debug.Printp(i);Nexti

Fori=1To4 '排序

'寻找最小值的位置

imin=iForj=iTo5Ifp(imin)>p(j)Thenimin=jNextj

'交换

t=p(i):p(i)=p(imin):p(imin)=tNexti

Debug.PrintDebug.Print"排序后:“

'输出排序结果

Fori=1To5 Debug.Printp(i);NextiEndSub738.5.1VBA标准模块8.5.2过程的创建和调用8.5.3函数的创建和调用8.5.4过程调用中的参数传递8.5.5局部变量、全局变量和静态变量8.5VBA模块的创建748.5VBA模块的创建8.5.1VBA标准模块VBA程序由模块组成类模块标准模块758.5VBA模块的创建标准模块引用的代码按照其是否有返回值可以被组织成Sub过程和Function函数标准模块不与某个具体的对象相连,它的作用就是为其他模块提供可共享的公共Sub过程和Function函数

768.5VBA模块的创建创建标准模块的方法(1)ACCESS:“创建”-“宏与代码”-“模块”(2)VBE:“插入”-“模块”

778.5VBA模块的创建8.5.2过程的创建和调用过程是一段可以实现某个具体功能的代码与函数不同,过程没有返回值可以在类模块中,也可以在标准模块中创建过程PublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSub788.5VBA模块的创建过程的定义形式如下:[Public|Private][Static]Sub过程名(变量名1As类型,变量名2As类型,…)<局部变量或常数定义>

<语句块>

[ExitSub]

<语句块>EndSub过程名后括号内的变量也叫形式参数。如果过程有形式参数,则要在定义过程时指明形参的名称和类型;如果省略类型,则形参的默认类型为Varient型。798.5VBA模块的创建创建过程的方法是:打开模块菜单“插入”→“过程”

调用过程有以下两种格式。格式1:call过程名([实参列表])格式2:过程名[实参列表]这里过程名后的参数叫实际参数。调用过程时应注意实参应与形参的顺序、类型和个数保持一致。80例8-10创建一个窗体,在其中的某个按钮的单击事件中用InputBox函数输入两个整数,然后调用过程swap将它们的值互换。按钮的单击事件如下:PrivateSubCommand0_Click()DimxAsInteger,yAsIntegerx=InputBox("x=")y=InputBox("y=")Debug.Printx,yswapx,y'或swap(x,y)Debug.Printx,yEndSub8.5VBA模块的创建818.5VBA模块的创建8.5.3函数的创建和调用函数有返回值函数的定义形式如下:[Public|Private][Static]Function过程名(变量名1As类型,变量名2As类型,…)As类型

<局部变量或常数定义>

<语句块>

<函数名>=<表达式>[ExitFunction]

<语句块>

<函数名>=<表达式>EndFunction828.5VBA模块的创建例8-11在前面创建的标准模块“模块1”内创建函数jc,函数的功能是返回一个数的阶乘。另外创建一个过程test,在test过程内调用函数jc。838.5VBA模块的创建8.5.4过程调用中的参数传递在调用过程和函数的过程中,一般会发生数据的传递,即将主调过程中的实参传给被调过程的形参传址传值848.5VBA模块的创建传址定义过程或函数时,形参的变量名前不加任何前缀传递过程是:调用过程时,将实参的地址传给形参。因此如果在被调过程或函数中修改了形参的值,则主调过程或函数中实参的值也跟着变化。858.5VBA模块的创建传值定义过程或函数时,形参的变量名前加ByVal前缀主调过程将实参的值复制后传给被调过程的形参,因此如果在被调过程或函数中修改了形参的值,则主调过程或函数中实参的值不会跟着变化。86PublicSubswap1(ByValxAsInteger,ByValyAsInteger)DimtAsIntegert=x:x=y:y=tEndSubPublicSubswap(xAsInteger,yAsInteger)DimtAsIntegert=x:x=y:y=tEndSub按钮的单击事件如下:PrivateSubCommand0_Click()DimxAsInteger,yAsIntegerx=InputBox("x=")y=InputBox("y=")Debug.Printx,yswapx,yswap1x,yDebug.Printx,yEndSub8.5VBA模块的创建如果输入5和7,程序的结果?878.5VBA模块的创建8.5.5传递局部变量、全局变量和静态变量变量的有效范围即作用域按照作用域不同,VBA有局部变量模块级局部变量全局变量888.5VBA模块的创建过程内局部变量在过程和函数内用关键字Dim定义有效范围是定义该变量的过程或函数

898.5VBA模块的创建模块级局部变量在模块的通用声明段用关键字Dim或Private定义有效范围是定义该变量的模块908.5VBA模块的创建例8-12创建名为“排序”的窗体。运行时自动产生并在左面的列表框中输出10个0~99之间的随机数,单击“排序”按钮后将这10个数按降序排序,并在右边的列表框中输出排序的结果。918.5VBA模块的创建解题思路:(1)用数组存放10个随机数。(2)在窗体的Load事件中生成数组中的10个随机数(3)在“排序”按钮的Click事件中将数组排序,因此该数组应定义为模块级数组。92Dima(1To10)AsInteger‘定义模块级数组PrivateSubForm_Load()DimiAsInteger

'生成并输出数组

Fori=1To10a(i)=Int(Rnd()*100)Me.lst左.AddItema(i)NextiEndSubPrivateSubcmd排序_Click()DimiAsInteger,jAsInteger,imaxAsInteger,tAsIntegerFori=1To10'排序

'寻找最大值的位置

imax=iForj=iTo10Ifa(imax)<a(j)Thenimax=jNextj'交换

t=a(i):a(i)=a(imax):a(imax)=tNexti

Fori=1To10'输出排序结果

Me.lst右.AddItema(i)NextiEndSub938.5VBA模块的创建全局变量在整个应用程序使用的变量在模块的通用声明段用Public关键字定义引用全局变量时在标准模块中定义的全局变量,可在应用程序的任何地方直接用变量名引用该变量在类模块中定义的全局变量,可在应用程序的任何地方用“模块名.变量名”引用948.5VBA模块的创建静态变量决定变量的生存期对于过程内的局部变量,它的生存期从进入过程(Sub)开始,到退出过程(EndSub)时结束。如果要改变过程内局部变量的生存期,可以将它定义为静态变量定义的方法是在定义过程内局部变量时加关键字Static958.5VBA模块的创建例8-13制作一个“计时器”窗体。要求,该窗体运行后首先单击“设置”按钮,然后在输入框中输入计时的秒数,单击“开始”按钮则开始计时,同时计时的秒数显示在文本框中。当计时时间到,停止计时并响铃,同时将文本框清零。968.5VBA模块的创建解题思路:(1)计时由窗体的Timer事件完成。(2)由于在“设置”按钮的单击事件和“开始”按钮的单击事件中都要用到计时范围f,所以将变量f定义成模块级变量。(3)变量s的作用是计时,即每次Timer事件触发时s的值要加1,所以将变量s定义成静态变量。97DimfAsInteger ‘定义模块级变量‘在窗体的Load事件中设置TimerInterval属性为0PrivateSubForm_Load()Me.TimerInterval=0EndSub‘窗体的Timer事件PrivateSubForm_Timer()StaticsAsInteger '定义静态变量

s=s+1Ifs=fThenBeep '响铃

s=0Me.TimerInterval=0EndIfMe.txt显示=sEndSub‘按钮“cmd设置”的单击事件PrivateSubcmd设置_Click()f=InputBox("请输入计时范围:")EndSub‘按钮“cmd开始”的单击事件PrivateSubcmd开始_Click()Me.TimerInterval=1000 '开始计时EndSub988.6VBA程序的调试8.6.1错误类型8.6.2设置断点8.6.3单步跟踪8.6.4设置监视点99中断模式可以干什么?怎样进入?怎样退出?8.6VBA程序的调试1008.6.1

错误类型

语法错误编译错误运行错误逻辑错误8.6VBA程序的调试101调试窗口立即窗口本地窗口监视窗口8.6VBA程序的调试1028.6.2

设置断点

在程序中人为设置断点,使程序暂停运行并进入中断状态…8.6VBA程序的调试1038.6.3

单步跟踪

设置单步跟踪程序的运行“调试”→“逐语句”8.6VBA程序的调试1048.6.4

设置监视点

即设置监视表达式。一旦监视表达式的值为真或改变,程序自动进入中断模式。“调试”→“添加监视”8.6VBA程序的调试1058.7VBA的数据库编程8.7.1数据访问接口ADO8.7.2ADO的主要对象8.7.3使用记录集中的数据1068.7.1

数据访问接口ADO

ADO(ActiveXDataObject)即ActiveX数据访问对象,是Microsoft公司在OLE-DB之上提出的一种新的逻辑接口,以便编程者通过OLE-DB更简单地以编程方式访问各种各样的数据源。

8.7VBA的数据库编程107ADO将访问数据源的过程抽象成几个容易理解的具体操作,并由实际的对象来完成。由于采用了ActiveX技术,与具体的编程语言无关,所以可应用在VisualBasic、C++、Java等各种程序设计语言中。ADO能够访问各种支持OLE-DB的数据源,包括数据库和其他文件、电子邮件等数据源。ADO既可以被应用于网络环境,也可以被应用于桌面应用程序中。

8.7VBA的数据库编程108ADO访问数据源的具体过程如下。建立与数据源的连接指定访问数据源的命令,并向数据源发出命令从数据源以行的形式获取数据,并将数据暂存在内存的缓存中如果需要可对获取的数据进行查询、更新、插入、删除等操作如果对数据源进行了修改,将更新后的数据发回数据源断开与数据源的连接8.7VBA的数据库编程实际使用时,上面过程中的各个步骤分别由ADO的具体对象完成

109要使用ADO对象,先要引用ADO类库。“工具”→“引用”8.7VBA的数据库编程110ADO的主要对象Connection对象Command对象Recordset对象

8.7VBA的数据库编程111Connection对象

8.7VBA的数据库编程用于建立与数据源的连接112(2)指定OLE-DB数据提供者的名称和有关的连接信息

MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教学管理

.accdb"

(3)最后调用MyCnn对象的Open方法打开连接MyCnn.Open(1)定义一个ADO的Connection对象DimMyCnnAsADODB.Connection SetMyCnn=NewADODB.Connection8.7VBA的数据库编程113用Connection对象显式建立与Access数据库“教学管理”的连接的完整程序。PublicSubCnnToDB_1()

'定义Connection对象

DimMyCnnAsADODB.Connection

'初始化

SetMyCnn=NewADODB.Connection

'指定数据提供者的名称MyCnn.Provider="Microsoft.ACE.OLEDB.12.0"

'指定数据源

MyCnn.ConnectionString="DataSource=D:\教学管理

.accdb"

'打开连接

MyCnn.Open MsgBox("数据库连接成功")EndSub8.7VBA的数据库编程114Command对象

8.7VBA的数据库编程

用来定义并执行针对数据源运行的具体命令,如SQL查询,并通过Recordset对象返回一个满足有关条件的记录集。115(1)创建一个Command对象的实例DimMyCmdAsADODB.Command SetMyCmd=NewADODB.Command(2)使已经打开的连接与Command对象相关联

MyCmd.ActiveConnection=MyCnn

(3)定义命令(如SQL语句)的可执行文本MyCmd.CommandText="Select*From课程"

(4)执行命令并返回记录集MyCmd.Execute

8.7VBA的数据库编程116从数据源获取的数据存放在Recordset对象中,并且所有Recordset对象均由记录(行)和字段(列)组成。使用Recordset对象的方法和属性定位到数据的各行查看行中的值操纵记录集中的数据Recordset对象

8.7VBA的数据库编程117定义并初始化一个Recordset对象

DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.Recordset有多种获取记录集的方法8.7VBA的数据库编程118(1)接收Command对象的返回记录集SetMyRS=MyCmd.Execute调用Command对象的Execute方法执行命令后,可将返回的记录集指定给一个Recordset对象。8.7VBA的数据库编程119下面程序实现了创建连接、定义命令和获取数据的全部过程

PublicSubCnnToDB_2()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyCmdAsADODB.CommandSetMyCmd=NewADODB.CommandDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教学管理

.accdb"MyCnn.OpenMyCmd.ActiveConnection=MyCnnMyCmd.CommandText="Select*From课程"SetMyRS=MyCmd.ExecuteStop ‘断点,以便观察得到的数据

MyCnn.CloseEndSub120?Myrs.fields(0),Myrs.fields(1),Myrs.fields(2)立即窗口输入命令:查看获取的结果(2)使用Recordset对象的Open方法打开Recordset对象此方法的语法格式如下:recordset.OpenSource,ActiveConnection,CursorType,LockType,OptionsSource可以是SQL命令、Command对象、表名等。ActiveConnection指定所用的连接,可以是Connection对象。CursorType指定记录集中游标的移动方式。8.7VBA的数据库编程121下面程序使用方法2获取数据PublicSubCnnToDB_3()DimMyCnnAsADODB.ConnectionSetMyCnn=NewADODB.ConnectionDimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQLAsStringMyCnn.Provider="Microsoft.ACE.OLEDB.12.0"MyCnn.ConnectionString="DataSource=D:\教学管理

.accdb“MyCnn.OpenstrSQL="Select*From课程"MyRS.OpenstrSQL,MyCnn,adOpenKeysetStopMyCnn.CloseEndSub122当不再使用Recordset对象中的数据时,应该用Recordset对象的Close方法关闭该对象,释放所占用的内存空间。8.7VBA的数据库编程使用当前数据库的连接MyCmd.ActiveConnection=CurrentProject.ConnectionMyRS.Close1238.7.3

使用记录集中的数据

现在,数据已在Recordset对象中,如何对数据进行输出、插入、删除和更新?

8.7VBA的数据库编程124输出记录集中的数据

8.7VBA的数据库编程BOF(BeginOfFile)属性用于检查当前游标是否在第1条记录之前。如果是,则返回True,否则返回False。EOF(EndOfFile)属性用于检查当前游标是否在最后1条记录之后即记录集的末尾。如果是,则返回True,否则返回False。如果记录集为空,则BOF属性和EOF属性的值均为True。125MoveFirst:将游标移到第1条记录。MoveLast:将游标移到最后1条记录。MoveNext:将游标移到下一条记录。MovePrevious:将游标移到上一条记录。8.7VBA的数据库编程126PublicSubOutput()DimMyRSAsADODB.RecordsetSetMyRS=NewADODB.RecordsetDimstrSQ

温馨提示

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

评论

0/150

提交评论