一 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编码的定制过程的一个对象。模块提供了独立的动作流以捕获错误,而宏做不到。模块能直接响应窗体或报表事件,也可以从应用程序的任何地方被调用。 二 为何要选择Access Access 功能强大,使用方便,是开发桌面数据库的最优秀的工具之一。如果你具有下面的情况,就应该考虑选择Access。 1 我要建立一个数据库系统,却不愿因此而去系统地区学习编程。 2 我略懂编程,希望能够建立一个专业的数据库系统。 3 我精通C++,但我发现要用它做许多复杂的报表是一件令人头疼的事。 4 我有大量的资料要处理,却不会写SQL语句。 5 我精通多种数据库语言,但我希望工作更轻松一些。 [NextPage] 三 VBA for Access 语言入门 Access 本身具有强大的向导机制,能提供大量的数据库常用操作。但如果你能适当的加上少量的代码,那么你的程序将是专业级的。这一切都靠VBA。 VBA(Visual Basic for Applications)是Microsoft Office 系列的内置编程语言,功能强大,面向对象(OOP),非常适合入门级学习。如果你有Visual Basic 基础,那么你的学习将更加轻松而有效率。 (一) 理解对象、属性、方法和事件 同其它任何面向对象的编程语言一样,VBA里也有对象、属性、方法和事件。所谓对象,就是代码和数据的组合,可将它看作单元,例如,表、窗体或文本框等都是对象。每个对象由类来定义。所谓属性,是指定义了对象特性,像大小、颜色、对象状态等。所谓方法指的是对象能执行的动作,如刷新等。事件是一个对象可以辨认的动作,像单击鼠标或按下某键等,并且可以写某些代码针对此述动作来做响应。 简单的说,有一个苹果,这是一个对象。它是红的。那是它的颜色属性color=红。如果苹果变甜了,这就是它成熟的方法。这时你上去咬它一口,发生了“咬”的事件;其后果就是苹果不再完整,而你感觉到甜味。在VBA中,比如,一个窗口上有一个“关闭”按钮,这是两个“对象”。窗口及按钮的颜色、大小是它们的属性。当你按下“关闭”按钮时,发生关闭事件,窗口关闭。 一个例子: 新建一个窗体。放置两个按钮和一个文本框控件。按钮的名称分别定义为“com显示”、“com清除”;按钮的标题分别定义为“显示”、“清除”。文本框的名称定义为“txt你好”。然后在窗体模块窗体中写入以下代码:(’后的文字为代码注释) Option Compare Database Private 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 运行该窗体,将得到类似下图所示结果: [NextPage] 二) 语法基础 1.如何在Access中写入代码 所有VBA代码都以模块的方式保存在数据库里。创建模块有两种方法:作为模块对象或作为窗体或报表的对象的一部分。 模块对象 单击[数据库]窗口的[模块]按钮可查看模块对象。要创建一个新模块,应单击[新建]按钮。应当使用模块对象来定义能从查询或几个窗体或报表中使用的过程。模块中定义的公共过程可以从用程序的任何地方被调用。 窗体和报表模块 在窗体或报表类模块中,可以创建特别命名的事件过程来响应事件。可以通过在[设计]视图中打开窗体或报表,从[视图]菜单中选择[代码]来编辑该窗体或报表的模块。 2.程序的书写格式 1)如何写注释语句 通常,一个好的程序一般都有注释语句。这对程序的维护有很大的好处。即使是程序员自己,在一段时间以后,要读懂自己的程序,也并非一件容易的事——假如没有注释的话。 在VBA程序中,注释可以通过以下两种方式实现: (1)使用Rem语句 Rem 注释语句 (2) 用“’”号 ’注释语句 (3) 一个例子 Rem 声明两个变量 Dim MyStr1,MyStr2
2)如何连写和换行 程序语句一般一句一行,但有时候可能需要在一行中写几句代码。这时需要用到“:”来分开不同意思的几个语句。例如: Dim MyName As String MyName=“比尔盖茨” 可以写成下面一行: 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只能在该模块中使用,要在其它模块中使用只能重新声明 [NextPage] (四) 流程控制语句
程序员最基本和最重要的工作就是要告诉计算机何时要做出什么样的动作。就像一个交通警察指挥大量的车辆和行人何时该走、何时该停、该项哪边走一样。流程控制语句就是在这方面让计算机做出选择,来达到程序员的设计意图。 1.If条件语句 if条件语句是我们最常用的一种分支语句。它符合人们通常的语言习惯和思维习惯。比如:if(如果)绿灯亮是真,then(那么)车就可以通行。Else(否则)车辆要等待行人通过。 If条件语句有三种语法形式。 1) 最简单的形式: if <条件>then<该条件产生的结果(过程)> 2) 第二种是带有else(否则)的形式: if <条件> then <过程语句1> else <过程语句2> end if 3)第三种是带有多重条件的形式: if <条件1> then <过程语句1> elseif <条件2> then <过程语句2>… else <过程语句n> end if <条件>是一个数值或一个字符串表达式,可以用它来检查真或假。若<条件>为True(真),则执行紧接在关键字Then后面的一条或多条与句。若<条件>为False(假),这无论接下来是什么语句,程序都将检测下一个Else<条件>或执行Else关键字后面的语句。 一个例子: 要根据一个字符串是否以字母A到F,G到N或O到Z开头来设置整数值,可以写如下代码: Dim strMyString As String,strFirst As String,intVal As Integer StrFirst=Mid( strMyString,1,1) ’Mid函数返回指定字符串中指定位置一定数目的 ’字符。这里它返回strMyString字符串变量从第 ’一个字符开始的一个字符。如果strMyString= ’“VBA”,则该函数返回“V”。 If StrFirst>=“A” And StrFirst<=“F” Then IntVal=1 ElseIf StrFirst>=“G” And StrFirst<=“N” Then IntVal=2 ElseIf StrFirst>=“O” And StrFirst<=“Z” Then IntVal=3 Else IntVal=0 End If 2.GoTo 语句 用GoTo语句可以无条件地跳到过程中的另一条语句上。其语法格式有两种: 第一种: GoTo 标志 第二种: GoTo 行号 可以用一个字符串在行首标志一个语句行,这个字符串不超过40个字符,并以一个字母字符开头,以一个冒号(:)结束。行标志不能用VBA或Access的保留字。也可以选择对过程中的语句行编号。每一个行号必须只含有数字,而且必须与过程中的所有其它行号不同,必须是一行中的第一个非空格字符,且包含的字符个数不能超过40。为了跳到某个行号或标志行上,可以使用GoTo语句及相应的标志或行号。 一个例子:(因为一般GoTo 语句到要结合If语句使用,因此这里还是使用上面If语句的例子进行改写) Dim strMyString As String ,strFirst As String ,intVal As Integer StrFirst=Mid( strMyString,1,1) If StrFirst>=“A” And StrFirst<=“F” Then GoTo AtoF ’跳转到AtoF: GoTo 20 ’跳转到行号为20的那一句 ElseIf StrFirst>=“G” And StrFirst<=“N” Then GoTo GtoN ’跳转到GtoN: GoTo 20 ElseIf StrFirst>=“O” And StrFirst<=“Z” Then GoTo OtoZ ’跳转到OtoZ: GoTo 20 Else GoTo Other ’跳转到Other: GoTo 20 End If AtoF: ’以一个字符串在行首标志一个语句行 IntVal=1 ’过程语句 GtoN: IntVal=2 OtoZ: IntVal=3 Other: IntVal=4 20 Debug.Print intVal ’以一个行号标志语句行 上面例子中,“GoTo 20”这一句很重要。如果没有这一句,该过程可以运行,却将无法得到预期的结果。不妨试一下,想一想为什么会这样。 从上面的例子可以看出,GoTo语句书写起来比较麻烦,更严重的是,GoTo语句用得太多,将会破坏程序流畅的结构,程序将会很难阅读及调试。因此,笔者建议除非万不得已,尽量少使用GoTo语句。 3.Select Case语句 从上面的例子可以看出,如果条件非常复杂的时候,就像有十几个条件分支,如果还使用If语句就会显得相当累赘,而且程序变得不易阅读。这时我们可以使用Select Case 语句来写出结构清晰的程序。 使用Select Case语句可以根据与值列表或范围进行比较的表达式的求值结果,来有条件地执行语句。其语法如下: Select Case<检验表达式> [Case<比较列表1> [<过程语句1>]] … [Case Else [<过程语句n>]] End Select 其中的<检验表达式>是任何数值或字符串表达式:<比较列表>是 {<比较元素>,…} 而<比较元素>是 {表达式|表达式To表达式| Is<比较操作符>表达式} 其中的<比较操作符>是: {=|<>|<|>|<=|>=} 说明: 如果<检验表达式>与Case子句中的一个<比较元素>相匹配,则VBA将执行该子句后面的语句。如果<比较元素>中含有To关键字,则第一个表达式必须小于第二个表达式(如果是数值表达式,指的是数值大小;如果是字符串表达式,则指排序),且<检验表达式>必须介于第一个表达式与第二个表达式之间。如果<比较元素>含有Is关键字,则<比较操作符>表达式的值必须为真。 如果有一个以上的Case子句与<检验表达式>匹配,则VBA只执行第一个匹配的Case字句后面的语句组。如果前面的Case子句与<检验表达式>都不匹配,则可在Case Else子句后面插入VBA执行的语句块。我们也可以把另一个Select Case语句放在Case子句后的语句中。 一个例子:(还是用上文If语句的例子,注意比较两者的优缺点) Dim strMyString As String ,intVal As Integer Select Case Mid( strMyString,1,1) Case “A” To “F” IntVal=1 Case “G” To “N” IntVal=2 Case “O” To “Z” IntVal=3 Case Else IntVal=0 End Select 4.For …Next语句 可以使用 For...Next 语句去重复一个语句块,而它的次数的数字是指定的。For 循环使用一个计数变量,当重复每个循环时它的值会增加或减少。其语法形式如下: For 计数器=初值To 末值 [Step 步长] [<过程语句>] Exit For [<过程语句>] Next[计数器] 计数器必须是一个数值变量,而不是数组或记录元素。VBA最开始把计数器的值设为初值。如果没有指定步长,则默认步长为+1。如果步长是正数或0,则只要计数器小于或等于末值,VBA在遇到相应的Next语句时,就把步长加到计数器上。可以改变For循环中的计数器值,但这将使你的过程很难调试。改变循环中的末值不会影响循环的执行。可以把一个For循环放在另一个For循环中。这样做时,必须为每个计数器选择不同的名字。 一个例子: 要列出MyBooks数据库中前五个查询的名称: ’声明dbBooks为一个数据库对象 Dim dbBooks As Database Dim 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 intI 5.Do…Loop语句 用Do…Loop语句可以定义要多次执行的语句块。我们也可以定义一个条件,当这个条件为假时,就结束这个循环。Do…Loop语句有以下两种形式: Do[{While|Until}<条件>] [<过程语句>] [Exit Do] [<过程语句>] Loop 或 Do [<过程语句>] [Exit Do] [<过程语句>] Loop [{While|Until}<条件>] 上面格式中,<条件>是用来检测真(非零)或假(零或Null)的一个比较谓词或表达式。While子句和Until子句的作用正好相反。如果指定了一个While子句,则当<条件>是真,就继续执行。如果指定了Until子句,则当<条件>为真时,循环执行结束。如果把While或Until子句放在Do子句中,则必须满足条件才执行循环中的语句。如果把一个While或Until子句放在Loop子句中,则在检测条件前先执行循环中的语句。 一个例子: 新建一个“名单”表,其中有“姓名”字段。在该值段中输入三条记录:比尔盖茨;乔布斯;张朝阳。新建一个“窗体1”,放置一个名为“姓名列表”的列表框控件。在窗体模块中输入一下代码: Option Compare Database Private 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 = 0 Do Until recName.EOF MyName(intI) = strName ' 将“姓名”字段读入数组 intI = intI + 1 recName.MoveNext '读取记录集的下一行记录 Loop '以下为将数组赋给姓名列表的代码 Me.姓名列表.RowSourceType = "值列表" 100 Me.姓名列表.RowSource = MyName(0) For intI = 1 To 3 Me.姓名列表.RowSource = Me.姓名列表.RowSource & ";" & MyName(intI) Next intI End Sub 运行程序,将看到像下图一样的结果: 一点提议:如果不要上面标为100的那一行代码,会得到什么样的结果? 6.With语句 在引用对象的时候,你是否感到冗长的对象限定繁琐而累赘?如果你喜欢简单,那么用With可以简化代码中对复杂对象的引用。可以用With语句建立一个“基本”对象,然后用一个速记符号来引用这个对象上的对象、集合、属性或方法,直至终止With语句。其语法形式如下: With<对象引用> [<过程语句>] End With 一个例子: 在上文“名单”表中增加“年龄”、“性别”、“工作单位”等三个字段,现在,我们要使用Recordset对象上的速记符号在该表中增加一条“丁磊”的信息:可以写入如下代码(新建一个命令按钮“添加”) Private Sub com添加_Click() Dim rst As Recordset, db As Database Set db = CurrentDb() Set rst = db.OpenRecordset("名单") ’将“名单”表读入记录集 rst.AddNew ’加入一个新行 With rst ![姓名] = "丁磊" ![性别] = "男" ![年龄] = "25" ![工作单位] = "网易" .Update .Close End With End Sub 运行该程序并打开名单表,其结果应该类似于下图: 试想一下,如果不用With语句,这段代码该如何写? [NextPage] (五) 过程和函数
过程和函数就是能执行特定功能的语句块。多年来编程语言的发展趋势就是更注重代码的重用性,使程序结构更加清晰。其实函数也是过程,不过它是一种特殊的、能够返回值的Function过程。能否返回值,也是常说的过程和函数之间最大的区别。 过程最大的好处就是在一个地方写了一个功能模块之后,如果要在其它地方实现同样的功能,不必将该代码重新写一遍,只要直接调用就行。(这么简单!)当你发现功能模块有错误时,不必在整个应用程序中查找错误,然后逐个改正逐句调试(事实上这是一件相当艰苦的事!)。此时你只需要改正过程和函数,调试成功,程序中所有引用的该过程或函数都将得到维护——如果你有用到过程或函数的话! 1. 过程 可以用Sub语句声明一个新的过程、它接受的参数和该过程中的代码。其语法格式如下: [Public|Private][Static]Sub 子程序名([<参数>])[As 数据类型] [<子程序语句>] [Exit Sub] [<子程序语句>] End Sub 使用Public关键字可以使这个过程适用于所有模块中的所有其它过程;用Private关键字可以使该子程序只适用于同一模块中的其它过程。 一个例子: Access中,关闭窗体的命令是DoCmd.OPENFORM。我们要打开一个名为“窗体1”的窗体,加入错误捕获后代码如下: On Error GoTo Err_打开窗体 ’出错则转入错误处理程序 DoCmd.OPENFORM "窗体1" ’打开窗体1 Exit_打开窗体: Exit Sub Err_打开窗体: ’如果错误则弹出出错消息,并结束打开动作 MsgBox Err.Description Resume Exit_打开窗体 DoCmd.OPENFORM在一个应用程序中,我们会遇到大量的像打开窗口这样的操作,不妨将它写为以下过程: Sub 打开窗体(stDocName As String) ’打开窗体过程,参数stDocName为需要打开 ’的窗体名称 On Error GoTo Err_打开窗体 DoCmd.OPENFORM stDocName ’打开指定窗体 Exit_打开窗体: Exit Sub Err_打开窗体: MsgBox Err.Description Resume Exit_打开窗体 End Sub 如果此时需要调用该过程打开名为“窗体1”的窗体,只需在相应地方键入: 打开窗体("窗体1") 一切就这么简单!你的程序窗口越多,应用过程工作更简便、维护更轻松! 过程是如此方便,但如果你需要返回参数,就要用到函数了。在VBA中,提供了大量的内置函数。比如字符串函数Mid()、统计函数Max()等。在编程是直接引用就可以了,非常方便。但有时我们需要按自己的要求定制函数,比如我们需要计算半径为R的圆的面积A: A=3.14*R^2 但是,圆的半径时不确定的。我们不可能为每一个不同半径的园来写上相似的一段代码!那么,请用函数吧! 用Function 语句可以声明一个新函数、它接受的参数、返回的变量类型及运行该函数过程的代码。其语法形式如下: [Public|Private][Static]Function 函数名([<参数>]) [As 数据类型] [<函数语句>] [函数名=<表达式>] [Exit Function] [<函数语句>] [函数名=<表达式>] End Function 对函数使用Public关键字,则所有模块的所有其它过程都可以调用它。用Private关键字可以使这个函数只适用于同一模块中的其它过程。当把一个函数说明为模块对象中的私有函数时,就不能从查询或宏或另一个模块中的函数调用这个函数。 包含Static关键字时,只要含有这个过程的模块是打开的,则所有在这个过程中无论是显示还是隐含说明的变量值都将被保留。 可以在函数名末尾使用一个类型声明字符或使用As子句来声明被这个函数返回的变量的数据类型。如果没有,则VBA将自动赋给该变量一个最合适的数据类型。 对于上文所举求圆面积的问题,可写为如下函数: ’新建函数A,返回一个单精度型值;接受单精度型参数R Public Function A (R As Single) As Single On Error GoTo Err_求解出错 A=3.14*R^2 ’求半径为R的圆的面积A Exit_求解出错: Exit Function Err_求解出错: MsgBox Err.Description Resume Exit_求解出错 End Function 这样,一个面积函数就完成了。调用它时非常方便。如果你要计算半径为5的圆的面积,只要调用函数A: A(5) 如果参数R是一个变量,则只需写如下代码: Dim myR As Single A(myR) 函数可以被查询、宏等调用。对于数据库中的计算控件特别有用。 [NextPage] (六) 实例篇
1.关于用代码控制数据格式的例子 在编程过程中,我们也许会经常遇到这样的问题:我们希望一个数据能够按照我们的意图决定其格式。特别在数据库编程中,格式化数据就显得尤为重要。但往往不尽人意。虽然在文本框等控件中提供了诸如“格式”、“小数位数”等属性供我们选择,虽然很方便,但在某些情况下并不灵活。 一个例子: 在一个窗体上放置两个文本框:txt半径;txt面积;一个命令按钮”com计算”。在窗口模块中写入以下代码: Option Compare Database Public Function a(R As Single) As Double '声明一个面积函数 On Error GoTo Err_求解出错 a = 3.14 * R ^ 2 '求半径为R的圆的面积A Exit_求解出错: Exit Function Err_求解出错: MsgBox Err.Description Resume Exit_求解出错 End Function Private Sub com计算_Click() Dim myR As Single myR = Me.txt半径 Me.txt面积 = a(myR) '调用函数并传递参数 End Sub 程序运行时,在“txt半径”中输入半径数并回车,文本框“txt面积”中就立即显示出面积数。有时我们需要格式化数据的输入输出,并让面积四舍五入输出。则上述代码应该写成: Option Compare Database Public Function a(R As Single) As Double '声明一个面积函数 On Error GoTo Err_求解出错 a = 3.14 * R ^ 2 '求半径为R的圆的面积A If IsNull(a) = False Then '如果面积为真 a = Round(a, 2) '对a保留2位小数四舍五入 a = Format(a, "###0.00") '确定a的格式为"###0.00", '其作用是当a为整数或一位小数时,用0 ’补足小数位数 End If Exit_求解出错: Exit Function Err_求解出错: MsgBox Err.Description Resume Exit_求解出错 End Function Private Sub com计算_Click() Dim myR As Single myR = Me.txt半径 Me.txt面积 = a(myR) '调用函数并传递参数 End Sub Private Sub txt半径_GotFocus() '文本框获得焦点 Me.txt半径.InputMask = "00.00" '将文本框“txt半径”的InputMask '属性定义为“#0.00”。 End Sub Private Sub txt半径_LostFocus() Me.txt半径.AutoTab = True '自动将焦点转移 Me.com计算.SetFocus '命令按钮“计算”具有焦点 End Sub 在属性页中,将Tab键顺序设置为:txt半径=0;txt面积=3;com计算=2。上面程序可以实现规范化输入、规范化输出,并自动转移焦点。 运行程序,应该如下图所示: 2. 打开、关闭窗口的例子 一个程序中,往往不止一个的窗体。那么,大量的窗体在程序中用代码关联起来,程序运行的时候才会有条不紊。可见,窗体操作在VBA总是很重要的。窗体操作有两个很重要的命令:DoCmd.openform(打开窗体);DoCmd.Close(关闭窗体)。下面我们举一个例子来说明这两个命令。 首先,新建一个窗体,放置一个名为“指定窗体”的标签、一个文本框“txt窗体”,两个命令按钮,分别是“com打开”、“com关闭”。然后在窗体模块中写入以下代码: Option Compare Database '声明存放窗体名称的变量,可以在模块中的任何位置引用 Public forName As String '新建打开窗体过程 Public Sub 打开窗体(stDocName As String) On Error GoTo Err_打开窗体 Dim stLinkCriteria As String '打开指定窗体并获得焦点 DoCmd.openform stDocName, , , stLinkCriteria Exit_打开窗体: Exit Sub Err_打开窗体: MsgBox Err.Description Resume Exit_打开窗体 End Sub '新建关闭窗体过程 Public Sub 关闭窗体(stDocName As String) On Error GoTo Err_关闭窗体 '关闭指定窗体并保存该窗体 DoCmd.Close acForm, stDocName, acSaveYes Exit_关闭窗体: Exit Sub Err_关闭窗体: MsgBox Err.Description Resume Exit_关闭窗体 End Sub '单击“打开”按钮所引发的事件 Sub com打开_Click() forName = Me.txt窗体 '将“txt窗体”的内容赋给窗体名称变量
最新评论|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 ) GMT+8, 2024-5-3 20:11 , Processed in 0.059230 second(s), 16 queries . Powered by Discuz! X3.3 © 2001-2017 Comsenz Inc. |