第九章模块与VBA程序设计【本章主要掌握内容】模块的基本概念及其创建VBA中的数据类型常量、变量与数组VBA中的运算符、表达式和函数VBA流程控制语句VBA的数据库编程▲VBA(VisualBasicforApplication)是VisualBasic语言在Office编程中的应用。▲VBA就是用来创建Access模块对象的编程语言。第一节模块的基本概念▲模块是以VBA语言为基础编写的,将一个或多个过程(子过程或函数过程)作为一个单元进行保存的集合。模块中的每个过程实现各自的特定功能。▲利用模块可以将各种数据库对象连接起来,构成一个完整的系统。▲在Access中,模块分为两种类型:类模块标准模块一、类模块▲类模块是依附于某一窗体或报表而存在的模块。▲窗体和报表中含有对象,每个对象都有自己固有的事件过程,以响应窗体或报表中的事件。▲为窗体或报表创建第一个事件过程时,系统会自动创建与之关联的窗体或报表模块。▲在窗体或报表的设计视图下,可以单击工具栏中的【代码】按钮进入代码窗口。▲已经具有事件过程的事件名称用黑色粗体表示。▲窗体或报表中模块的作用范围仅局限于其所属的窗体或报表的内部,具有局部特征。二、标准模块▲标准模块是不与任何对象相关联的通用过程,这些过程可在数据库中的任何位置直接调用执行。▲标准模块一般用于存放公共过程(子过程和函数过程),与其它任何Access对象不相关联。在Access系统中,通过模块对象创建代码的过程就是标准模块。▲在标准模块中的全局变量或公共过程,其作用范围在整个应用程序里,具有全局特征。三、打开模块的编辑窗口模块是在VBE(VisualBasicEditor)窗口中进行创建和编辑的。可以通过以下方法打开标准模块的VBE窗口:▲在【创建】选项卡的【宏与代码】组中单击【模块】按钮(创建新模块)▲在【导航】窗格中选择【模块】类别,使用组合键Alit+F11(数据库窗口与VBE窗口之间切换)▲在【导航】窗格中右击某个模块对象,在快捷菜单中选择【设计视图】命令(打开该模块的代码窗口)▲双击【导航】窗格中的某个模块对象(打开该模块的代码窗口)在打开窗体或报表的设计视图后,可以通过以下方法打开类模块的VBE窗口:▲单击【窗体设计工具】中的【设计】选项卡中的【查看代码】按钮▲右击需要编辑代码的控件,并在快捷菜单中选择【事件生成器】命令第二节创建模块模块是以过程(或函数)为单元组成的,一个模块包含两个部分:▲一个声明区域用于定义模块中使用的变量等内容。▲若干个子过程与函数过程☆过程是由代码组成的单元,包含一系列计算语句和执行语句,用于完成特定的操作。☆过程名不能与所在模块的模块名相同。模块声明区域子过程和函数定义区域过程有两种类型:☆Sub过程(子过程)☆Function过程(函数过程)1、Sub过程子过程以关键词Sub开始,以EndSub结束。语法格式:[Public|Private][Static]Sub子过程名([形参列表][As数据类型])[程序代码][ExitSub][程序代码]EndSub说明:☆Public过程能被所有模块的所有其它过程调用。☆Private过程只能被同一模块的其它过程调用。☆Static用于设置静态变量(局部变量)。如果没有使用Public或Private指定,过程则是Public(默认情况);如果没有使用Static,则在调用之后不会保留局部变量的值。☆形参列表:即调用时接受传递给Sub过程的参数的变量列表。如果有多个变量,则多个变量之间用逗号隔开。☆如果Sub过程没有参数,过程名后也必须包含一个空的圆括号。☆在形参表中可以用As来设置参数的数据类型,未加As时,则参数为变体型数据。☆在过程执行中一旦遇到ExitSub语句,则结束过程的执行。☆可以通过传递参数和使用参数来调用子过程,但子过程调用后不返回任何值。【例】PublicSubxx(mAsString,nAsInteger)……EndSubPublicSubyy()……EndSub子过程的调用形式有两种:语法格式一:Call子过程名[(实参列表)]语法格式二:子过程名[实参列表]说明:☆实参列表:在调用过程时用于传递给Sub过程的变量列表,存在多个变量时,多个变量之间用逗号隔开。☆实参列表和形参列表必须一一对应。用Call调用子过程是一个良好的程序设计习惯,因关键词Call表明其后是过程名而不是变量名。【例1】PublicSubxx(mAsString,nAsInteger)Debug.Printm&nEndSubPublicSubyy()Callxx(ABC,5)EndSub运行子过程yy,即在立即窗口中显示:ABC52、Function过程在VBA除系统提供的标准函数外,还可以由用户自行定义函数过程(用户自定义函数)。函数过程和子过程在功能上略有不同:主程序调用过程后是执行了一个过程;主程序而调用函数后是得到了一个结果。函数过程是以Function开始,以EndFunction结束。语法格式:[Public|Private][Static]Function函数名([形参列表])[AS数据类型][程序代码][ExitFunction]函数名=表达式[程序代码]EndFunction说明:☆AS数据类型:定义函数返回值的数据类型。如果未定义,则系统将自动赋给函数过程一个最合适的数据类型。☆函数名=表达式:函数体中对函数名进行赋值的语句,使函数得到一个返回值。☆函数的定义中,必须至少含有一条给函数名的赋值语句。如果没有此语句,将根据As语句定义的数据类型而返回0或空字符串或空值。☆在函数过程执行中一旦遇到ExitFunction语句,则结束函数过程的执行。【例2】把0到9中数字转换成大写汉字Functionvtoc(xAsInteger)AsStringDimcResultAsStringDimnAsStringcResult=n=零壹贰叁肆伍陆柒捌玖cResult=mid(n,x+1,1)vtoc=cResultEndFunction函数过程的调用形式:语法格式:函数过程名([实参列表])说明:☆由于函数有返回值,因此调用时不能用Call命令,而是直接引用函数名并加括号。☆如果用Call命令调用函数,VBA将放弃函数的返回值。☆函数过程的返回值可以直接赋给某个变量。【例】s=vtoc(4)【例3】编写一个能够以年、月、日来返回系统日期的函数过程Getdate。FunctionGetdate()AsStringGetdate=Year(Date)&年_&Month(Date)&月_&Day(Date)&日EndFunction调用上述函数,并将结果在立即窗口中显示。SubPdate()Debug.PrintGetdate()EndSub第三节VBA程序设计基础一、面向对象程序设计的基本概念所谓面向对象可以这样定义:面向对象=类+对象+属性的继承+对象之间的通信一个面向对象的应用系统中,每一个组成部分都是对象,所需实现的操作则通过建立对象与对象之间的通信来完成。1、对象客观世界里的任何实体都可以被看作是对象。对象可以是具体的物,也可以指某些概念。在面向对象的程序设计中,对象代表应用程序中的元素,包括表、窗体、按钮等。每个对象都具有自己的属性、事件和方法;用户就是通过属性、事件和方法来处理对象的。2、对象的属性及属性值属性是对象的特征,用来表示对象的状态。不同类型的对象,其属性会有所不同;同类别对象的不同实例,属性的值也会有差异。既可以在创建对象时给对象设置属性值,也可以在执行程序时通过命令修改对象的属性值。3、事件和事件过程事件是对象可以识别的一个动作。为使对象在某一事件发生时能够做出所需要的反应,必须针对这一事件编写相应的代码来完成相应的功能。如果已经编写了某个对象的事件代码,那么当此事件发生时,这段事件代码将被自动激活并开始执行;如果事件没有发生,则此段代码永远不会被执行。如果没有为对象编写事件代码,那么即使事件发生了,也不会产生任何动作。4、方法方法是对象能够执行的一个动作,即当对象接受了某个消息后所采取的一系列操作的描述。相同类的对象具有相同的方法,不同类的对象所具有的方法也有所不同。每个对象都具有属性,以及与之相关的事件和方法,面向对象的程序设计就是通过对象的属性、事件和方法来处理对象。对象属性事件方法可以在程序代码中引用对象的属性或调用对象方法。语法格式:[父对象名!]对象名.属性名[父对象名!]对象名.方法名父对象与子对象之间用“!”连接;对象与属性(方法)之间用“.”连接。5、类类是面向对象程序设计中的核心。是对一类相同对象的集合,这些对象具有相同的性质、相同种类的属性以及方法。类是对象的抽象,而对象是类的具体实例。有了类定义后,基于类就可以生成这类对象中任何一个对象。这些对象虽然采用相同的属性来表示状态,但它们在属性上的取值完全可以不同。这些对象一般有着不同的状态,且彼此间相对独立。6、DoCmd对象DoCmd是Access数据库的一个特殊对象,它是通过调用Access内置的方法,在程序中实现某些特定的操作。语法格式:DoCmd.方法名[参数]说明:DoCmd对象的大多数方法都有参数,有些是必需的,有些则是可选的。若缺省,将采用默认的参数。(1)用DoCmd对象打开窗体语法格式:DoCmd.OpenForm窗体名功能:用默认形式打开指定窗体(2)用DoCmd对象关闭窗体语法格式一:DoCmd.CloseacForm,窗体名功能:关闭指定窗体语法格式二:DoCmd.Close功能:关闭当前窗体(3)用DoCmd对象打开报表语法格式:DoCmd.OpenReport报表名,acViewPreview功能:用预览形式打开指定报表(4)用DoCmd对象关闭报表语法格式一:DoCmd.CloseacReport,窗体名功能:关闭指定报表语法格式二:DoCmd.Close功能:关闭当前报表(5)用DoCmd对象运行宏语法格式:DoCmd.RunMacro宏名功能:运行指定宏(6)用DoCmd对象退出Access语法格式:DoCmd.Quit功能:关闭所有Access对象和Access本身(7)用DoCmd对象执行宏语法格式:DoCmd.RunMacro宏名[,运行次数][,数值表达式]功能:运行指定宏说明:☆运行次数用于计算宏运行的次数☆数值表达式在每一次运行宏时进行计算,结果为False时,停止运行宏。二、VBA编程环境:VBEVBE是编辑VBA代码时使用的界面。在VBE编辑器中可以编写VBA函数和过程。使用Alt+F11可以实现数据库窗口和VBE之间的切换。1、VBE窗口的组成VBE使用多种窗口来显示不同对象或是完成不同任务。VBE的窗口主要包括:标准工具栏工程窗口属性窗口代码窗口对象组合框事件组合框监视窗口立即窗口本地窗口(1)标准工具栏▲Access视图▲插入模块……▲运行子过程/用户窗口▲中断运行▲终止运行/重新设计▲设计模式▲工程项目管理器▲属性窗体▲对象浏览器(各按钮的功能参见教材P260)(2)工程窗口(工程资源管理器)在Access中所谓工程就是指一个数据库应用系统。系统中所有的类对象和模块对象都在工程窗口中显示。工程窗口以层次结构列表的形式显示当前数据库中的所有模块文件。鼠标双击其中之一,即打开其代码窗口。▲【查看代码】按钮打开相应的代码窗口▲【查看对象】按钮打开相应的对象窗口▲【切换文件夹】按钮隐藏或显示对象分类文件夹(3)属性窗口属性窗口列出了选定对象的属性,以便查看、修改这些属性。若选取了多个控件,属性窗口中列出的是所有控件的共同属性。▲对象框用于选择对象▲属性列表用于显示和修改对象的属性。属性列表可以按分类或按字母进行排序。直接在属性窗口中设置对象的属性,称“静态”设置;在代码窗口中,用VBA代码设置对象属性称“动态”设置。(4)代码窗口代码窗口用于显示、编写及修改VBA代码。系统允许打开多个代码窗口,以查看不同窗体或模块中的