《Access数据库基础 第8章模块与VBA编程.pptx》由会员分享,可在线阅读,更多相关《Access数据库基础 第8章模块与VBA编程.pptx(112页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第8章模块与VBA编程,Access数据库基础,虽然Access的交互操作功能非常强大且易于掌握,但是在实际的数据库应用系统中,用户还是希望尽量通过自动操作来达到数据库管理的目的。应用程序设计语言在开发中的应用,可以加强对数据库管理应用功能的扩展。Office中包含VisualBasicforApplication(VBA)。VBA具有与VisualBasic相同的语言功能,它为Access提供了无模式用户窗体以及支持附加ActiveX控件等功能。,本章学习目标通过本章的学习,学生应初步了解模块、变量、函数、类、对象等,掌握三种基本结构的程序设计方法,同时学会编写VBA的过程和模块,能够进行简
2、单的数据库编程及调试方法。,8.1模块的基本概念,模块是Access2010数据库中的一个对象,是一个为了实现事件响应而编写的VBA(可视化基础应用语言)代码集合。模块由声明、语句和过程(Sub和Function)组成。宏和模块都能实现事件响应。宏简单易学,但功能有限,只能实现一个简单的应用系统;模块虽复杂,但功能强大,它除了能实现宏所能实现的所有功能外,还可以实现宏所不能实现的功能,适用于较复杂应用系统的设计。8.1.1模块的分类模块主要可以分为两大类:类模块和标准模块。1.类模块:窗体和报表模块类模块侧重局部作用。作用范围是所属窗体或报表的内部,生命周期随窗体或报表的创建而开始,关闭而结束
3、。其主要用于实现本窗体或报表的功能与其他对象的联系。,8.1模块的基本概念,2.标准模块:公共模块标准模块侧重全局作用。作用范围为整个应用程序,生命周期随应用程序的运行而开始,关闭而结束。其主要用于放置一些供类模块调用的公共变量或过程。程序设计的逻辑关系是比较简洁的,程序的基本单位是语句,若干语句放在一块作为一个独立的单位称过程,若干过程放到一个模块中实现功能。Access2010中的模块包括窗体模块、标准模块和类模块,这些模块都放到工程窗口中(所谓工程就是程序)。8.1.2模块的组成每个模块都包括声明和过程两个部分。声明部分用于声明模块中使用的变量;过程部分是模块的主要组成单元。一个模块由若
4、干个过程组成,子过程(Sub)和函数过程(Function)是过程的两种类型。,8.1模块的基本概念,1.Sub子过程Sub子过程又称为子程序,功能是自定义的语句。一般实现一个简单的功能,无返回值,可以作为独立的事件过程,也可以供其他过程调用。其格式如下:Sub子过程名(参数表列)程序代码EndSub下面所示的代码是一个Sub子过程的源代码,从中可以看到一个Sub子过程的格式。,8.1模块的基本概念,8.1模块的基本概念,2.Function函数过程Function函数过程又称为自定义函数,功能是自定义的操作符。有返回值,不能作为独立的事件过程,主要供其他过程调用。其格式如下:Function
5、函数名(参数表列)程序代码EndFunction下面所示的代码是一个Function函数的源代码,从中可以看到一个Function函数过程的格式。,8.1模块的基本概念,在Access2010中,可以将创建好的宏转换为VBA代码,根据宏的类型区别,转换主要分为两种,第一种是转换窗体或报表中的宏,第二种是转换不属于任何窗体或报表的全局宏。,8.2VBA程序设计的概述,VBA是Access2010数据库中内嵌的编程语言,使用了面向对象的程序设计方法,提供了可视化的编程环境。利用VBA编程可以访问数据库,操作数据库中的记录。1.类和对象类和对象是面向对象编程技术中的最基本的概念。类是现实世界或思维世
6、界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。简而言之,类是对象的抽象,对象是类的具体实例。,8.2VBA程序设计的概述,Access2010中的表、查询、窗体、报表等都是数据库的对象,窗体和报表中也包含控件对象。Access内部提供的向导机制功能强大,能处理基本的数据库操作。在此基础上使用Access内嵌的VBA编写适当的程序代码,可以极大地改善程序功能。Access采用面向对象的程序开发环境,使用其中的VBA可以对表、查询、窗体、报表
7、、页、宏、模块等对象进行操作。2.属性和方法属性和方法描述了对象的性质和行为,其引用格式为“对象.属性”或“对象.方法”。Access中的对象可以是单一对象,也可以是对象的集合。,8.2VBA程序设计的概述,3.事件和事件过程事件是Access窗体或报表及其上的控件等对象可以“识别”的动作,例如在窗体上单击鼠标左键,那么窗体会捕捉到单击事件。在Access数据库系统中,可以通过两种方式处理窗体、报表、控件的事件响应。一种是使用宏对象来设置事件属性;另一种是为某个事件编写VBA代码来完成特定的响应动作,这样的事件响应代码也称为事件过程。【例8-1】新建一个窗体,如图8-1所示,其中包含一个按钮,
8、单击按钮打开“采购订单明细”窗体,命名新建立的窗体为“用VBA打开窗体”。,8.2VBA程序设计的概述,8.2VBA程序设计的概述,3.事件和事件过程事件是Access窗体或报表及其上的控件等对象可以“识别”的动作,例如在窗体上单击鼠标左键,那么窗体会捕捉到单击事件。在Access数据库系统中,可以通过两种方式处理窗体、报表、控件的事件响应。一种是使用宏对象来设置事件属性;另一种是为某个事件编写VBA代码来完成特定的响应动作,这样的事件响应代码也称为事件过程。【例8-1】新建一个窗体,如图8-1所示,其中包含一个按钮,单击按钮打开“采购订单明细”窗体,命名新建立的窗体为“用VBA打开窗体”。,
9、8.2VBA程序设计的概述,【解析】操作步骤如下:(1)打开“罗斯文”数据库,利用窗体设计器制作窗体,如图8-1所示,命名窗体为“用VBA打开窗体”。窗体上有1个按钮,按钮对应的标题是“打开采购订单明细”。(2)在“设计视图”下,选择“采购订单明细”按钮,在弹出的“属性表”对话框中选择“全部”标签,修改按钮名称为“OpenWindow”,如图8-2所示。,8.2VBA程序设计的概述,8.2VBA程序设计的概述,(3)在“设计视图”下,选择“采购订单明细”按钮,在弹出的“属性表”对话框中选择“事件”标签,如图8-3所示,在“单击”旁的下拉菜单中选择“事件过程”,再单击图片按钮,就进入了VBA代码
10、设计的窗体。,8.2VBA程序设计的概述,(4)在“PrivateSubOpenWindow_Click()”中的代码功能,就是名字为“OpenWindow”的按钮被单击时需要完成的任务。在本例中,希望单击按钮后打开“采购订单明细”窗体,因此在“PrivateSubOpenWindow_Click()”与“EndSub”中添加代码“DoCmd.OpenForm采购订单明细”,如图8-4所示。,8.2VBA程序设计的概述,(5)保存窗体,命名为“用VBA打开窗体”,运行窗体,单击按钮,测试单击按钮是否成功调用“采购订单明细”窗口。例8-1中,涉及了窗体中的单击事件,其实在Access2010中,
11、窗体、报表等对象涉及的事件有很多。例如,在如图8-2所示的操作中,修改了按钮的“名称”属性。所以在用VBA进行编程时,经常会用到一些属性和对象。,8.2VBA程序设计的概述,4.VBA常用属性用VBA编程时,常用属性见表8-1,和窗体有关的常用属性见表8-2,和文本框有关的常用属性见表8-3,和标签有关的常用属性见表8-4,和按钮有关的常用属性见表8-5,和图片框有关的常用属性见表8-6,和图像控件有关的常用属性见表8-7,和复选框有关的常用属性见表8-8,和选项按钮有关的常用属性见表8-9,和列表框有关的常用属性见表8-10,和组合框有关的常用属性见表8-11(组合框有许多属性和文本框、列表
12、框的属性相同)。,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设计的概述,在VBA编程中,除了例8-1中使用的单击事件外,还有许多事件可以提高编程的灵活性和效率,这些事件可以大致分为三类:VBA常用事件、控件常用事件、窗体常用事件。5.VBA常用事件用VBA编程时,常用事件见表8-12,和控件有关的常用事件见表8-13,和窗体有关的常用事件见表8-14。,8.2VBA程序设计的概述,8.2VBA程序设计的概述,8.2VBA程序设
13、计的概述,8.2.1数据类型和数据库对象Access数据库系统创建表对象时所涉及的字段数据类型大多在VBA中都有数据类型相对应。1.标准数据类型VBA不但可以使用类型说明标识符号来定义数据类型,还可以使用类型说明字符来定义数据类型,参见表8-15的VBA数据类型说明。,8.2VBA程序设计的概述,8.2VBA程序设计的概述,变体类型是一种特殊的数据类型,除了定长字符串类型及用户自定义类型外,还可以包含其他任何类型的数据。变体类型还可以包含其他Empty、Error、Nothing和Null特殊值。使用时,可以用VarType与TypeName两个函数来检查Variant中的数据。,8.2VBA
14、程序设计的概述,VBA中如果没有显式声明或使用符号来定义变量的数据类型,则默认为变体类型。虽然Variant数据类型十分灵活,但是使用这种数据类型最大的缺点在于缺乏可读性,即无法通过查看代码来明确其数据类型。2.用户定义数据类型在进行VBA编程时,应用过程中可以建立包含一个或多个VBA标准数据类型的数据类型,即用户定义数据类型。它不仅包含VBA的标准数据类型,还包含用户定义数据类型。用户定义数据类型可以在Type和EndType关键字间定义,定义格式如下:,8.2VBA程序设计的概述,Type数据类型名AsAsEndType例如:定义一个学生信息数据类型。,8.2VBA程序设计的概述,上述例子
15、定义了由Num(身份证号)、Name(姓名)、Sex(性别)和Age(年龄)4个分量组成的名为Worker的类型。当需要建立一个变量来保存包含不同数据类型字段的数据表的一条或多条记录时,用户定义数据类型就特别有用。一般用户定义数据类型使用时,首先要在模块区域中定义用户数据类型,然后显示以Dim,Public或Static关键字来定义此用户类型变量。用户定义类型变量的取值,可以指明变量名及分量名,两者之间用句号分隔。例如,定义一个新员工信息类型变量NewWorker并操作分址的例子如下:,8.2VBA程序设计的概述,可以用关键字With简化程序中重复的部分。例如,为上面NewWorker变量赋值
16、可以用:,8.2VBA程序设计的概述,8.2.2常量在VBA编程中,经常使用到文字常量、符号常量和系统常量。常量就是指程序运行中值始终保持不变的量。常量和变量是VBA语言中最基本的语言单位。1.文字常量文字常量的实质就是常数,例如,1024、1.024E-12等都是数值型常量;“版权所有:阳光考试”为字符型常量;#07/06/2014#为日期型常量。2.符号常量符号常量就是使用一个符号来表示常量的值,但是常量的具体类型要结合其值决定,格式如下:Const常量名称=或,8.2VBA程序设计的概述,例如,程序需要计算圆的面积,就会使用到圆周率,为了提高程序的可读性,通常都会使用常量来表达圆周率:C
17、onstPi=3.1416程序中需要使用圆周率的时候,不再直接使用数字3.1416,而是用Pi来代表圆周率常量。8.2.3变量所谓变量,是具有名称的一块存储空间,用来存储可变的数据内容。当程序需要操作某个变量时,就可以通过变量名对存储空间中的变量进行取出或写入。简而言之,变量是指程序运行中值可以改变的量。,8.2VBA程序设计的概述,在VBA中,变量名的命名是需要遵守规则的,常见的一些规则如下:1.变量名的制定应考虑到程序的可读性,最好尽量以符合变量的功能和意义来命名。2.变量名开头是英文字母。3.变量名中间可以是字母、数字、下划线的组合。4.变量名长度不能超过255个字符。5.变量名不区分大
18、小写字母。6.不可使用关键字或与函数名称相同的字来命名。,8.2VBA程序设计的概述,上面列举的规则是必须满足的,在实际的编程中,编程人员还会总结一些额外的命名规则和代码规范。一个好的命名规则和代码规范可以提高程序的可读性,减少错误发生的概率。不同的人有不同的规则和习惯,但在编程过程中,对于个人或工作组而言,通常建议遵守相同的命名规则和代码规范。8.2.4运算符和表达式在使用VBA编程时,会经常使用到VBA运算符,它是VBA程序的重要组成部分。运算符可以分为两大类:一类是通常意义上的运算符,即算术运算符、连接运算符、比较运算符和逻辑运算符;另一类是与语句相关的运算符,即赋值运算符和点运算符。,
19、8.2VBA程序设计的概述,运算符是程序表达式和语句的重要组成部分,通过使用运算符,可对VBA各种元素进行连接,形成VBA表达式或语句。可以说表达式是数字、字符串、常量、变量、对象成员以及运算符的组合。1.算术运算符和表达式算术运算符包括+(加法运算符)、-(减法运算符)、*(乘法运算符)、/(除法运算符)、(整除运算符)、Mod(取模运算符)、(乘幂运算符)。算术运算符的优先顺序依次为:乘幂运算符()乘法和除法运算符(*、/,两者没有优先顺序)整除运算符()取模运算符(Mod)加法和减法运算符(+、-,两者没有优先顺序)。若在同一代码中多次使用同一个算术运算符,则从左到右依次运算。需要注意的
20、是,使用括号可以改变优先顺序。,8.2VBA程序设计的概述,由算术运算符、数值、括号和正负号构成的表达式称为算术表达式,在算术表达式中,括号和正负号的优先级比算术运算符要高,括号比正负号的优先级高,因此用小括号来确定表达式预期的运算顺序是程序员常用的技巧。2.连接运算符和表达式否则,再判断“条件2”,为True时,执行随后的语句,依次类推。当所有的条件都不满足时,执行Else后的语句。例如,下面的语句是通过对成绩分析进行成绩等级的判定。,8.3VBA程序结构,2.SELECTCase语句如果条件复杂,分支太多,使用If语句就会显得累赘,而且程序变得不易阅读。这时可使用SELECTCase语句来
21、写出结构清晰的程序。SELECTCase语句可根据表达式的求值结果,选择程序分支中的一个开始执行。其语法格式如下:,8.3VBA程序结构,在SELECTCase语句的语法中,SELECTCase后面的表达式是必要参数,可为任何数值表达式或字符串表达式。在每个Case后出现表达式,是多个“表达式”的列表。当程序执行到SELECTCase语句时,首先计算表达式的值,然后依次和每个表达式中的值进行比较,条件匹配时程序就会转入相应的语句序列,也不会执行后面的Case分支的语句序列。依次判断Case子句的“表达式”,执行第一个符合条件的Case后面的程序代码。如果有一个以上的Case语句“表达式”成立,
22、则VBA只执行第1个匹配的Case后面的“语句”。若所有的Case子句“表达式”都不成立,则执行CaseElse子句中的“语句”。例如,下面是改写上文If语句的成绩等级判定的例子。,8.3VBA程序结构,SELECTCaseScoreCase91To100Rating=ExcellentCase81To90Rating=GoodCase60To80Rating=AdequateCaseElseRating=NeedImprovementEndSELECT,8.3VBA程序结构,因为分数从1100是连续的分段区间,因此上面的代码也可以改成如下:,8.3VBA程序结构,8.3.3循环结构循环结构和
23、顺序结构、选择结构不同,循环结构中的语句将被反复执行,直到满足某个特定的条件,这对于需要重复执行某些语句序列十分有效。1.DoLoop语句在许多实例中,用户需要重复一个操作直到满足给定条件才停止。例如,用户希望检査单词、句子或文档中的每一个字符,或对有许多元素的数组赋值。一个较为通用的循环结构的形式是DoLoop语句,它的语法格式如下:,8.3VBA程序结构,DoWhile|Until条件语句ExitDo语句Loop或Do语句ExitDo语句LoopWhile|Until条件,8.3VBA程序结构,其中,“条件”是可选参数,是数值表达式或字符串表达式,其值为True或False。如果条件为Nu
24、ll(无条件),则被当作False。While子句和Until子句的作用正好相反,如果指定了前者,则当为真时继续执行;如果指定了后者,则当为真时循环结束。如果把While或Until子句放在Do子句中,则必须满足条件才执行循环中的语句;如果把While或Until子句放在Loop子句中,则在检测条件前先执行。在DoLoop中可以放置ExitDo语句,随时停止DoLoop循环。ExitDo语句将控制权转移到紧接在Loop命令之后的语句。如果ExitDo使用在嵌套的DoLoop语句中,则ExitDo会将控制权转移到ExitDo所在位置的外层循环。例如下面的代码,通过循环为数组赋值。,8.3VBA程
25、序结构,DimArray(20)AsIntegerDimiAsIntegeri=0DoWhilei=20Array(i)=ii=i+1Loop2.WhileWend语句在VBA中支持WhileWend循环,它与DoWhileLoop结构相似,但不能在执行循环的过程中退出。它的语法格式为:,8.3VBA程序结构,While条件语句Wend如果条件为True,则所有的语句都会执行,一直执行到Wend语句。然后再回到While语句,并再一次检查条件,如果条件还为True,则重复执行;如果不为True,则程序会从Wend语句之后的语句继续执行。WhileWend循环也可以是多层的嵌套结构,每个Wend
26、匹配最近的While语句。例如为数组赋值的代码,也可以用WhileWend来实现,其语法格式如下:,8.3VBA程序结构,DimArray(10)AsIntegerDimiAsIntegeri=0Whilei=10Array(i)=Ii=i+1Wend在VBA中提供WhileWend结构是为了与Basic的早期版本兼容,应该逐渐习惯使用DoLoop语句这种结构化与适应性更强的方法来执行循环。,8.3VBA程序结构,3.ForNext语句For循环可以将一段程序重复执行指定的次数,循环中使用一个计数器,每执行一次循环,其值都会增加(或减少)。语法格式如下:For计数器=初值To末值步长语句Exi
27、tFor语句Next计数器,8.3VBA程序结构,其中,计数器是一个数值变量。若未指定步长,则默认为1。如果步长是正数或0,则初值应小于等于末值;否则,初值应大于等于末值。VBA在开始时,将计数器的值设为初值。在执行到相应的Next语句时,就把步长加(减)到计数器上。在循环中可以在任何位置放置ExitFor语句,以便随时退出循环。ExitFor经常结合条件判断语句(例如IfThen)使用,退出循环后继续执行Next之后的语句。可以将个ForNext循环嵌套在另一个ForNext循环中,组成嵌套循环。下面的代码使用ForNext循环为Array数组赋值。,8.3VBA程序结构,DimArray(
28、10)AsIntegerDimiAsIntegerFori=0To10Array(i)=iNexti4.ForEachNext语句ForEachNext语句针对一个数组或集合中的每个元素,重复执行一组语句。语法格式如下:,8.3VBA程序结构,ForEach元素In组或集合语句ExitFor语句Next元素ForEachNext语句中的元素用来遍历集合或数组中所有元素的变量。对于集合来说,这个元素可能是一个Variant变量、一个通用对象变量或任何特殊对象变量。对于数组而言,这个元素只能是一个Variant变量。组或集合是数组或对象集合的名称。,8.3VBA程序结构,如果集合非空,就会进入Fo
29、rEach块执行。一旦进入循环,便先针对组或集合中第一个元素执行循环体;然后对该组中其他的元素,也执行循环体,当组中的所有元素都执行完了,便会退出循环,然后继续执行Next后面的语句。可以在循环中的任何位置放置ExitFor语句,以便必要时退出循环。ExitFor经常结合条件判断语句使用(例如IfThen),并将控制权转移给紧接在Next之后的语句。可以将一个ForEachNext循环嵌套在另一个ForEachNext循环中,但是每个循环的元素必须是唯一的。下面的代码,定义了一个数组并赋值,然后使用了ForEachNext循环在“立即窗口”中打印数组中每一项的值。,8.3VBA程序结构,Sub
30、Example()DimArray(20)AsIntegerDimiAsIntegerDimjAsVariantFori=0To20Array(i)=iNextiForEachjInArrayDebug.PrintjNextjEndSub运行时在“立即窗口”中输出结果。,8.3VBA程序结构,8.3.4过程和模块过程是VBA代码的容器。在VBA中有3种过程,分别是子过程、函数过程和属性过程。虽然三者的功能有所重合,但是每种过程都有其独特的、高效的用途。而模块则是过程的容器。模块有两种基本类型:类模块和标准模块。模块中的每一个过程都可以是一个函数过程或一个子过程。1.子过程子过程是一系列由Sub
31、和EndSub语句所包括起来的VBA语句,它们会执行动作却不能返回一个值。常用子过程执行动作、计算数值、修改内置的属性参数。,8.3VBA程序结构,FunctionSum(XAsInteger,YAsInteger)DimTmpAsIntegerTmp=X+YInt_Sum=Tmp*2EndFunction3.属性过程Property过程是一系列的VisualBasic语句,它允许程序员去创建并操作自定义的属性。Property过程可以用来为窗体、标准模块以及类模块创建只读属性。声明Property过程的语法如下所示:,8.3VBA程序结构,Property过程通常是成对使用的,Propert
32、yLet与PropertyGet一组,而PropertySet与PropertyGet一组,这样声明的属性既可读又可写。如果单独使用一个PropertyGet过程声明一个属性,那么这个属性是只读的。下面的代码使用了PropertyLet语句,定义给属性赋值的过程,还使用了PropertyGet语句,定义获取属性值的Property过程。该属性用来标识画笔的当前颜色。,8.3VBA程序结构,8.3VBA程序结构,8.3VBA程序结构,4.类模块类模块是包含新对象定义的模块,模块中定义的过程成为该对象的属性和方法。类模块有3种基本变形:窗体类模块、报表类模块和自定义类模块。窗体类模块中包含了在指定
33、的窗体或其控制的范围内所触发的所有事件过程的代码。这些过程用于响应窗体中的事件。用事件过程来控制窗体的行为,对用户操作进行响应。报表类模块与窗体类模块类似,不同之处是其响应和控制的是报表的行为。自定义类模块允许用户定义自己的对象、属性和方法。,8.3VBA程序结构,5.标准模块在标准模块中,放置了整个数据库中均可使用的过程,这些过程不与任何对象相关联。单击“数据库”窗口中的“模块”选项卡,可以查看数据库中标准模块的列表。标准模块的数据只有一个备份,标准模块中一个公共变量的值改变后,后面的程序中再读取该变量时,它将得到改变后的值。当变量在标准模块中声明为Public时,它在工程中任何地方都是可见
34、的。而类模块中的Public变量,只有当对象变量含有对某一类模块实例的引用时才能访问。,8.4数据库编程,VBA提高了两个数据访问接口:DAO和ADO。通过数据访问接口,可以用VBA代码打开数据库进行数据表记录的增、删、改、查操作,还可以创建数据库、表、查询、字段、索引等对象。8.4.1数据库引擎及访问的数据类型MicrosoftOfficeVBA是通过MicrosoftJet数据库引擎工具来支持对数据库的访问的。所谓数据库引擎实际上是一组动态链接库(DLL),当程序运行时被连接到VBA程序而实现对数据库的数据访问功能。数据库引擎是应用程序与物理数据库之间的桥梁,它以一种通用接口的方式,使各种
35、类型物理数据库对用户而言都具有统一的形式和相同的数据访问与处理方法。,8.3VBA程序结构,在MicrosoftOfficeVBA中主要提供了3种数据库访问接口:开放数据库互连应用编程接口(OpenDatabaseConnectivityAPI,ODBCAPI)、数据访问对象(DataAccessObject,DAO)和ActiveX数据对象(ActiveXDataObjects,ADO)。VBA访问的数据库主要有以下几种:1.JET数据库,即MicrosoftAccess。2.ISAM数据库,如dBase、FoxPro等。ISAM(IndexedSequentialAccessMethod,
36、索引顺序访问方法)是一种索引机制,用于高效访问文件中的数据行。3.ODBC数据库,如MicrosoftSQLServer、Oracle等。,8.4数据库编程,8.4.2数据访问对象(DAO)1.数据访问对象(DAO)是VBA提供的一种数据访问接口。它包括数据库创建、表和查询的定义等工具,借助VBA代码可以灵活地控制数据访问的各种操作。(1)DBEngine对象:表示数据库引擎,是DAO模型上层的对象,用户无法被创建和声明,主要用于管理其他对象。(2)Workspace对象:表示工作区。每一个应用程序只能有一个DBEngine对象,但可以有多个Workspace对象,这些Workspace对象都
37、包含在Workspace集合中。,8.4数据库编程,(3)Database对象:表示操作的数据库对象。每个Workspace对象都包含了一个Database对象,对应一个数据库,它里面包含了许多用于操作数据库的对象。这些对象中,有一些是Jet数据库专用的,如Container、TableDef和Relation对象,有一些则是对所有数据库都有用的,如RecordSet对象和QueryDef对象。(4)RecordSet对象:表示数据库中一个表或一个查询结果的记录。通过RecordSet对象可对几乎所有数据进行操作。所有RecordSet对象均使用记录(行)和字段(列)进行构造。(5)Field
38、对象:代表在数据集中的某一列。(6)Error对象:提供与单个操作(涉及提供者)有关的数据访问错误的详细信息。,8.4数据库编程,(7)QueryDef对象:定义一个查询。2.Access2010利用DAO访问数据库时,首先要创建对象变量,然后通过对象方法和属性来进行操作,一般步骤如下:(1)声明对象变量。DimwsAsWorkspace(2)建立工作空间会话。DimdbAsDatabase(3)打开数据库。DimrsAsRecordSet,8.4数据库编程,(4)通过Set语句设置各对象变量的值。Set对象变量名=常量或已赋值的变量(5)通过对象的方法和属性进行操作。(6)关闭对象。对象变量
39、名.Close(7)回收对象变量占用的内存空间。Set对象变量名=Nothing一般的程序结构如下所示:,8.4数据库编程,8.4数据库编程,在使用DAO访问数据库之前,需要引用包含DAO对象和函数的库,先进入VBA编程环境,执行“工具”菜单的“引用”命令,再在弹出的“引用”对话框中,选中“MicrosoftOffice14.0AccessDatabaseEngineObjectLibrary”。8.4.3ActiveX数据对象(ADO)ActiveX数据对象(ADO)是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统,可以对来自多种数据提供者的数据进行读取和写入操作。1.Er
40、ror对象:表示数据提供程序出错时的扩展信息。2.Connection对象:建立到数据源的连接。3.Command对象:表示一个命令。,8.4数据库编程,4.RecordSet对象:表示数据操作返回的记录集合。5.Field对象:表示记录集中的字段。Connection对象与RecordSet对象是两个ADO中最重要的对象。RecordSet对象可以分别与Connection对象和Command对象联合使用。在Access模块设计时要想使用ADO的各个组件对象,也应该增加对ADO库的引用。先进入VBA编程环境,执行“工具”菜单的“引用”命令,再在弹出的“引用”对话框中,选中“Microsoft
41、ActiveXDataObject2.1Library”。用ADO访问数据库时,应首先创建对象变量,然后用对象的方法和属性访问数据库(用ADO访问数据库的步骤与用DAO的类似)。,8.5程序的调试,程序中的错误通常称为Bug。在程序中查找和修改错误的过程称为调试。几乎所有的程序设计语言都提供了调试方法。调试是程序开发中必不可少的重要环节。8.5.1VBA程序错误类型调试是用于查找和解决MicrosoftVisualBasic代码中的错误的过程。当代码运行时,可能会产生三种类型的错误:编译错误、运行错误和逻辑错误。,8.5程序的调试,1.编译错误编译错误通常是代码结构错误的结果。可能是忘了语句配
42、对(如If和EndIf或For和Next),或有编程上的错误,违反了MicrosoftVisualBasic的规则(例如,拼写错误、少一个分隔符或类型不匹配等错误)。另外,编译错误也包含语法错误,它们是文法或标点符号中的错误,包括不匹配的括号或给函数参数传递的无效的数值。2.运行错误运行错误发生在应用程序开始运行的过程中。运行错误包括企图执行非法运算,例如,被零除或向不存在的文件中写入数据。,8.5程序的调试,3.逻辑错误逻辑错误指应用程序未按预期执行,或生成了错误的结果。此类错误通常是程序的算法设计错误导致的,但并不违反程序设计语言的语法规定,而且也没有发生运行错误。为了帮助区分这三种类型的
43、错误,并监视代码如何运行,MicrosoftVisualBasic编辑器提供了调试工具,使用调试工具可以逐行调试代码、检查或监视表达式和变量的值,以及跟踪过程调用。,8.5程序的调试,8.5.2VBA程序的调试方法程序调试需要经验和耐心。在发现错误的输出结果后,可以通过在程序可疑的出错位置加入中间变量的输出语句来分析程序执行的中间过程。通常可以用“立即窗口”的输出语句、设置断点、使用调试窗口、编写错误处理语句等方法来进行调试。1.Debug.Print语句在程序代码中加入DebugPrint语句,可以在屏幕上显示变量当前的值,对程序的执行情况进行监视。,8.5程序的调试,假设程序中有变量x,如
44、果在程序调试过程中需要显示该变量的变化情况,那么就可以在程序代码中适当的位置加上以下语句:Debug.Printx,如此一来,在程序调试过程中,x的当前值就可以显示在“立即窗口”中。在一个程序代码中可以使用多个Debug.Print语句,也可以对同一变量使用多个Debug.Print语句,这是因为Debug.Print语句对程序没有影响,它不会改变所有对象或者变量的值。2.设置断点断点就是引起程序暂时停止运行的地方。在程序中设置断点是很有效的程序调试方法,其作用主要是为了更好地观察程序的运行情况。一般来讲,在程序中的适当位置设置了断点后,在程序暂停时,就可以在“立即窗口”中显示程序中各个变量的
45、情况。除了Dim语句外,用户可以在程序的任何地方设置断点。实现在程序中设置断点的操作步骤如下:,8.5程序的调试,(1)把光标定位在需要停止运行的程序行。(2)在某一代码行旁边单击,会出现一个圆点,表示该行设置为断点行,或选择菜单栏上的“调试”“切换断点”命令,还可以按F9键设置断点。(3)当程序运行到断点时自动停下,在“本地窗口”中就会显示当前变量的值。3.调试窗口“监视窗口”“立即窗口”“快速监视”工具条等共同构成调试环境。灵活地使用这些调试工具可以提高调试工作效率。,8.5程序的调试,(1)打开“监视窗口”。用户可以在表达式位置进行监视表达式的修改或添加,选择“删除监视”项则会删除存在的
46、监视表达式。通过在监视窗口增添监视表达式的方法,程序可以动态了解一些变量或表达式的值的变化情况,进而对代码的正确与否有清楚的判断。(2)在中断模式下,先在程序代码区选定某个变量或表达式,然后单击“快速监视”工具按钮,则打开“快速监视”窗口,从中可以快速观察到该变量或表达式的当前值,达到快速监视的效果。如果需要,还可以单击“添加”按钮,将该变量或表添加到随后打开的“监视窗口”窗口中,以作进一步分析。,8.5程序的调试,4.出错处理利用上述调试方法,可以调试处理程序中的运行错误和逻辑错误。用户在程序中还可以加入专门的出错处理子程序,对错误作出响应。当程序发生错误时可以捕捉到错误,并由事先编好的程序来处理错误,而不是出错停止。(1)设置出错陷阱。在程序代码中使用ONError语句,当错误发生时可以拦截错误。通常有以下3种语句格式:ONErrorResumeNext从发生错误的语句的下一个语句处继续执行程序。,8.5程序的调试,ONErrorGoTo语句标号当发生错误时,直接跳转到语句标号位置所示的出错代码。ONErrorGoTo0当错误发生时,不使用出错处理程序。(2)编写出错处理代码。用户可以在程序中编写专门的出错处理代码段,在程序发生错误的时候,程序的流向将转到出错处理代码。,谢谢观看THANKYOU,