《(本科)第8章 模块与VBA编程ppt课件.pptx》由会员分享,可在线阅读,更多相关《(本科)第8章 模块与VBA编程ppt课件.pptx(138页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程主讲人:第8章 模块与VBA编程Access 2016数据库应用技术教程第8章 模块与VBA编程通过本章的学习,应该掌握以下内容:(1)VBA编程环境。(2)VBA编程的基本概念。(3)VBA程序设计基础。(4)VBA程序控制语句。(5)面向对象程序设计的基本概念。(6)VBA模块的创建、过程调用和参数传递。(7)VBA常用操作。(8)VBA的数据库编程技术。(9)VBA程序调试与错误处理。学习目标8.1 VBA的编程环境 Visual Basic 编辑器(VBE,Visual Basic Editor)是编辑VBA代码时使用的界面。VBE提供了完整的开发和调试工具,可以用于创建和编辑VB
2、A程序。8.1.1 打开VBE窗口在Access 2016中,打开VBE窗口有以下几种方法。n在数据库中,单击“数据库工具”选项卡“宏”组“Visual Basic”。n在数据库中,单击“创建”选项卡“宏与代码”选项组“Visual Basic”。n创建新的标准模块:单击“创建”选项卡“宏与代码”选项组“模块”,则在VBE编辑器中创建一个空白模块。8.1.1 打开VBE窗口n 如果已有一个标准模块,可选择“导航窗格”窗口上的“模块”对象,在模块对象列表中双击选中的模块,则在VBE编辑器中打开该模块。n 对于属于窗体或报表的模块可以打开窗体或报表的设计视图,单击属性窗口的“事件”页中某个事件框右
3、侧的“生成器”按钮 ,打开“选择生成器”对话框,选择其中的“代码生成器”选项即可。8.1.2 VBE窗口 VBE窗口由VBE工具栏、工程窗口、属性窗口和代码窗口组成,如图所示。 “工程”窗口 “属性”窗口 代码窗口 在两句之间输入代码 视图Microsoft Office Access8.1.2 VBE窗口1VBE工具栏VBE工具栏如图所示。8.1.2 VBE窗口2工程窗口工程窗口,也叫工程资源管理器,其中的列表框中列出了在应用程序中用到的模块文件。可单击“查看代码”按钮显示相应的代码窗口,或单击“查看对象”按钮,显示相应的对象窗口,也可单击“切换文件夹”按钮,隐藏或显示对象文件夹。8.1.2
4、 VBE窗口3属性窗口属性窗口中列出了所选对象的各种属性,分“按字母序”和“按分类序”两种格式查看属性。可以直接在属性窗口中编辑对象的属性,这种方法称对象属性的一种“静态”设置方法;此外,还可以在代码窗口内用VBA代码编辑对象的属性,这属于对象属性的“动态”设置方法。为了在属性窗口中显示Access类对象,应先在设计视图中打开对象。8.1.2 VBE窗口4代码窗口单击VBE窗口菜单栏中的“视图”菜单“代码窗口”命令,即可打开代码窗口。可以使用代码窗口来编写、显示以及编辑VBA程序代码。实际操作时,在打开各模块的代码窗口后,可以查看不同窗体或模块中的代码,并且在它们之间做复制以及粘贴的动作。双击
5、工程窗口上的一个模块或类,相应的代码窗口就会显示出来。8.1.2 VBE窗口5立即窗口 单击VBE窗口菜单栏中的“视图”菜单“立即窗口”命令,即可打开立即窗口。立即窗口是用来进行快速计算的表达式计算、简单方法的操作及进行程序测试的工作窗口。在代码窗口中编写代码时,要在立即窗口打印变量或表达式的值,可以使用Debug.Print语句。在立即窗口中使用“?”或“Debug.Print”语句显示表达式的值。8.1.2 VBE窗口6本地窗口 单击VBE窗口菜单栏中的“视图”菜单“本地窗口”命令,即可打开本地窗口。在本地窗口中,可自动显示出所有在当前过程中的变量声明及变量值。8.1.2 VBE窗口7监视
6、窗口 单击VBE窗口菜单栏中的“视图”菜单“监视窗口”命令,即可打开监视窗口。监视窗口用于调试 Visual Basic 过程,通过在监视窗口增添监视表达式的方法,程序可以动态了解一些变量或表达式的值的变化情况,进而对代码的正确与否有清楚的判断。8.2 VBA模块简介 模块是Access数据库中的一个数据库对象,它以VBA语言为基础编写,是 Access数据库中用于保存VBA程序代码的容器。模块由声明、语句和(Sub和Function)过程组成的集合,它们作为一个已命名的单元存储在一起,对VBA程序代码进行组织。 Access有两种类型的模块:标准模块和类模块。8.2.1 标准模块 标准模块包
7、含在数据库窗口的模块对象列表中,包括通用过程和常用过程,这些过程不与Access数据库文件中的任何对象相关联。也就是说,如果控件没有恰当的前缀,这些过程就没有指向Me(当前对象)或控件名的引用。8.2.2 类模块 类模块是包含类定义的模块,包括其属性和方法的定义。类模块有3种基本形式:窗体类模块、报表类模块和自定义类模块,它们各自与某一窗体或报表相关联。8.2.3 VBA代码编写模块的过程 过程是模块的主要单元组成,由VBA代码编写而成。过程分为两种类型:Sub子过程和Function函数过程。8.2.4 将宏转换为模块的过程 使用 Access 2016自动将宏转换为 VBA 模块或类模块。
8、可以转换附加到窗体或报表的宏,而不管它们是作为单独的对象存在还是作为嵌入的宏存在。还可以转换未附加到特定窗体或报表的全局宏。8.2.5 在模块中执行宏 在模块的定义过程中,使用Docmd对象的RunMacro方法,可以执行设计好的宏。其调用格式为:Docmd.RunMacro MacroName,RepeatCount ,RepeatExpression8.3 VBA程序设计基础 VBA是Microsoft Office套装软件的内置编程语言,其语法与Visual Basic编程语言互相兼容。在Access程序设计中,当某些操作不能用其他Access对象实现或实现起来很困难时,就可以利用VBA
9、语言编写代码,完成这些复杂任务。8.3.1 程序书写原则1.程序书写规定 通常将一个语句写在一行中,但当语句较长,一行写不下时,也可以利用续行符(下划线)“_”将语句接续到下一行中。有时需要在一行中写几句代码,这时需要用到冒号“:”将不同的几个语句分开。2.注释语句注释语句用于对程序或语句的功能给出解释和说明。通常一个好的程序都会有注释语句,这对程序的维护有很大的好处。在VBA程序中,注释的内容被显示成绿色文本。可以通过以下两种方式添加注释。(1)使用“”,格式如下:注释语句这种注释语句可以直接放在其他语句之后而无需分隔符。2.注释语句(2)使用Rem语句,格式如下:Rem 注释语句这种注释语
10、句需要另起一行书写,也可以放在其他语句之后,但需要用冒号隔开。3.书写格式 利用空格、空行、缩进使得程序层次分明。8.3.2 数据类型 VBA一般用变量保存计算的结果,进行属性的设置,指定方法的参数以及在过程间传递数值。为了高效率地执行,VBA为变量定义了一个数据类型的集合。在Access里,很多地方都要指定数据类型,包括过程中的变量、定义表和函数的参数等。1标准的数据类型数据类型基本自定义Byte, String$Integer%, Long&, Single!, Double#Date, Currency, Object, VariantBooleanType 类型名 元素名 as 类型
11、End Type2用户自定义的数据类型例如,定义一个学生信息的数据类型如下:Type Student SNo As String SName As String SAge As IntegerEnd Type定义了由SNo(学号)、SName(姓名)、SAge(年龄)3 个分量组成的名为Student的数据类型。8.3.3 变量与常量 变量是指在程序运行过程期间取值可以变化的量。在VBA代码中声明和使用指定的变量来存储值、计算结果或操作数据库中的任意对象。1变量的命名规则(1)变量名必须以英文字母开头,可以包含字母、数字或下划线字符“_”。(2)变量名不能包含空格、句点等字符。(3)变量名的长
12、度不能超过255个字符,且变量名不区分大小写。(4)不能在某一范围内的相同层次中使用重复的变量名。(5)变量的名字不能是VBA的关键字。2变量的声明 变量一般应先声明再使用,变量声明有两个作用,一是指定变量的数据类型,二是指定变量的适用范围。VBA应用程序并不要求在过程中使用变量以前明确地进行声明。如果使用一个没有明确声明的变量,Visual Basic会默认地将它声明为Variant数据类型。变量声明语句:Dim As 2变量的声明【例】在一个语句中声明3个不同类型的变量,其中aaa为布尔型变量,bbb为变体型变量,ccc为日期型变量。Dim aaa As Boolean,bbb,ccc A
13、s Date其中bbb的类型为Variant,因为声明时没有指定它的类型。3变量的作用域变量的作用域确定了能够使用该变量的那部分代码。一旦超出了作用范围,就不能引用它的内容。变量的作用范围是在模块中声明确定的。声明变量时可以使用3种不同的作用范围:Public、Private、Static和Dim。( 1)过程内部使用的变量过程级变量只有在声明它们的过程中才能被识别,也称它们为局部变量。用Dim或者Static关键字来声明它们。例如:Dim V1 As Integer或Static V1 As Integer( 1)过程内部使用的变量在过程结束之前,Dim语句一直保存着变量的值,也就是说,使用
14、Dim语句声明的变量在过程之间调用时会丢失数据。而用Static语句声明的变量则在模块内一直保留其值,直到模块被复位或重新启动。在非静态过程中,用Static语句来显式声明只在过程中可见的变量,但其存活期与定义了该过程的模块一样长。(2)模块内部使用的变量 模块级变量对该模块的所有过程都可用,但对其他模块的代码不可用。可在模块顶部的声明段用Private关键字声明变量,从而建立模块级变量。例如: Private V1 As Integer 在模块级,Private和Dim之间没有什么区别,但Private更好些,因为很容易把它和Public区别开来,使代码更容易理解。(3)所有模块使用的变量为
15、了使模块级的变量在其他模块也有效,可用Public关键字声明变量。公用变量中的值可用于应用程序的所有过程。和所有模块级变量一样,也在模块顶部的声明中来声明公用变量。例如:Public V1 As Integer用户不能在过程中声明公用变量,而在模块中声明的变量可用于所有模块。4数据库对象变量 Access建立的数据库对象及其属性,均可被看成是VBA程序代码中的变量及其指定的值来加以引用。例如,Access中窗体与报表对象的引用格式为:Forms!窗体名称!控件名称.属性名称Reports!报表名称!控件名称.属性名称关键字Forms或Reports分别表示窗体或报表对象集合。感叹号分隔开对象名
16、称和控件名称。“属性名称”部分缺省,则为控件基本操作。5数组数组是在有规则的结构中包含一种数据类型的一组数据,也称作为数组元素变量。数组变量由变量名和数组下标构成,通常用Dim语句来定义数组。(1)一维数组定义格式如下:Dim ( to ) As 缺省情况下,下标下限为0【例】定义一维数组:Dim y (10) As Integer5数组数组的下标也可以不从0开始定义,模块的顶部使用Option Base语句,将第一个元素的默认索引值从0改为其他值。5数组(2)多维数组多维维数指有多个下标的数组。在VBA中可以声明变量最多到60维。【例】Dim T(3,2) As Integer定义了一个二维
17、数组,数组名为T,类型为Integer,该数组有4行(03)3列(02),占据12(43)个整型变量的空间,如图所示。第0列第1列第2列第0行T(0,0)T(0,1)T(0,2)第1行T(1,0)T(1,1)T(1,2)第2行T(2,0)T(2,1)T(2,2)第3行T(3,0)T(3,1)T(3,2)6变量标识命名法则在编写VBA程序代码时,会用到大量的变量名称和不同的数据类型。对于控件对象,可以用VBA的Set关键字将每个命名的控件对象指定为一个变量名称。目前,VB和VBA均推荐使用Hungarian符号法作为命名法则。该方法也被广泛用在C和C+等一些程序中。Hungarian符号法使用一
18、组代表数据类型的码。用小写字母作为变量的第一个字符。例如,代表文本框的字首码是txt,那么文本框变量名为txtName。7符号常量常量是指固定不变的量。VBA的常量包括数值常量、字符常量、日期常量、符号常量、固有常量和系统定义常量等。符号常量是需要声明的常量,用Const语句来声明并设置其值。格式如下:Const 符号常量名称 = 常量值例:Const PI = 3.1415926。8系统常量Access系统内部包含若干个启动时就建立的系统常量,有True、False、Yes、No、On、Off和Null等。在编码时可以直接使用。8.3.4 常用的标准函数在VBA中,除在模块创建中可以定义子过
19、程与函数过程完成特定功能外,又提供了近百个内置的标准函数,可以方便完成许多操作。标准函数一般用于表达式中,有的能和语句一样使用。其使用形式如下:函数名(参数1,参数2,参数3,参数4,参数5)关于常用函数部分,请参见第1章函数部分。8.3.5 运算符和表达式在VBA编程语言中,提供4种类型的运算符:算术运算符、关系运算符、逻辑运算符和连接运算符。表达式是各种数据、运算符、函数、控件和属性的组合,其运算结果是某个确定数据类型的值。表达式能实现数据计算、条件判断、数据类型转换等许多作用。关于运算符和表达式部分,请参见第1章函数和表达式部分。8.4 VBA程序流程控制语句 在VBA程序中,按语句代码
20、执行的顺序可以分为:顺序结构:按照语句顺序顺次执行,如赋值语句、过程调用语句。选择结构:又称为分支结构,根据条件选择执行路径。循环结构:重复执行某一段程序语句。8.4.1 赋值语句赋值语句指定一个值或表达式给变量,通常包含一个等号“=”。语法形式如下:Let = Let通常可以省略。 【例】赋值语句示例。 Dim y As Integer 定义一个变量为整型 y=18 给y赋值18 8.4.2 选择结构语句 在解决一些实际问题时,往往需要按照给定的条件进行分析和判断,然后根据判断结果的不同执行程序中不同部分的代码,这就是选择结构。1.If条件语句(1)单分支结构 格式: If Then 【例】
21、 If xy Then t=x: x=y: y=t 如果x小于y,就把x和y交换1.If条件语句(2)双分支结构 格式:If Then Else End If(2)双分支结构【例】 电费的收费标准是100度以内(包括100度)0.48元/度,超过部分0.96元/度。编写程序,要求根据输入的任意用电量(度),计算出应收的电费。电费收费程序窗体如图所示。Private Sub cmdCalculate_Click( ) Dim y as single 定义一个变量用于表示用电量 Dim p as single 定义一个变量用于表示费用 y = Val(Txt1.Value) Txt1为输入用电量文
22、本框的名称 If y 100 Then p =(w - 100)* 0.96 + 100 * 0.48 Else p = w * 0.48 End If Txt2.Value = p Txt2为显示金额文本框的名称End Sub(3)多分支结构格式:If Then ElseIf Then ElseIf Then Else End If(3)多分支结构【例】成绩等级鉴定窗体如图所示,功能为: 输入一个学生的一门课分数x(百分制),并根据成绩划分等级 当x90时,输出“优秀”; 当80 x90 时,输出“良好”; 当 70 x80 时,输出“中”; 当60 x70 时,输出“及格”; 当 x60
23、时,输出“不及格”。Private Sub CmdOK_Click() 确定命令按钮单击事件 Dim score As single score = val(Txt1.Value) Txt1为输入学生分数文本框的名称 If score = 90 Then Txt2.Value = 优秀 Txt2为显示等级文本框的名称 ElseIf score = 80 Then Txt2.Value= 良好 ElseIf score = 70 Then Txt2.Value = 中 ElseIf score = 60 Then Txt2.Value = 及格 Else Txt2.Value = 不及格 End
24、 IfEnd SubVBA提供了3个函数来完成选择操作(1)IIf函数: IIf(条件式,表达式1,表达式2),该函数是根据条件式的值来决定函数返回值。条件式的值为真(True),函数返回表达式1的值;条件式的值为假(False),函数返回表达式2的值。【例】将变量a和b中值大的量存放在变量Max中。 Max=IIf(ab,a,b)VBA提供了3个函数来完成相应的选择操作(2)Switch函数: Switch(条件式1,表达式1,条件式2,表达式2,条件式n,表达式n),该函数是分别根据条件式1、条件式2,直至条件式n的值来决定函数返回值。【例】根据变量x的值来为变量y赋值。 y=Switch
25、(x0,1,x=0,0,x0,-1)VBA提供了3个函数来完成相应的选择操作(3)Choose函数: Choose(索引式,选项1,选项2,选项n),该函数是根据索引项的值来返回列表中的某个值。索引式值为1,函数返回选项1的值;索引式值为2,函数返回选项2的值;以此类推。【例】根据变量x的值来为变量y赋值。 x=2 : m=5: y=Choose(x,5,m+1,n) 程序运行后,y的值为62. Select Case语句如果条件复杂,分支太多,使用If语句就会显得累赘,而且程序变得不易阅读。这时可使用Select Case语句来写出结构清晰的程序。其语法格式如右图所示:Select Case
26、 Case Case Case Else End Select2.Select Case语句Select Case 语句具有以下几个部分: 表达式:必要参数。可为任何数值表达式或字符串表达式 值1n:可以为单值或一列值(用逗号隔开),与表达式的值进行匹配。如果“值”中含有关键字To,如 2 To 8,则前一个值必须是小的值,且的值必须介于两个值之间。如果中含有关键字Is,则的值必须为真。 语句1n+1:都可包含一条或多条语句。 如果有一个以上的Case子句与匹配,则VBA只执行第一个匹配的Case后面的语句。如果前面的Case子句与都不匹配,则执行Case Else子句中的。8.4.3 循环结
27、构语句 在解决一些实际问题时,往往需要重复某些相同的操作,即对某一语句或语句序列执行多次,解决这类问题要用到循环结构。VBA提供了多种循环结构语句。1.ForNext语句 ForNext语句能够重复执行程序代码区域特定次数,格式如下: For 循环变量=初值 To 终值 Step 步长 循环体 条件语句序列 Exit For 结束条件语句序列 Next 循环变量1.ForNext语句其执行步骤如下:循环变量取初值;循环变量与终值比较,确定循环是否进行:步长0时 若循环变量值终值,循环结束,退出循环。 步长=0时 若循环变量值终值,一次也不执行循环。 步长=终值,循环继续,执行步骤;若循环变量值
28、终值,循环结束,退出循环。执行循环体;循环变量值增加步长(循环变量=循环变量+步长),程序跳转至。1.ForNext语句【例】利用ForNext循环语句,求1+2+100之和。 Dim n As integer, s As integer s=0 For n=1 to 100 s=s+n Next n Debug.Print s 在立即窗口中打印s的值2.DoLoop语句 用DoLoop语句可以定义要多次执行的语句块。也可以定义一个条件,当这个条件为假时,就结束这个循环。 DoLoop语句有以下两种格式。2.DoLoop语句 格式一Do While | Until Exit Do Loop D
29、o WhileLoop循环语句 Do WhileLoop循环语句,当条件结果为真时,执行循环体,并持续到条件结果为假或执行到选择Exit Do语句,结束循环。Do UntilLoop循环语句 Do UntilLoop循环语句,当条件结果为假时,执行循环体,并持续到条件结果为真或执行到选择Exit Do语句,结束循环。Do WhileLoop循环语句【例】Do WhileLoop循环语句示例。 程序段 k=0 Do While k=5 k=k+1 Loop 循环执行的次数为 。【例】Do UntilLoop循环语 句示例。 程序段 k=0 Do Until k=5 k=k+1 Loop以上循环的
30、执行次数是 _次。2.DoLoop语句 格式二Do Exit Do Loop While|UntilDoLoop While循环语句 DoLoop While循环语句,程序执行时,首先执行循环体,然后再判断条件。当条件结果为真时,执行循环体,并持续到条件结果为假或执行到选择Exit Do语句,结束循环。程序流程如图所示。DoLoop Until循环语句 DoLoop Until循环语句,程序执行时,首先执行循环体,然后再判断条件。当条件结果为假时,执行循环体,并持续到条件结果为真或执行到选择Exit Do语句,结束循环,程序流程图如图所示。DoLoop While循环语句【例】DoLoop W
31、hile循环语句示例。程序段 num=0 Do num=num+1 Debug.Print num Loop While num3运行程序,结果是 。【例】Do Loop Until循环语句示例。程序段 num=0 Do num=num+1 Debug.Print num Loop Until num4运行程序,结果是_。8.4.4 其他语句标号和GoTo语句 GoTo语句用于实现无条件转移。使用格式为: GoTo 标号 程序运行到此结构,会无条件转移到其后的“标号”位置,并从那里继续执行。GoTo语句使用时,“标号”位置必须首先在程序中定义好,否则转移无法实现。8.4.4 控制语句【例】Go
32、To语句示例。s=0For i=1 to 100 s=s+i If s=500 then GoTo MlineNext iMline:Debug.print s在立即窗口中显示结果为528。8.5 面向对象程序设计的基本概念VBA程序设计是一种面向对象的程序设计。面向对象程序设计是一种系统化的程序设计方法,它基于面向对象模型,采用面向对象的程序设计语言编程实现。在VBA编程中,首先必须理解对象、属性、方法和事件。8.5.1 对象对象:任何可操作实体,例如数据表,窗体、查询、报表、宏、文本框、列表框、对话框和命令按钮等。8.5.2 属性属性:每个对象都有自己的固有特征。对象的特征通过数据来描述,
33、这称为对象的“属性”。在程序代码中,则通过赋值的方式来设置对象的属性,其格式为对象.属性 = 属性值【例】 Label1.Caption = 教师基本情况 设置标签Label1的标题属性为“教师基本情况”8.5.3 方法方法:每个对象都有自己的若干方法,从而构成该对象的方法集。可以把方法理解为内部函数,可以用来完成某种特定的功能。对象方法的调用格式为对象.方法 参数名表 【例】 使用Debug对象的Print方法,输出表达式“2+3”的结果。Debug.Print 2+3 输出2+3的结果8.5.3 方法Access中除数据库的7个对象外,还提供一个重要的对象:DoCmd对象:通过调用内部方法
34、实现VBA编程中对Access的操作。例如,利用DoCmd对象的OpenForm方法可以打开窗体“教师”,语句格式为 DoCmd.OpenForm 教师DoCmd对象的方法大都需要参数,有些是必需的,有些是可选的,被忽略的参数取缺省值。8.5.3 方法OpenForm方法有4个参数,见下面调用格式:DoCmd.OpenForm formname,view,filtername,wherecondition其中只有formname(窗体名称)参数是必需的。DoCmd对象还有很多方法,可以通过帮助文件查询使用。另外,对窗体、控件来说,还有SetFocus(获得控制焦点)、Requery(更新数据)
35、等方法。8.5.4 事件事件:对于对象而言,事件就是发生在该对象上的事情或消息。在Access系统中,不同的对象可以触发的事件不同。总体来说,Access中的事件主要有键盘事件、鼠标事件、窗口事件、对象事件和操作事件等。8.5.4 事件【例】 鼠标单击Command1命令按钮时,使标签label0的字体颜色变为红色。 鼠标的单击事件Private Sub Command1_Click() label0.ForeColor = 255 标签label0的字体颜色设置为红色End Sub 8.5.4 事件【例】 窗体加载时,窗体的标题设置为当前的系统日期。Private Sub Form_Load
36、() 窗体加载时,窗体的标题设置为当前的系统日期 Me.Caption=Date() End Sub8.6 VBA模块的创建 模块将数据库中的VBA过程和函数放在一起,作为一个整体来保存。利用VBA模块可以开发十分复杂的应用程序。 过程是用VBA语言的声明和语句组成的单元,作为一个命名单位的程序段,它可以包含一系列执行操作或计算值的语句和方法。过程有两种类型:Sub(子程序)过程和Function(函数)过程。8.6.1 VBA标准模块1.创建模块 操作步骤如下: (1)在数据库窗口中,单击“创建”选项卡“宏与代码”选项组“模块”,则在VBE编辑器中创建一个空白模块。(2)在模块代码窗口中输入
37、模块程序代码。8.6.1 VBA标准模块2.确定数据访问模型 Access支持两种数据访问模型:传统的数据库访问对象DAO和ActiveX数据对象ADO。DAO的目标是使数据库引擎能够快速和简单地开发。ADO使用了一种通用程序设计模型来访问一般数据,而不是基于某一种数据引擎,它需要OLEDB提供对低层数据源的链接。8.6.1 VBA标准模块3.模块的调用创建模块后,就可以使用该模块中的过程了。模块的调用有以下两种方式:(1)直接调用 对于所建立的模块对象,通过模块名进行调用。(2)事件过程调用 将过程与发生在对象(如窗体或控件)上的事件联系起来,当事件发生后,相应的过程即被执行。8.6.2 S
38、ub子过程的创建和调用1.子过程的定义 Sub过程是执行一系列操作的过程,在执行完成后不返回任何值,是能执行特定功能的语句块。Sub过程可以被置于标准模块和类模块中。 8.6.2 Sub子过程的创建和调用声明Sub过程的语法形式如下:Public|PrivateStatic Sub 子程序名(As 数据类型) Exit Sub End Sub8.6.2 Sub子过程的创建和调用【例】创建一个过程swap,将给定的两个参数x和y互换。Public Sub swap(x As Integer, y As Integer) Dim z As Integer z = x x = y y = zEnd
39、Sub8.6.2 Sub子过程的创建和调用2. 子过程的创建 下面以创建swap过程为例,介绍子过程的创建。操作步骤:(1)打开数据库。(2)单击“创建”选项卡“宏与代码”选项组“模块”。8.6.2 Sub子过程的创建和调用(3)单击“插入”菜单“过程”命令,显示如图所示的“添加过程”对话框,并按照对话框输入相应信息。(4)单击“确定”按钮。(5)此时在弹出的Visual Basic编辑器窗口中添加了一个名为swap的过程,并在该过程中输入如图所示的代码。8.6.2 Sub子过程的创建和调用3. 子过程的调用 子过程名 参数列表 或 Call 子过程名(参数列表)说明: (1)参数列表称为实参
40、或实元,它必须与形参保持个数相同,位置与类型一一对应。8.6.2 Sub子过程的创建和调用(2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变,而地址传递时实参的值随形参值的改变而改变。(3)当参数是数组时,在声明形参与实参时应省略其维数,但括号不能省。(4)调用子过程的形式有两种,用Call关键字时,实参必须加圆括号括起,反之则实参之间用“,”分隔。8.6.2 Sub子过程的创建和调用【例】调用swap子过程。操作过程如下:(1)添加过程Data_In_Out,实现数据的输入/输出,如图所示。(2)单击工具栏上的“保存”按钮,保存模块。8
41、.6.2 Sub子过程的创建和调用(3)将光标定位于Data_In_Out过程的任何位置,单击工具栏上的“运行子过程/用户窗体”按钮,在立即窗口中显示排序结果,如图所示。8.6.3 Function函数过程的创建和调用1. Function函数过程的定义 Function过程又称为函数,也是能执行特定功能的语句块。VBA提供了大量的内置函数,编程时可以直接引用。但有时需要按自己的要求定义函数,也就是能够返回值的Function过程。有没有返回值,是Sub过程和Function过程之间最大的区别。1. Function函数过程的定义声明函数的语法形式如下:Public | Private Sta
42、tic Function 函数名(As 数据类型)As 返回值数据类型 函数名= Exit Function 函数名=End Function说明:使用Public、Private和Static关键字的意义与Sub过程相同。1. Function函数过程的定义【例】自定义一个函数A,功能为求圆面积。Public Function A (R As Single) As Single A=3.14*R2 求半径为R的圆的面积AEnd Function这样,一个面积函数就完成了。2. 函数过程的创建 在工程资源管理器窗口双击某个模块名打开该模块,然后单击“插入”菜单的“过程”命令,弹出 “添加过程”
43、对话框,在名称处输入名称,在类型选项组中选择“函数”,单击“确定”按钮。VBE代码窗口中即添加了一个新的函数过程,输入相应代码后保存模块。3. 函数过程的调用调用Function函数非常方便。如果要计算半径为5的圆的面积,只要调用函数A(5) 。8.6.4 过程调用中的参数传递1.形式参数与实际参数形式参数是指在定义通用过程时,过程名后面圆括号内的参数,用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。 8.6.4 过程调用中的参数传递1.形式参数与实际参数实际参数是指在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给
44、Sub或Function过程与其对应的形参变量。实参可由常量、表达式、有效的变量名、数组名组成,实参表中各参数用逗号分隔。8.6.4 过程调用中的参数传递2.参数传递(虚实结合)参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参。参数的传递有两种方式:按值传递、按地址传递。(1)传址调用(形参前加ByRef或省略) 传址的参数传递过程是:调用过程时,将实参的地址传给形参。因此如果在被调用过程和函数中修改了形参的值,则主调用过程或函数中的值也跟着变化。(1)传址调用(ByRef)【例】传址调用示例。子过程S1:Private Sub S1(ByRef x As In
45、teger) x=x+2End Sub主过程执行后 J的值变为7.主过程Private Sub Command1_Click( ) Dim J As Integer J=5 Call S1(J) MsgBox JEnd Sub(2)传值调用(形参前加ByVal)传值的参数传递过程是:主调用过程将实参的值复制后传给被调过程的形参,因此如果在被调用过程和函数中修改了形参的值,则主调用过程或函数中的值不会跟着变化。2)传值调用(ByVal)【例】传值调用(ByVal)示例。子过程S2:Private Sub S2(ByVal x As Integer) x=x+2End Sub主过程执行后 J的值仍
46、然为5。主过程Private Sub Command2_Click( ) Dim J As Integer J=5 Call S2(J) MsgBox JEnd Sub8.7 VBA常用操作在VBA编程过程中会经常用到一些操作,如打开或关闭某个窗体和报表,给某个量输入一个值,根据需要显示一些提示信息等,可以使用VBA的输入框、消息框等来完成。 打开报表操作 命令格式为:Docmd.OpenReport ReportName,View,FilterName,WhereCondition, WindowMode 【例】 以打印预览方式打开“学生”报表。 DoCmd.OpenReport 学生, a
47、cViewPreview 关闭操作命令格式为:Docmd.Close(ObjectType, ObjectName, Save)【例】 使用Close方法关闭“学生”窗体,在不进行提示的情况下,保存所有对窗体的更改。DoCmd.Close acForm, 学生, acSaveYes8.7.3 消息框(MsgBox) 在对话框中显示消息,并等待用户单击按钮,然后返回一个 Integer 值,该值指示用户单击了哪个按钮。 语法:MsgBox(prompt, buttons , title , helpfile, context)8.7.3 消息框(MsgBox)【例】 MsgBox使用示例。窗体“
48、MsgBox函数使用示例”界面如右上图所示。单击窗体上“测试”按钮,实现的功能是:打开如右下图所示的对话框,如果单击“是(Y)”按钮,弹出“您单击了Yes按钮”消息,如果单击“否(N)”按钮,弹出“您单击了No按钮”消息。 Dim Msg, Style, Title, Response Msg = Do you want to continue ? Style = vbYesNo + vbCritical + vbDefaultButton2 Title = MsgBox 演示 Response = MsgBox(Msg, Style, Title) If Response = vbYes T
49、hen MsgBox 您单击了Yes按钮 Else MsgBox 您单击了No按钮 End If8.7.4 VBA编程验证数据使用窗体,每当保存记录数据时,所做的更改便会保存到数据源表中。在控件中的数据被改变之前或记录数据被更新之前会发生BeforeUpdate事件。通过创建窗体或控件的BeforeUpdate事件过程,可以实现对输入到窗体控件中的数据进行各种验证。例如,数据类型验证、数据范围验证等。验证函数 函数名称函数名称返回值返回值说明说明IsNumericBoolean值值指出表达式的运算结果是否为数值。指出表达式的运算结果是否为数值。返回返回True,为数值,为数值IsDateBoo
50、lean值值指出一个表达式是否可以转换成日期。指出一个表达式是否可以转换成日期。返回返回True,可转换,可转换IsEmptyBoolean值值指出变量是否已经初始化。返回指出变量是否已经初始化。返回True,未初始化未初始化IsErrorBoolean值值指出表达式是否为一个错误值。返回指出表达式是否为一个错误值。返回True,有错误,有错误验证函数 函数名称函数名称 返回值返回值说明说明IsArrayBoolean值值指出变量是否为一个数组。返回指出变量是否为一个数组。返回True,为数组为数组IsNullBoolean值值指出表达式是否为无效数据(指出表达式是否为无效数据(Null)返回