已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Access2000快餐第一部分(共十一章) Access2000快餐(共十一章) 一 Access 简介 作为Microsoft的office套件产品之一,access已经卖出了近700万份,成为世界上最流行的桌面数据库系统。Access与许多优秀的关系数据库一样,可以让你很容易地连接相关的信息而且还对其他的数据库系统有所补充。它能操作其它来源的资料,包括许多流行的PC数据库程序(如dBASE,Paradox,Microsoft FoxPro)和服务器、小型积极大型机上的许多SQL数据库。Access还完全支持Microsoft的OLE技术。 Access还提供windows操作系统的高级应用程序开发系统。Access与其它数据库开发系统之间相当显著的区别就是:您不用写一行代码,就可以在很短的时间里开发出一个功能强大而且相当专业的数据库应用程序,并且这一愉快的过程是完全可视的!如果您能给它加上简短的VBA代码,那么您的程序决不比专业程序员潜心开发的程序差。1.Access的总体结构 Access将所有有名字的东西都成为对象(object),在Access 2000中,最重要的对象有表,查询,窗体,报表,宏和模块。表 用户定义的存储资料的对象。每一个表都包含有关某个主体的信息。表包括存储不同种类资料的字段(列),而记录(行)则收集特定主体实例的所有信息。查询 为来自一个或多个表的资料提供定制视图的对象。在Access中,可以利用图形化的实例查询机制(QBE)或通过SQL语句来建立查询。你可以在查询中选择、更新、插入或删除资料,也可以用查询来建立新表。窗体 窗体是主要的人机接口。大量的操作(几乎所有)都要通过窗体完成。窗体通过运行宏(macro)或Visual Basic for Applicatinns(VBA)过程,来响应大量的事件。Access 2000为我们提供了强大的(同时也是相当方便的向导)来建立标准的Windows窗体。报表 为格式化、计算、打印选定资料而设计的对象。它是衡量一个优秀的数据库的重要标准(有时甚至是唯一的标准)。宏 为了响应已定义的事件,需要让Access去执行一个或多个操作,而宏就是对这些操作的结构化的定义对象。它可以让你像堆积木一样建立一个功能强大的程序,而无须写大量的代码。模块 包括用VBA编码的定制过程的一个对象。模块提供了独立的动作流以捕获错误,而宏做不到。模块能直接响应窗体或报表事件,也可以从应用程序的任何地方被调用。二 为何要选择AccessAccess 功能强大,使用方便,是开发桌面数据库的最优秀的工具之一。如果你具有下面的情况,就应该考虑选择Access。1 我要建立一个数据库系统,却不愿因此而去系统地区学习编程。2 我略懂编程,希望能够建立一个专业的数据库系统。3 我精通C+,但我发现要用它做许多复杂的报表是一件令人头疼的事。4 我有大量的资料要处理,却不会写SQL语句。5 我精通多种数据库语言,但我希望工作更轻松一些。三 VBA for Access 语言入门 Access 本身具有强大的向导机制,能提供大量的数据库常用操作。但如果你能适当的加上少量的代码,那么你的程序将是专业级的。这一切都靠VBA。VBA(Visual Basic for Applications)是Microsoft Office 系列的内置编程语言,功能强大,面向对象(OOP),非常适合入门级学习。如果你有Visual Basic 基础,那么你的学习将更加轻松而有效率。(一) 理解对象、属性、方法和事件同其它任何面向对象的编程语言一样,VBA里也有对象、属性、方法和事件。所谓对象,就是代码和数据的组合,可将它看作单元,例如,表、窗体或文本框等都是对象。每个对象由类来定义。所谓属性,是指定义了对象特性,像大小、颜色、对象状态等。所谓方法指的是对象能执行的动作,如刷新等。事件是一个对象可以辨认的动作,像单击鼠标或按下某键等,并且可以写某些代码针对此述动作来做响应。简单的说,有一个苹果,这是一个对象。它是红的。那是它的颜色属性color=红。如果苹果变甜了,这就是它成熟的方法。这时你上去咬它一口,发生了“咬”的事件;其后果就是苹果不再完整,而你感觉到甜味。在VBA中,比如,一个窗口上有一个“关闭”按钮,这是两个“对象”。窗口及按钮的颜色、大小是它们的属性。当你按下“关闭”按钮时,发生关闭事件,窗口关闭。一个例子:新建一个窗体。放置两个按钮和一个文本框控件。按钮的名称分别定义为“com显示”、“com清除”;按钮的标题分别定义为“显示”、“清除”。文本框的名称定义为“txt你好”。然后在窗体模块窗体中写入以下代码:(后的文字为代码注释)Option Compare DatabasePrivate Sub com清除_Click() 单击清除按钮事件Me.txt你好.SetFocus SetFous方法,使文本框具有焦点Me.txt你好.Text = 使文本框的Text属性为“”(空)End Sub 结束过程Private Sub com显示_Click() 单击显示按钮事件Me.txt你好.SetFocus SetFous方法,使文本框具有焦点Me.txt你好.Text = 你好!欢迎学习VBA 使文本框的Text属性为“你好”End Sub 结束过程Private Sub Form_Load() 窗体加载事件Me.Caption = 欢迎! 设使窗体的Caption(标题)属性为“欢迎”End Sub运行该窗体,将得到类似下图所示结果:二) 语法基础 1如何在Access中写入代码所有VBA代码都以模块的方式保存在数据库里。创建模块有两种方法:作为模块对象或作为窗体或报表的对象的一部分。模块对象单击数据库窗口的模块按钮可查看模块对象。要创建一个新模块,应单击新建按钮。应当使用模块对象来定义能从查询或几个窗体或报表中使用的过程。模块中定义的公共过程可以从用程序的任何地方被调用。窗体和报表模块在窗体或报表类模块中,可以创建特别命名的事件过程来响应事件。可以通过在设计视图中打开窗体或报表,从视图菜单中选择代码来编辑该窗体或报表的模块。2程序的书写格式1)如何写注释语句通常,一个好的程序一般都有注释语句。这对程序的维护有很大的好处。即使是程序员自己,在一段时间以后,要读懂自己的程序,也并非一件容易的事假如没有注释的话。在VBA程序中,注释可以通过以下两种方式实现:(1)使用Rem语句Rem 注释语句(2) 用“”号注释语句(3) 一个例子Rem 声明两个变量Dim MyStr1,MyStr2MyStr1 = Hello:Rem 注释在语句之后要用冒号隔开。MyStr2 = Goodbye 这也是一条注释;无需使用冒号。2)如何连写和换行程序语句一般一句一行,但有时候可能需要在一行中写几句代码。这时需要用到“:”来分开不同意思的几个语句。例如:Dim MyName As StringMyName=“比尔盖茨”可以写成下面一行:Dim MyName As String :MyName=“比尔盖茨”有时一句代码太长,书写起来不方便,看上去也不美观,希望将一句代码分开写成几行。此时要用到空白加下划线“ _”。注意:_=Shift + - 。(三) 变量和常量1)除了使用VBA 代码来操作各种打开的窗体或报表的控件外,还可以在VBA 代码中声明和使用指定的变量来临时存储值、计算结果或操作数据库中的任意对象。例如:声明一个名为MyName的字符串变量Dim MyName As String给变量赋值MyName=“盖茨”改变量的值MyName=“乔布斯”在VBA 中,另一种存储资料的方法是使用常量。常量就是在应用程序的运行中不能改变的数值固定的资料对象。如:Null,True,False等。声明常量需要使用Const语句。例如要声明一个在所有模块中使用的常量PI:Public Const PI=3.1415926 这个值不能像上面例子中的变量那样改变或赋予新值2)变量和常量的作用域变量或常量的作用域决定了这个变量或常量只是被一个过程知道、被一个模块中的所有过程知道,还是被数据库所有过程知道。我们可以创建被数据库中所有过程使用的变量或常量(公共作用域),也可以创建只应用于一个模块中的过程或只应用于单个过程的变量或常量(私有作用域)。可以使用参数列表把值从一个过程传送到另一个过程,但这些值可能被保存在两个过程中不同名称的变量中。要声明一个公共变量,可以使用模块声明部分中的Public 语句。要声明一个公共常量,可以使用模块声明部分中带有Public 关键字的 Const 语句。要声明可被模块中所有过程使用的变量或常量,可在该模块对象或该窗体或报表模块的声明部分定义这个变量或常量。要声明只能在特定过程中使用的变量或常量,可以把该变量或常量定义为这个过程的一部分。例如:Public Dim MyName As String 该变量可以在整个程序中被引用Dim MyName As String 该变量只能被变量所在的模块使用同样的,Public Const PI=3.1415926 常量PI可以所有模块中使用Const PI=3.1415926 常量PI只能在该模块中使用,要在其它模块中使用只能重新声明(四) 流程控制语句 程序员最基本和最重要的工作就是要告诉计算机何时要做出什么样的动作。就像一个交通警察指挥大量的车辆和行人何时该走、何时该停、该项哪边走一样。流程控制语句就是在这方面让计算机做出选择,来达到程序员的设计意图。1If条件语句if条件语句是我们最常用的一种分支语句。它符合人们通常的语言习惯和思维习惯。比如:if(如果)绿灯亮是真,then(那么)车就可以通行。Else(否则)车辆要等待行人通过。If条件语句有三种语法形式。1) 最简单的形式:if then2) 第二种是带有else(否则)的形式:if thenelseend if3)第三种是带有多重条件的形式:if thenelseif thenelseend if是一个数值或一个字符串表达式,可以用它来检查真或假。若为True(真),则执行紧接在关键字Then后面的一条或多条与句。若为False(假),这无论接下来是什么语句,程序都将检测下一个Else或执行Else关键字后面的语句。一个例子:要根据一个字符串是否以字母A到F,G到N或O到Z开头来设置整数值,可以写如下代码:Dim strMyString As String,strFirst As String,intVal As IntegerStrFirst=Mid( strMyString,1,1) Mid函数返回指定字符串中指定位置一定数目的字符。这里它返回strMyString字符串变量从第一个字符开始的一个字符。如果strMyString=“VBA”,则该函数返回“V”。If StrFirst=“A” And StrFirst=“G” And StrFirst=“O” And StrFirst=“A” And StrFirst=“G” And StrFirst=“O” And StrFirst=“Z” ThenGoTo OtoZ 跳转到OtoZ:GoTo 20ElseGoTo Other 跳转到Other:GoTo 20End IfAtoF: 以一个字符串在行首标志一个语句行IntVal=1 过程语句GtoN:IntVal=2OtoZ:IntVal=3Other:IntVal=420 Debug.Print intVal 以一个行号标志语句行上面例子中,“GoTo 20”这一句很重要。如果没有这一句,该过程可以运行,却将无法得到预期的结果。不妨试一下,想一想为什么会这样。从上面的例子可以看出,GoTo语句书写起来比较麻烦,更严重的是,GoTo语句用得太多,将会破坏程序流畅的结构,程序将会很难阅读及调试。因此,笔者建议除非万不得已,尽量少使用GoTo语句。3Select Case语句从上面的例子可以看出,如果条件非常复杂的时候,就像有十几个条件分支,如果还使用If语句就会显得相当累赘,而且程序变得不易阅读。这时我们可以使用Select Case 语句来写出结构清晰的程序。使用Select Case语句可以根据与值列表或范围进行比较的表达式的求值结果,来有条件地执行语句。其语法如下:Select CaseCaseCase ElseEnd Select其中的是任何数值或字符串表达式:是,而是表达式|表达式To表达式|Is表达式其中的是:=|=说明:如果与Case子句中的一个相匹配,则VBA将执行该子句后面的语句。如果中含有To关键字,则第一个表达式必须小于第二个表达式(如果是数值表达式,指的是数值大小;如果是字符串表达式,则指排序),且必须介于第一个表达式与第二个表达式之间。如果含有Is关键字,则表达式的值必须为真。如果有一个以上的Case子句与匹配,则VBA只执行第一个匹配的Case字句后面的语句组。如果前面的Case子句与都不匹配,则可在Case Else子句后面插入VBA执行的语句块。我们也可以把另一个Select Case语句放在Case子句后的语句中。一个例子:(还是用上文If语句的例子,注意比较两者的优缺点)Dim strMyString As String ,intVal As IntegerSelect Case Mid( strMyString,1,1)Case “A” To “F”IntVal=1Case “G” To “N”IntVal=2Case “O” To “Z”IntVal=3Case ElseIntVal=0End Select4For Next语句可以使用 For.Next 语句去重复一个语句块,而它的次数的数字是指定的。For 循环使用一个计数变量,当重复每个循环时它的值会增加或减少。其语法形式如下:For 计数器=初值To 末值 Step 步长Exit ForNext计数器计数器必须是一个数值变量,而不是数组或记录元素。VBA最开始把计数器的值设为初值。如果没有指定步长,则默认步长为+1。如果步长是正数或0,则只要计数器小于或等于末值,VBA在遇到相应的Next语句时,就把步长加到计数器上。可以改变For循环中的计数器值,但这将使你的过程很难调试。改变循环中的末值不会影响循环的执行。可以把一个For循环放在另一个For循环中。这样做时,必须为每个计数器选择不同的名字。一个例子:要列出MyBooks数据库中前五个查询的名称:声明dbBooks为一个数据库对象Dim dbBooks As DatabaseDim intI As Integer 声明一个整数变量指定dbBooks对象变量为当前数据库,CurrentDb()为当前数据库Set dbBooks=CurrentDb()循环从0到4、步长默认为1,循环5次For intI=0 To 4在Degug窗口打印出查询的名称Debug.Print dbBooks.QueryDefs(intI).Name如果intI 未达到4则继续循环,每次intI增加一个步长;否则退出循环Next intI5DoLoop语句用DoLoop语句可以定义要多次执行的语句块。我们也可以定义一个条件,当这个条件为假时,就结束这个循环。DoLoop语句有以下两种形式:DoWhile|UntilExit DoLoop或DoExit DoLoop While|Until上面格式中,是用来检测真(非零)或假(零或Null)的一个比较谓词或表达式。While子句和Until子句的作用正好相反。如果指定了一个While子句,则当是真,就继续执行。如果指定了Until子句,则当为真时,循环执行结束。如果把While或Until子句放在Do子句中,则必须满足条件才执行循环中的语句。如果把一个While或Until子句放在Loop子句中,则在检测条件前先执行循环中的语句。一个例子:新建一个“名单”表,其中有“姓名”字段。在该值段中输入三条记录:比尔盖茨;乔布斯;张朝阳。新建一个“窗体1”,放置一个名为“姓名列表”的列表框控件。在窗体模块中输入一下代码:Option Compare DatabasePrivate Sub Form_Load()Dim db As Database 声明数据库对象变量Dim recName As Recordset 声明记录集对象变量Dim strName As Field 声明字段对象变量Dim MyName(3) As String 声明一个存放“姓名”的数组Dim intI As Integer 声明一个整型变量Set db = CurrentDb() 指定数据库为当前数据库Set recName = db.OpenRecordset(名单) 将“名单”表读入记录集Set strName = recName!姓名 指定记录集“姓名字段”intI = 0Do Until recName.EOFMyName(intI) = strName 将“姓名”字段读入数组intI = intI + 1recName.MoveNext 读取记录集的下一行记录Loop以下为将数组赋给姓名列表的代码Me.姓名列表.RowSourceType = 值列表100 Me.姓名列表.RowSource = MyName(0)For intI = 1 To 3Me.姓名列表.RowSource = Me.姓名列表.RowSource & ; & MyName(intI)Next intIEnd Sub运行程序,将看到像下图一样的结果:一点提议:如果不要上面标为100的那一行代码,会得到什么样的结果?6With语句在引用对象的时候,你是否感到冗长的对象限定繁琐而累赘?如果你喜欢简单,那么用With可以简化代码中对复杂对象的引用。可以用With语句建立一个“基本”对象,然后用一个速记符号来引用这个对象上的对象、集合、属性或方法,直至终止With语句。其语法形式如下:WithEnd With一个例子:在上文“名单”表中增加“年龄”、“性别”、“工作单位”等三个字段,现在,我们要使用Recordset对象上的速记符号在该表中增加一条“丁磊”的信息:可以写入如下代码(新建一个命令按钮“添加”)Private Sub com添加_Click()Dim rst As Recordset, db As DatabaseSet db = CurrentDb()Set rst = db.OpenRecordset(名单) 将“名单”表读入记录集rst.AddNew 加入一个新行With rst!姓名 = 丁磊!性别 = 男!年龄 = 25!工作单位 = 网易.Update.CloseEnd WithEnd Sub运行该程序并打开名单表,其结果应该类似于下图:试想一下,如果不用With语句,这段代码该如何写?(五) 过程和函数 过程和函数就是能执行特定功能的语句块。多年来编程语言的发展趋势就是更注重代码的重用性,使程序结构更加清晰。其实函数也是过程,不过它是一种特殊的、能够返回值的Function过程。能否返回值,也是常说的过程和函数之间最大的区别。过程最大的好处就是在一个地方写了一个功能模块之后,如果要在其它地方实现同样的功能,不必将该代码重新写一遍,只要直接调用就行。(这么简单!)当你发现功能模块有错误时,不必在整个应用程序中查找错误,然后逐个改正逐句调试(事实上这是一件相当艰苦的事!)。此时你只需要改正过程和函数,调试成功,程序中所有引用的该过程或函数都将得到维护如果你有用到过程或函数的话!1 过程可以用Sub语句声明一个新的过程、它接受的参数和该过程中的代码。其语法格式如下:Public|PrivateStaticSub 子程序名()As 数据类型Exit SubEnd Sub使用Public关键字可以使这个过程适用于所有模块中的所有其它过程;用Private关键字可以使该子程序只适用于同一模块中的其它过程。一个例子:Access中,关闭窗体的命令是DoCmd.OPENFORM。我们要打开一个名为“窗体1”的窗体,加入错误捕获后代码如下:On Error GoTo Err_打开窗体 出错则转入错误处理程序DoCmd.OPENFORM 窗体1 打开窗体1Exit_打开窗体:Exit SubErr_打开窗体: 如果错误则弹出出错消息,并结束打开动作MsgBox Err.DescriptionResume Exit_打开窗体DoCmd.OPENFORM在一个应用程序中,我们会遇到大量的像打开窗口这样的操作,不妨将它写为以下过程:Sub 打开窗体(stDocName As String) 打开窗体过程,参数stDocName为需要打开的窗体名称On Error GoTo Err_打开窗体DoCmd.OPENFORM stDocName 打开指定窗体Exit_打开窗体:Exit SubErr_打开窗体:MsgBox Err.DescriptionResume Exit_打开窗体End Sub如果此时需要调用该过程打开名为“窗体1”的窗体,只需在相应地方键入:打开窗体(窗体1)一切就这么简单!你的程序窗口越多,应用过程工作更简便、维护更轻松!过程是如此方便,但如果你需要返回参数,就要用到函数了。在VBA中,提供了大量的内置函数。比如字符串函数Mid()、统计函数Max()等。在编程是直接引用就可以了,非常方便。但有时我们需要按自己的要求定制函数,比如我们需要计算半径为R的圆的面积A:A=3.14*R2但是,圆的半径时不确定的。我们不可能为每一个不同半径的园来写上相似的一段代码!那么,请用函数吧!用Function 语句可以声明一个新函数、它接受的参数、返回的变量类型及运行该函数过程的代码。其语法形式如下:Public|PrivateStaticFunction 函数名() As 数据类型函数名=Exit Function函数名=End Function对函数使用Public关键字,则所有模块的所有其它过程都可以调用它。用Private关键字可以使这个函数只适用于同一模块中的其它过程。当把一个函数说明为模块对象中的私有函数时,就不能从查询或宏或另一个模块中的函数调用这个函数。包含Static关键字时,只要含有这个过程的模块是打开的,则所有在这个过程中无论是显示还是隐含说明的变量值都将被保留。可以在函数名末尾使用一个类型声明字符或使用As子句来声明被这个函数返回的变量的数据类型。如果没有,则VBA将自动赋给该变量一个最合适的数据类型。对于上文所举求圆面积的问题,可写为如下函数:新建函数A,返回一个单精度型值;接受单精度型参数RPublic Function A (R As Single) As SingleOn Error GoTo Err_求解出错A=3.14*R2 求半径为R的圆的面积AExit_求解出错:Exit FunctionErr_求解出错:MsgBox Err.DescriptionResume Exit_求解出错End Function这样,一个面积函数就完成了。调用它时非常方便。如果你要计算半径为5的圆的面积,只要调用函数A:A(5)如果参数R是一个变量,则只需写如下代码:Dim myR As SingleA(myR)函数可以被查询、宏等调用。对于数据库中的计算控件特别有用。六) 实例篇 1.关于用代码控制数据格式的例子在编程过程中,我们也许会经常遇到这样的问题:我们希望一个数据能够按照我们的意图决定其格式。特别在数据库编程中,格式化数据就显得尤为重要。但往往不尽人意。虽然在文本框等控件中提供了诸如“格式”、“小数位数”等属性供我们选择,虽然很方便,但在某些情况下并不灵活。一个例子:在一个窗体上放置两个文本框:txt半径;txt面积;一个命令按钮”com计算”。在窗口模块中写入以下代码:Option Compare DatabasePublic Function a(R As Single) As Double 声明一个面积函数On Error GoTo Err_求解出错a = 3.14 * R 2 求半径为R的圆的面积AExit_求解出错:Exit FunctionErr_求解出错:MsgBox Err.DescriptionResume Exit_求解出错End FunctionPrivate Sub com计算_Click()Dim myR As SinglemyR = Me.txt半径Me.txt面积 = a(myR) 调用函数并传递参数End Sub程序运行时,在“txt半径”中输入半径数并回车,文本框“txt面积”中就立即显示出面积数。有时我们需要格式化数据的输入输出,并让面积四舍五入输出。则上述代码应该写成:Option Compare DatabasePublic Function a(R As Single) As Double 声明一个面积函数On Error GoTo Err_求解出错a = 3.14 * R 2 求半径为R的圆的面积AIf IsNull(a) = False Then 如果面积为真a = Round(a, 2) 对a保留2位小数四舍五入a = Format(a, #0.00) 确定a的格式为#0.00,其作用是当a为整数或一位小数时,用0补足小数位数End IfExit_求解出错:Exit FunctionErr_求解出错:MsgBox Err.DescriptionResume Exit_求解出错End FunctionPrivate Sub com计算_Click()Dim myR As SinglemyR = Me.txt半径Me.txt面积 = a(myR) 调用函数并传递参数End SubPrivate Sub txt半径_GotFocus() 文本框获得焦点Me.txt半径.InputMask = 00.00 将文本框“txt半径”的InputMask属性定义为“#0.00”。End SubPrivate Sub txt半径_LostF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护士义工活动策划方案
- 夏装男装活动方案策划
- 老师种菜活动方案策划
- 木垒地坪施工方案
- 校园安全教育周防人贩子专题测试题及答案公布
- 医疗行业安全培训考试试题及答案详解
- 心电监护仪操作规范及测试题目
- 2025年下学期高二数学数学史知识试题
- 合作收购协议书合同
- 医院资质借用协议书
- 箱式变电站技术规范书
- YDT 5206-2023宽带光纤接入工程技术规范
- 2024年河南省许昌市中考英语一模试卷
- 警察心理健康知识讲座
- DB-T29-279-2020天津市城市轨道交通结构安全保护技术规程
- 内燃机车柴油机 课件 项目2 内燃机车柴油机结构认知1
- 《炼丹术中的化学》课件
- 专题10 圆锥曲线综合大题 (解析版)
- 后工序考试试题(4组)
- 显示屏改造方案
- 《烹饪美学》课件-项目五-饮食器具造型艺术
评论
0/150
提交评论