1.1k likes | 1.26k Views
Access 数据库基础与应用. 第 10 章 模块与 VBA 程序设计 本章要点: 模块的概念与基本操作 VBA 的基础知识 VBA 程序设计中的流程控制方法 VBA 数据库访问技术. 第 10 章 模块与 VBA 程序设计. 10.1 模块与 VBA 概述. 10.1.1 模块的概念 过程 是一个独立的程序段,实现某个特定的功能。 VBA 过程通常分为 Sub 过程(子程序)、 Function 过程(函数)和 Property 过程(属性)。 模块 就是由 VBA 通用声明和一个或多个过程组成的单元。 可分为两种基本类型:标准模块和类模块。
E N D
Access数据库基础与应用 第10章 模块与VBA程序设计 本章要点: 模块的概念与基本操作 VBA的基础知识 VBA程序设计中的流程控制方法 VBA数据库访问技术
第10章 模块与VBA程序设计 10.1 模块与VBA概述 10.1.1 模块的概念 过程是一个独立的程序段,实现某个特定的功能。 VBA过程通常分为Sub过程(子程序)、Function过程(函数)和Property过程(属性)。 模块就是由VBA通用声明和一个或多个过程组成的单元。 可分为两种基本类型:标准模块和类模块。 标准模块是可供整个数据库使用的公共过程,与窗体、报表等对象无关联,在Access数据库中是一个独立的模块对象。 类模块是一个对象的定义,它封装了一些属性和方法,VBA中类模块有3种:窗体模块、报表模块和自定义类模块。
第10章 模块与VBA程序设计 (1) 窗体模块中包含指定的窗体或其控件的事件所触发的所有事件过程的代码,这些过程用于响应窗体中的事件,可以使用事件过程来控制窗体的行为以及它们对用户操作的响应。 (2)报表模块与窗体模块类似,不同之处是过程响应和控制的是报表的行为。 数据库的每一个窗体和报表都有内置的窗体模块和报表模块,这些模块中包括事件过程模板,可以向其中添加程序代码,使得当窗体、报表或其上的控件发生相应的事件时,运行这些程序代码。 (3) 自定义类模块不与窗体和报表相关联,允许用户自定义所需的对象、属性和方法。
第10章 模块与VBA程序设计 10.1.2 VBA开发环境 VBE的启动常用的方法 (1)在Access数据库窗口中选中“模块”对象,再单击工具栏上的“新建”按钮,或在“模块”对象中双击所要显示的模块名,就会打开VBE窗口并显示该模块的内容。 (2)在窗体、报表的设计视图中,单击“视图”→“代码”命令或单击工具栏上的“代码”按钮。 (3)在窗体、报表的设计视图中,右击控件,选快捷菜单上的“事件生成器”命令,选择 “代码生成器”选项,单击“确定”按钮。或单击属性窗口的“事件”选项卡,选中某个事件并单击属性栏右边的省略号按钮,也可以打开“选择生成器”对话框,选择其中的“代码生成器”选项,单击“确定”按钮。 (4)单击“工具”→“宏”→“Visual Basic编辑器”命令。
第10章 模块与VBA程序设计 VBA的开发环境VBE窗口如下图所示: (5)使用Alt+F11组合键,可以在数据库窗口和VBE窗口之间进行切换。
第10章 模块与VBA程序设计 2.VBE窗口的组成 (1)VBE主窗口 VBE主窗口有菜单栏和工具栏。 (2)工程资源管理器窗口 工程资源管理器窗口列出了在应用程序中用到的模块。使用该窗口,可以在数据库内各个对象之间快速地浏览。各对象以树形图的形式分级显示在窗口中,包括Access类对象、模块和类模块。要查看对象的代码,只须在该窗口双击对象即可。要查看对象的窗体,可以右击对象名,然后在弹出的快捷菜单中选择“查看对象”命令。
第10章 模块与VBA程序设计 (3)属性窗口 属性窗口列出了所选对象的各种属性。 可以直接在属性窗口设置属性,还可以在代码窗口中用VBA语句设置对象的属性。 (4)代码窗口 在代码窗口中可以输入和编辑VBA代码。 在代码窗口的顶部是两个组合框,左边是对象组合框,列出了所有可用的对象名称,右边是事件组合框,列出该对象所有的事件。 (5)立即窗口 常用于程序在调试期间输出中间结果、在中断模式下测试表达式的值等,也可以直接输入VBA命令并按Enter键后,VBA会实时解释并执行该命令。例如,在立即窗口利用“?”或Print或Debug.Print输出表达式的值。
第10章 模块与VBA程序设计 10.1.3 模块的创建 1.创建模块的方法 模块的创建有以下几种方法。 (1)在Access中每创建一个窗体或报表,Access都会自动创建一个对应的窗体模块或报表模块。 (2)在Access数据库窗口中单击“模块”对象,再单击工具栏上的“新建”按钮,可以打开VBE窗口并创建标准模块;在“模块”对象中双击所要显示的模块名称,就会打开VBE窗口并显示该模块的内容。 (3)在VBE编辑器中,单击VBE菜单的“插入”→“模块”命令可以创建新的标准模块;单击VBE菜单的“插入”→“类模块”命令可以创建新的类模块。或单击VBE工具栏中的“插入模块”按钮,从下拉菜单中选择“模块”命令或“类模块”命令。
第10章 模块与VBA程序设计 例10-1 在“教学管理”数据库中创建一个标准模块。 创建标准模块及运行结果
第10章 模块与VBA程序设计 2.对象的引用 引用对象属性的语法格式为: 对象名.属性名 在程序代码中改变属性的值,其语句格式为: 对象名.属性名=属性值 例如,将Command1命令按钮的Caption属性设置为“计算”,在程序代码中实现的语句是: Command1.Caption="计算"
第10章 模块与VBA程序设计 引用方法 格式为:对象名.方法名(参数1,参数2,…) 说明:如果方法没有参数,则可以省略括号。 引用对象: (1)对于当前对象,可以省略对象名,也可以使用Me关键词代替当前对象名。 (2)可能需要通过多重对象来确定一个对象,需要使用运算符“!”来逐级确定对象。 例如,引用在MyForm窗体上的一个命令按钮Cmd1控件 MyForm!Cmd1
第10章 模块与VBA程序设计 (3)引用一个对象的多个属性 可使用With…End With结构,而不需要重复指出对象的名称。 例如,如果要给命令按钮Cmd1的多个属性赋值,可表示为: With Cmd1 .Caption="确定" .Height=2000 .Width=2000 End With
第10章 模块与VBA程序设计 DoCmd对象 是Access中提供一个重要的对象, 主要功能是通过调用对象内部方法实现VBA程序设计中对Access的操作。DoCmd对象有许多方法,如 OpenReport ,OpenTable 、OpenForm、OpenQuery、OpenModule、RunMacro、Close、Quit等。 现以OpenReport 为例讲解其方法的调用 一般调用格式为: DoCmd.OpenReport ReportName[, View][, FilterName][, WhereCondition] 说明:DoCmd对象的方法大都需要参数。有些是必需的,有些是可选的,被忽略的参数取默认值。
第10章 模块与VBA程序设计 • ReportName(报表名称)是必需的,其他参数均可省略。 • View参数表示报表的输出形式。 acViewNormal(默认值,以打印机形式输出) acViewDesign(以报表设计视图形式输出) acViewPreView(以打印预览形式输出)。 • FilterName与WhereCondition两个参数用于对报表的数据进行过滤和筛选。 • 例:打开报表“学生” 语句格式为: DoCmd.OpenReport "学生"
第10章 模块与VBA程序设计 3.编写对象响应的程序代码 (1)使用宏操作来设置事件的属性。 (2)在代码窗口中为某个事件创建事件过程。 先在对象组合框中选定对象后,再在事件组合框中选定需要的事件,系统就会自动生成一个约定名称的子程序,例如,命令按钮Command1的Click事件过程名为“Command1_Click”。 事件过程,一般格式如下: Private Sub 对象名_事件名([参数表]) …(事件过程代码) End Sub 说明:参数表中的参数名随事件过程的不同而不同,也可以省略。程序代码就是根据需要由用户编写的程序。
第10章 模块与VBA程序设计 例10-2 在“教学管理”数据库中创建如图10-3所示的窗体,窗体中包含两个文本框和相应的标签以及两个按钮,单击第一个按钮时将第一个文本框中的内容显示在第二个文本框中,单击第二个按钮时关闭该窗体。 图10-3窗体模块运行界面
第10章 模块与VBA程序设计 10.2 VBA的数据类型及运算 10.2.1 数据类型 1.标准数据类型 。
第10章 模块与VBA程序设计 其中Variant数据类型是一种特殊数据类型,具有很大的灵活性,可以表示多种数据类型,其最终的类型由赋予它的值来确定。如果变量在使用前未加以类型说明,默认为Variant型 2.用户自定义数据类型 VBA允许用户自定义数据类型,使用Type语句就可以实现这个功能。用户自定义类型可包含一个或多个某种数据类型的数据元素。 Type语句的语法格式如下: Type 数据类型名 数据元素定义语句 End Type
第10章 模块与VBA程序设计 10.2.2 常量与变量 1.常量 (1)直接常量 ① 十进制整数由数字0~9和正、负号组成,实数可采用小数表示形式或科学记数表示形式。科学计数法用E表示10的乘幂。 ② 字符串常量是一个用双引号括起来的字符序列。在字符串中,字母的大小写是有区别的。 ③ 布尔常量有True和False两个值。 ④ 日期常量以字面上可被认作日期和时间的字符并用一对“#”括起来表示。
第10章 模块与VBA程序设计 (2)符号常量 符号常量是用标识符来表示某个常量 在VBA中声明常量的语句格式是: Const 常量名 [As 数据类型|类型符]=表达式[,常量名 [As 数据类型|类型符]=表达式] 例如: Const TotalCount As Integer=1000 Const IDate=#7/30/2011# Const NDate=IDate+5 Const MyString$="You are welcome."
第10章 模块与VBA程序设计 说明:用户一旦定义了符号常量,在以后的程序中不能用赋值语句来改变它们的值,否则,在运行程序时将出现错误。 标识符是用来表示用户所定义的常量、变量、过程、函数等程序要素的符号。 在VBA中,标识符的命名必须是以字母或汉字开头,且只能由汉字、字母(a~z或A~Z)、数字(0~9)或下划线(_)所组成,其最大长度为255个字符。此外,不能使用VBA的关键字作为标识符,标识符不区分大小写。 (3)系统常量 是VBA预先定义好的常量,用户可以直接使用。例如VBA用vbKeyReturn来表示回车。
第10章 模块与VBA程序设计 2.变量 (1)变量的命名规则 VBA的变量名要遵循标识符的命名规则。为了增加程序的可读性和可维护性,可以在命名变量时使用前缀的约定。这样通过变量名就可以知道变量的数据类型。例如,可以用intNumber、strMytext、blnFlag等名字来分别作为整型、字符串型和逻辑型变量的名字。
第10章 模块与VBA程序设计 (2)变量的声明 声明变量有两个作用,一是指定变量的数据类型,二是指定变量的作用范围。如果在程序中没有明确声明变量,VBA会默认地将它声明为Variant数据类型。虽然默认声明变量很方便,但可能会在程序代码中导致严重的错误。因此使用前声明变量是一个很好的编程习惯。 在VBA中可以强制要求在过程中使用变量前必须进行声明,方法是在模块通用声明部分中包含一个Option Explicit语句,它要求在模块级别中强制对模块中所有使用的变量显式声明。
第10章 模块与VBA程序设计 声明变量要使用 Dim 语句,Dim 语句的格式为: Dim 变量名 [As 数据类型|类型符][,变量名 [As 数据类型|类型符]] 例如: Dim Var1%,Var2 As String,Var3 As Date,Var4 其中Var1的数据类型为整型(Integer类型,其类型符为%),Var2为字符型,Var3为日期型,Var4的类型为Variant,因为声明时没有指定它的类型。 对于字符型变量,分为定长和变长两种。例如: Dim s1 As String, s2 As String*10 其中s1是变长字符变量,s2是定长字符变量。
第10章 模块与VBA程序设计 (3)变量的赋值 声明了变量后,变量就指向了内存的某个单元。在程序的执行过程中,可以向这个内存单元写入数据,这就是变量的赋值。给变量赋值的语句格式如下: 变量名=表达式 例如: Dim MyName As String MyName="Better City, Better Life."
第10章 模块与VBA程序设计 3.数组变量 数组变量声明一般格式为: Dim 数组名([下标1下界 To] 下标1上界[, [下标2下界 To] 下标2上界]…) As 数据类型 下标下界的默认值为0,在使用数组时,可以在模块的通用声明部分使“Option Base 1”语句来指定数组下标下界从1开始。 数组可以分固定大小数组和动态数组两种类型。若数组的大小被指定,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组。
第10章 模块与VBA程序设计 (1)声明固定大小的数组 Dim MyArray(10,10) As Integer 其中MyArray是数组名,它是含有11×11个元素的Integer类型的二维数组。 (2)声明动态数组 若声明为动态数组,则可以在执行程序时去改变数组大小。可以利用Dim语句来声明数组,不须给出数组大小。每当需要时,可以使用ReDim语句去更改动态数组,此时数组中存在的值会丢失。若要保存数组中原先的值,则可以使用ReDim Preserve语句来扩充数组。 例如: Dim sngArray() As Single '声明动态数组 ReDim sngArray(2) '声明动态数组的大小 sngArray(1)=10 '赋值 sngArray(2)=20 ReDim Preserve sngArray(10) '再次改变动态数组大小,保留了原来数组元素的值
第10章 模块与VBA程序设计 10.2.3 内部函数 1.数学函数 数学函数完成数学计算功能,常用的数学函数如表10-2所示。
第10章 模块与VBA程序设计 2.字符串函数 常用的字符串函数如表10-3所示。
第10章 模块与VBA程序设计 3.日期或时间函数 常用的日期或时间函数如表10-4所示。
第10章 模块与VBA程序设计 4.类型转换函数 常用的类型转换函数如表10-5所示。
第10章 模块与VBA程序设计 5.测试函数 常用的测试函数如表10-6所示
第10章 模块与VBA程序设计 10.2.4 表达式 1.算术表达式 VBA提供了8个算术运算符,除负号“-”是单目运算符外,其他均为双目运算符,如表10-7所示。
第10章 模块与VBA程序设计 2.关系表达式 VBA中的关系运算有大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)、等于(=)、不等于(<>)。 关系运算的运算对象可以是数值、字符串、日期、逻辑型等数据类型。 数值按大小比较;日期按先后比较,早的日期小于晚的日期;False大于True;字符串按ASCII码排序的先后比较,也就是先比较两个字符串的第一个字符,按字符的ASCII码值比较大小, ASCII码值大的字符串大,如第一个字符相等,则比较第二个字符,直到比较出大小或比较完为止。汉字字符大于西文字符,汉字的比较是根据Unicode码的大小来比较的。
第10章 模块与VBA程序设计 3.逻辑表达式 逻辑表达式可以表示比较复杂的比较关系,结果是布尔型数据。表10-8列出了常用逻辑运算符和它们表示的逻辑关系,在表中,True用T代表,False用F表示。
第10章 模块与VBA程序设计 4.字符串表达式 字符串表达式由字符串运算符将字符串数据连接而成。VBA中的连接运算符有“+”和“&”,作用是将两个字符串连接起来。 当两个被连接的数据都是字符串时,“&”和“+”的作用相同,当数值型和字符型连接时,“&”把数据转化成字符型后再进行连接,而用“+”连接则会出错。 对于包含多种运算符的表达式,在计算时,将按预定的顺序计算每一部分,这个顺序被称为运算符的优先级。各种运算符的优先级由高到低顺序为:函数运算符、算术运算符、连接运算符、关系运算符、逻辑运算符。如果有括号,则先执行括号内的运算,在括号内部,仍按运算符的优先顺序计算。
第10章 模块与VBA程序设计 10.3 VBA程序流程控制 10.3.1 顺序控制 顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的语句序列。在程序中经常使用的顺序结构语句有注释语句、赋值语句、输入输出语句等。 1.程序语句书写规则 VBA程序是由语句组成的,程序语句有严格的书写规则。 (1)注释语句 (2)语句连写和换行 (3)采用缩进格式书写程序 Rem 一个程序实例 Dim String1 As String '声明变量String1 String1 = "hell0" '为String1变量赋值
第10章 模块与VBA程序设计 2.输入输出 (1)InputBox函数 InpubBox函数的作用是显示一个输入对话框。返回值的类型为文本类型。语句格式为: InputBox(Prompt,[Title],[Default],[XPos],[YPos]) 其中,Prompt指定要在对话框中显示的信息;Title指定对话框标题栏显示的信息,如果省略,则在标题栏中显示应用程序名;Default设置显示在文本框中的信息,如果用户没有输入数据,它就是默认值;Xpos和Ypos为整型表达式,指定对话框左上角在屏幕上的坐标位置(屏幕左上角为坐标原点)。Prompt参数是必须的,其他参数可以省略。
第10章 模块与VBA程序设计 (2)MsgBox函数 MsgBox函数的作用是打开一个对话框,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。MsgBox函数的调用格式如下: 变量名=MsgBox(Prompt,[Buttons],[Title]) MsgBox在VBA程序中也可作为语句使用,其格式为: MsgBox Prompt,[Buttons],[Title] 类似于InputBox函数,Prompt参数是不可以省略的,而其他两个参数可以省略。其中,Prompt参数用于设置提示信息,是字符串表达式;Title用于设置对话框标题,也是字符串表达式,如果省略,则将应用程序名作为标题。
第10章 模块与VBA程序设计 Buttons是整型表达式,决定对话框中显示的按钮数目、图标类型、默认按钮以及模式等,Buttons的设置值如表10-9所示;
第10章 模块与VBA程序设计 第一组值(0~5)描述了对话框中显示的按钮的类型与数目,第二组值(16,32,48,64)描述了图标的样式,第三组值(0,256,512,768)说明哪一个按钮是默认值,而第四组值(0,4096)则决定消息框的强制返回性。将这些数字相加以生成Buttons参数值的时候,只能由每组值取用一个数字。MsgBox函数返回值如表10-10所示,例如,如果函数值为6,表示用户单击了Yes按钮。
第10章 模块与VBA程序设计 例10-3 以下代码使用InputBox函数和MsgBox函数接收用户的输入并显示。 Sub InputFunc() Dim str As String Str=InputBox("请输入您的姓名:","登录") MsgBox "欢迎您:" & str & "同学", vbInformation, "欢迎" End Sub 程序在调用子过程InputFunc时,弹出输入对话框,要求用户输入数据,单击“确定”按钮后,弹出输出对话框。
第10章 模块与VBA程序设计 3.赋值语句 语句格式是: 变量名=表达式 该语句的功能是计算右边表达式的值,再将其赋值给左边的变量。 例10-4设备管理部门对已购入的设备登帐时,为了减少人工输入,当输入“设备单价”和“采购数量”时,单击“总金额”文本框,系统就会自动计算出结果。程序的运行界面如下图所示。
第10章 模块与VBA程序设计 创建一个数据库(只是为了进入数据库窗口),在其中新建一个窗体,窗体上包括3个标签控件(Label1、Label2和Label3)、3个文本框控件(Text1、Text2和Text3),标签控件Label1的标题属性(Caption)为“设备单价”,Label2的标题属性(Caption)为“采购数量”,Label3的标题属性(Caption)为“总金额”。 “总金额”文本框的事件代码如下: Private Sub Text3_GotFocus() Dim a, b, s As Double a = Text1.Value b = Text2.Value s = a * b Text3.Value = s End Sub
第10章 模块与VBA程序设计 10.3.2 选择控制 1.简单分支控制 简单分支控制是指对一个条件进行判断后,根据所得的两种结果进行不同的操作。 格式如下: If <条件> Then 语句块1 [Else 语句块2] End If 如果块1、块2均只有一条语句,可以采用单行格式: If 条件 Then 语句1 [Else 语句2 ] 例如,求两个数中最大数,可使用If语句: If x1 > x2 Then Max_x= x1 Else Max_x = x2
第10章 模块与VBA程序设计 例10-5输入一个年份,判断该年是否为闰年。判断某年是否为闰年的规则是:如果此年号能被400整除,则是闰年;如果此年号能被4整除,但不能被100整除,则是闰年。 Sub Leap() Dim x As Integer x = Val(InputBox("请输入年份:")) If x Mod 400 = 0 Or (x Mod 4 = 0 And x Mod 100 <> 0) Then MsgBox Str$(x) & "年是闰年" Else MsgBox Str$(x) & "年不是闰年" End If End Sub
第10章 模块与VBA程序设计 例10-6 在文本框中输入一个3位整数,单击“判断”按钮判断是否为水仙花数。所谓水仙花数是指各位数字的立方和等于该数本身的三位整数,例如153。
Private Sub Command1_Click() Dim x As Integer x = Text1.Value a = Int(x / 100) '求百位数字 b = Int(x / 10) Mod 10 '求十位数字 c = x Mod 10 '求个位数字 If x = a ^ 3 + b ^ 3 + c ^ 3 Then Text2.Value = x & "是水仙花数" Else Text2.Value = x & "不是水仙花数" End If End Sub 命令按钮Command2的Click事件代码如下: Private Sub Command2_Click() DoCmd.Close End Sub 第10章 模块与VBA程序设计 创建一个数据库,在其中新建一个窗体,窗体上包括一个标签控件(Label1)、两个文本框控件(Text1和Text2)和2个命令按钮控件(Command1和Command2)。标签控件Label1的标题属性(Caption)为“输入一个三位整数”,命令按钮Command1的标题属性(Caption)为“判断”,命令按钮Command2的标题属性(Caption)为“退出”。 命令按钮Command1的Click事件代码如下:
第10章 模块与VBA程序设计 首先测试条件1,如果为 False,就测试条件2,依次类推,直到找到一个为 True 的条件。当它找到一个为 True 的条件时,执行相应的语句块,然后执行 End If 后面的代码。如果条件测试都不是 True,则VBA执行 Else 语句块。 2.多分支选择控制 (1)多分支If结构 If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 …… [ElseIf 条件n Then 语句块n] [Else 语句块n+1] End If
第10章 模块与VBA程序设计 例10-7 记录数据被更新之前会发生BeforeUpdate事件,利用相应的事件过程对“学生”窗体中“入学成绩”文本框中输入的成绩进行验证,要求入学成绩必须在[0,750]范围内,否则给出提示。 Private Sub 入学成绩_BeforeUpdate(Cancel As Integer) If Me!入学成绩 = " " Or IsNull(Me!入学成绩) Then MsgBox "入学成绩不能为空!", vbCritical, "入学成绩" Cancel = True ElseIf Me!入学成绩 > 750 Or Me!入学成绩 < 0 Then MsgBox "入学成绩必须在[0,750]范围内!", vbCritical, "入学成绩" Cancel = True Else MsgBox "入学成绩输入正确!", vbInformation, "入学成绩" End If End Sub 参数Cancel设置为True(-1) ,即可取消BeforeUpdate事件。