Presentation is loading. Please wait.

Presentation is loading. Please wait.

第12章 VBA模块设计.

Similar presentations


Presentation on theme: "第12章 VBA模块设计."— Presentation transcript:

1 第12章 VBA模块设计

2 内容提要 VBA是Microsoft Visual Basic for Application 的
块来实现的一种面向对象的编程方法。 本章将介绍VB语言的使用方法以及VBA在Microsoft Access中的应用。

3 本章知识点 了解面向对象的基本概念 掌握VBA程序设计基础 掌握VBA的程序结构 掌握创建VBA模块的方法

4 12.1 面向对象的基本概念 面向对象技术是一种全新设计和构造软件的技术,它使计算机解决问题的方式越来越接近人类的思维方法,它将需要进行研究的事、物、概念都看作对象,通过对对象的属性、事件和方法进行描述来解决各种问题。面向对象技术具有抽象性、封装性、继承性、多态性等特点,实现了代码的可重用、可扩充、可移植和程序自动生成等功能,从而大大提高了编程效率,减少了软件开发、维护的开销,因此被越来越多的人接受。

5 面向对象编程中的基本概念如下: 对象:是指具有特殊属性和行为方式的实体。在面向对象的程序设计中,对象是一个基本的编程单元。其中,属性用来描述对象的基本特征,行为方式用来描述对象执行的具体动作。 抽象:是指忽略事物的非本质特征,只抽取共同的本质特征。简单地说,抽象是指不考虑各个事物的个性,只提取各个事物的共性。 类:是指具有共同抽象的对象的集合,在面向对象的程序设计中,类是创建对象实例的模板,它包含所创建对象的共同属性描述和共同行为特征的定义。 实例:是指由某个特定的类描述的一个具体对象,也就是说,按照某个模板建立的一个具体对象,这个对象就称为这个类的实例。

6 对象具体三要素,即属性、事件和方法。 属性:是指对象本身固有的性质、状态等,属性是区别于其他对象的基本特征。对象的属性包括可见的和不可见的,可见的属性如对象的大小、形状和颜色等;不可见的属性如对象的生存期等。一个对象可以有多种属性,不同的对象也可以具有部分相同的属性。 事件:就是发生在某个对象上的事情,是指对象所接受的某些外部影响。事件是预先定义好的、能够被对象识别的动作。通常,事件发生在用户与应用程序交互时,事件是向程序发出的命令。 方法:是指对象能够执行的动作,是系统提供的特殊函数或过程,用于完成某种特定功能。

7 12.2 VBA程序设计基础 VBA的开发环境 VBA的语法基础

8 VBA 是基于Visual Basic 发展而来的,它们具有十分相似的语言结构,但是两者也存在着一些区别。其中,最主要的区别在于:VB具有自己的开发环境, 具有完全独立的工作环境和编译、连接系统;而VBA必须依赖于已有的一个应用程序,它没有自己独立的工作环境,必须依附于主应用程序之中。 VBA具有很强的开发能力,其主要功能包括: ◆ 创建对话框及其它界面。 ◆ 创建工具栏。 ◆ 提供建立类模块的功能。 ◆ 建立模块级宏指令。 ◆ 具有完善的数据访问与管理能力,可通过DAO(数据 访问对象)对Access数据库或其它外部数据库进行访问和管理. ◆ 能够使用SQL语句检索数据,与RDO(远程数据对象)结合起来,可建立C/S(客户机/服务机)级的数据通信。 ◆ 能够使用Win32 API提供的功能,建立应用程序与操作系统间的通信。

9 12.2.1 VBA的开发环境 打开VBA开发环境的具体操作步骤如下:
工程资源管理器 代码 属性 VBA的开发环境

10 各个窗口的主要功能描述如下: 工程资源管理器:以树型结构显示数据库中的所有工程模块,方便了用户的浏览和管理,在其中某个模块上双击后,会在“代码窗口”中显示该模块的相关代码。 代码窗口:显示、编辑Visual Basic程序代码的场所,它由“对象列表”、“事件列表”和“代码区域”组成。 属性窗口:用于显示、设置选择的模块所具有的属性。 立即窗口:使用立即窗口可以在中断状态下查询对象的值,也可以在设计时查询表达式的值或命令的结果。 本地窗口:在本地窗口内可自动显示所有在当前过程中的变量声明及变量值。 监视窗口:用来监视各种变量和表达式,将变量和表达式加到监视表达式列表中,可选出想让VB监视的表达式。

11 VBA的语法基础 1. 数据类型 VBA中的常用数据类型可用下列表格来表示:

12 2. 声明变量 程序运行过程中其值可以改变的量称为变量,它是内存中用于临时存储数据 的存储区域。使用变量时应遵循“先声明,后使用”的原则。 VBA中声明变量的格式为: ◆ [Dim∣Private ∣Static ∣Public]<变量名1>[As <类型1>] [,<变量名2>] [As <类型2>]] … ◆ Dim∣Private ∣Static ∣Public:用于定义变量的作用域。 ◆ 变量名:用户自己定义的合法变量名。 VBA中命名变量的规则: ☆ 只能用字母、数字和下划线组成,变量名中不能包含小数点。 ☆ 第一个字符必须是字母或汉字,最后一个字符可以是类型说明符.且组成变 量名的字符数不得超过255个。 ☆ 不得使用VB的保留名或在保留名后加上类型说明符作为变量名。 ☆ 变量名在同一个范围内必须是唯一的。 ☆ 为了增加程序的可读性,可以在变量名前加上一个表示该变量数据类型的 前缀。 ◆ As <类型>:用于定义变量的数据类型,如果在定义变量时省略了该项,则表示将变量定义为Variant类型,即隐形声明变量。 提示:1. 定义变量的数据类型时,用户也可以直接使用类型符来定义,此时类 型符与变量之间不能有空格,例如:Dima%等效 Dim a as Integer. 2. 一个Dim语句可以定义多个变量,但每个变量之间须用逗号(,)隔开.

13 3. 声明常量 常量是指在程序运行过程中,其值保持不变的量,它可以是数字、字符串,也可以是其它值。一般可将常量分为:直接常量和符号常量。
◆ 直接常量:指在程序代码中,以直接明显的形式给出的数据。根据使用的数据类型,直接常量可分为:字符串常量、数值常量、布尔常量、日期常量等。 ◆ 符号常量:指以符号形式来表示的数据。符号常量可分为“系统常量”和“用户自定义常量”。系统常量是指由系统内部提供的以符号形式表示的常量,用户可以直接使用。用户自定义常量则需要“先定义,后使用”,先要使用Const语句来定义符号常量,然后才可以使用。Const语句的语法格式为: [Public|Private] Const<符号常量名> [As<数据类型 >]=<表达式>… 例如:Const  PI as integer =3.14  表示声明一个符号常量PI,该符号常量的值为3.14

14 4. 运算符 VBA中的运算符可分为算术运算符、关系运算符、字符串运算符和逻辑运算符。 算术运算符:用于数学计算。

15 关系运算符 关系运算符属于双目运算符,用来对两个表达式的值 进行比较,比较的结果为逻辑值,即若关系成立则返回True,否则返回False。

16 关系运算符应用的几点说明: 如果两个操作数都是数值型,则按其大小比较。 如果两个操作数都是字符串型,则按字符的ASCII码值 从左到右一一比较。 汉字字符大于西文字符,汉字字符按区码位顺序比较。 日期型数据将日期看成“yyyymmdd”的8位整数,按数值 大小比较。

17 字符串运算符 常用的字符串运算符有“&”和“+”两个。

18 逻辑运算符 逻辑运算符的作用是将操作数进行逻辑运算,结果是逻辑值True 或False。逻辑运算符中,除Not为单目运算符外,其他都为双目运算符。

19 常用内部函数 VBA中的常用内部函数有以下几类: 数学运算函数

20 常用字符串函数

21 日期和时间函数

22 数据输入函数——InputBox函数 在VBA中,经常使用InputBox函数来接收用户在对话框中输入的信息,当用户单击“确定”按钮或按回车键,函数返回输入的值,其值的类型为字符串型(String)。 InputBox函数的基本格式为: InputBox(提示[,标题][,默认][,x坐标位置][,y坐标位置]) 见p232 【注意】 InputBox函数的基本格式中,各项参数次序必须一一对应,除了“提示”一项不能省略外,其余各项均可省略,处于中间的默认部分要用逗号占位符跳过。例如:StrName=InputBox(Msg1,Title, ,200,200),该表达式中省略了“默认”部分的内容,但仍然要保留占位符。

23 数据输出函数——MsgBox函数 MsgBox用于输出数据,它会在屏幕上显示一个对话框。在对话框中显示消息,等待用户单击按钮,并返回所选按钮的整数值。有函数和过程两种形式,函数形式返回一个值,过程形式不返回值。 MsgBox函数格式: 变量=MsgBox(提示[,按钮][,标题]) MsgBox过程格式: MsgBox 提示[,按钮][,标题] 见p233

24 “按钮”部分为可选项,通常为数值表达式,决定信息框按钮的数目和类型及出现在信息框上的图标类型。该数值表达式的值由4部分数值求和得到,也可以用符号常量表示,各部分的设置如下表所示。

25 MsgBox函数返回所选按钮整数值的意义如下表所示。

26 12.3 VBA的程序结构 顺序结构 选择结构 循环结构

27 顺序结构 顺序结构就是过程或函数中程序的各条语句按出现的先后次序依次执行, 没有条件判断转移和循环,原始记录宏的结构就属于顺序结构。顺序结构的语句主要有赋值语句、输入语句、输出语句等。 赋值语句的一般形式为:   变量名 = 表达式   对象名.属性 = 表达式 顺序结构不能随意选择、改变执行的路径,也不能对同一类问题自动地重复执行某段程序,因而灵活性较差。 语句1 语句2 语句3

28 【例12-1】 Totol=100 Readout=“Good Morning” Text1.Text=“请输入你的姓名:” A=35+Total/2 注意:1. 赋值语句具有计算与赋值双重功能,首先计算赋值号“=”右侧表 达式的值,然后将值赋给左侧的变量。 2. 赋值时左边与右边数据类型应一致,不一致时应作处理:当表 达式为数值而与变量精度不一致时,强制转换为变量的精度;当表 达式是数字字符串,左边变量为数值类型,自动转换成数值类型再 赋值;但当表达式有非数字字符串或空串时,则出错;任何非字符 型赋值给字符类型,自动转换为字符类型,如: N%= ‘N为整形变量,转换时四舍五入,N中结果为5。 M%=“456” ’M中的结果为456。 K%=45a 6 ‘出现类型不匹配错误。 3. 赋值号左边只能是变量,不能为常量或表达式 4. 不能在一条赋值句中同时给多个变量赋值,如: Dim x Integer, y As Integer, z As Integer x=y=z=50

29 【例12-2】顺序结构 Private Sub Report _NoData(Cancel As Integer)
Dim strMsg As String, strTitle As String ① Dim inStyle As Integer ② strMsg=“你必须输入一个介于 和 之间的日期” ③ inStyle=vbOKOnly ④函数按钮 strTitle=“日期区间无数据” ⑤ MsgBox strMsg, inStyle, strTitle ⑥ End Sub ①②语句将变量strMsg 、 strTitle、 inStyle分别定义为字符串和整数型 ③将上述“你……日期”赋给内存变量strMsg ④ ⑤也是赋值语句 ⑥是显示一个消息框,显示变量strMsg中的内容,标题是strTitle中的内 容,消息框形式由inStyle变量内容决定 6条语句在Private –End Sub之间,表示一个程序子过程,将按顺序执行。

30 12.3.2 选择结构 VBA的选择结构有两种:If语句和Select Case语句。 If语句
选择结构 VBA的选择结构有两种:If语句和Select Case语句。 If语句 If语句是根据条件判断控制程序的分支,一般有三种形式:单分支结构、双分支结构和多分支结构。 单分支结构 单分支结构,是指仅当“条件表达式”的值为True或非零时,执行Then后面的语句(或语句块),否则不做任何操作,实现单分支选择结构。其语句格式是: If < 条件表达式> Then <语句>  或 If < 条件表达式> Then <语句块>    End If

31 Private Sub txtR_Gotfocus( ) if Val ( txt1 ) >= Val ( txt2 ) Then ①
【例12-3】单分支结构 Private Sub txtR_Gotfocus( ) if Val ( txt1 ) >= Val ( txt2 ) Then ① txtR. Text=“txt1>= txt2” ② End if ① 判断txt1中的值是否大于等于txt2中的值 ② 是真,将字符串txt1>= txt2赋值给txtR

32 双分支结构 双分支结构是指当“条件表达式”的值为真时执行Then后面的语句块,当“条件表达式”的值为假时执行Else后面的语句块。 其语句格式是: If < 条件表达式> Then <语句1> Else <语句2> 或 If <条件表达式> Then  <语句块1>   Else    <语句块2>   End If 见(P235例12.3)

33 Else If <条件表达式2> Then <语句块2> ……
多分支结构 多分支结构,可以根据不同的“条件表达式”值确定执行不同的语句块,实现多分支选择结构。 其语句格式是: If <条件表达式1> Then <语句块1> Else If <条件表达式2> Then  <语句块2>   …… [Else If <条件表达式n+1> Then <语句块n+1>] End If 对上述语句格式的描述为:当条件表达式1为真时,执行语句块1,否则,若条件表达式2为真,则执行语句块2……如果所有的条件表达式都不成立,则执行Else后面的语句块n+1。如果在语句格式中省略了Else部分,则跳出If语句,不执行If语句中的任何语句块,直接去执行If 语句的后续语句(见p 例12.4).

34 Select Case语句 Select Case语句是多分支结构的另一种表示形式,当判断控制仅取决于一个测试变量时,使用Select Case结构可使程序代码更加简单、清晰、易读。 Select Case语句的格式如下: Select Case <条件表达式> Case <表达式列表1> <语句块1> Case <表达式列表2> <语句块2> …… Case <表达式列表n-1> <语句块 n-1> [Case Else <语句块 n>] End Select

35 Select Case语句中,“条件表达式”可以是数值表达式也可以是字符串表达式,还可以是变量。“表达式列表”是用来描述条件表达式中可能取值的情况,它可以由多个表达式组成,表达式与表达式之间要用逗号(,)隔开。表达式列表中要求具有确定的值,而且必须与条件表达式的数据类型相同。表达式列表的表现形式有以下三种: ◆ 表达式列表由一个表达式构成,或由以逗号分隔的多个表达式构成。例如:Case 7,9,10 ◆ 表达式列表表示为一个范围,即<表达式1> To <表达式2>。这里,“表达式1”的值必须小于“表达式2”的值。例如:Case “A” to “Z” ◆ 表达式列表以关系表达式来表示一个区域,即Is <关系操作符> <表达式>。当关系表达式为真时,则执行该Case中的语句块。例如:Case Is <=15 (见p 例12.5)

36 循环结构 Visual Basic提供了三种不同风格的循环结构语句,分别是For-Next语句、While-Wend语句和Do-Loop语句。 For-Next语句 For-Next循环又称计数循环,由于该语句中含有计数变量,可以设置循环次数,因此常用于循环次数预知的场合。 For-Next循环的语句格式如下: For <循环变量> = <初值> To <终值> [Step <步长>] <语句块> Next <循环变量> (见p239 例12.6)

37 2. While—Wend语句 While—Wend语句称为“当”条件型循环语句,它根据某个条件决定循环的次数。当“条件表达式”的值为True时执行循环体;为False时结束循环,执行While-Wend后面的语句。 While—Wend语句格式如下: While <条件表达式> <语句块> Wend 语句的执行过程是:先计算条件表达式的值,若为True,则执行循环体中的语句块,遇到Wend语句时返回While语句继续判断条件表达式的值,若仍为真,则继续执行语句块,重复上述过程直到条件表达式的值为False才退出循环结构,执行Wend语句的后续语句。在While—Wend语句中,如果条件表达式一开始就不成立,则语句块一次也不会被执行。(见p240)

38 Do-Loop语句的形式比较灵活,可分为以下几种: ⑴ 先判断条件的Do…Loop循环 这种结构的循环是先判断条件,后执行语句块,如果
不满足判断条件,语句块一次也不被执行。 格式一: Do While <条件表达式> <语句块> Loop 语句执行过程:先计算条件表达式的值,若结果为True, 则执行语句块中的语句;若为False则退出循环结构。 格式二: Do Until <条件表达式> 语句执行过程:先计算条件表达式的值,若结果为False, 则重复执行语句块中的语句;直到结果为True时退出循环结构。

39 这种结构的循环是先执行语句块,后判断条件,即使不满足判断条件,语句块也至少被执行一次。 格式三: Do <语句块>
⑵ 后判断条件的Do…Loop循环 这种结构的循环是先执行语句块,后判断条件,即使不满足判断条件,语句块也至少被执行一次。 格式三: Do <语句块> Loop While <条件表达式> 语句执行过程:首先执行语句块中语句,然后计算条件表达式,如果条件表达式值为True,则继续执行语句块,否则退出循环结构。 格式四: Loop Until <条件表达式> 语句执行过程:首先执行语句块中语句,然后计算条件表达式,如果条件表达式值为False,则继续执行语句块,直到条件表达式值为真时退出循环结构。(见p 例12.7) 练习:用Do While-Loop结构编写程序:①计算1*2*3*…*100. ②乘法九九表(利用循环嵌套)

40 模块的基本概念 标准模块 类模块

41 标准模块 标准模块是指可以在数据库中被公共使用的模块,该模块中可以包含公用的或模块级的变量、常量、类型、外部过程和全局过程的全局声明或模块级声明。 由于标准模块中包含的主要是公共过程和常用过程,而这些过程不与任何对象关联,因此这些过程可以被数据库中的任何对象调用,并且可以在数据库的任何位置被执行。 标准模块一般用来定义数据库、窗体、报表中需要反复执行的某些操作,为了避免重复编写程序代码,我们可以在标准模块中将这些程序代码定义成通用过程,这样就可以在许多不同的应用程序中通过调用标准模块来反复执行这些操作。 在标准模块中我们可以根据需要定义通用过程,但是不可以定义事件过程。 调用标准模块实际上就是调用标准模块中的过程,因此我们通过函数过程名来实现调用操作。

42 类模块 类模块是指可以包含新对象定义的模块,在类模块中通过编写代码可以创建新对象,在类模块中通过定义过程来定义该对象的自定义属性和方法。新建了一个类模块,就表示新创建了一个对象,定义好的新对象可以在应用程序中直接使用。 Access的类模块有三种基本形式:窗体模块、报表模块和用户自定义类模块。 窗体模块 窗体模块是类模块中的一种,它与某一特定的窗体相关联.在窗体模块中,包含了特定的窗体以及窗体中各个控件的事件所触发的所有事件过程代码,过程的运行用于响应窗体上的事件。可以通过事件过程来控制窗体的行为,以及它们对用户操作做出的响应。例如,单击窗体中的某个命令按钮(如关闭窗体),执行“关闭窗体”这个操作。  

43 报表模块 报表模块也是类模块中的一种,它与某一特定的报表相关联。在报表模块中,包含了特定的报表以及报表中各个控件的事件所触发的所有事件过程代码,过程的运行用于响应报表上的事件。通过执行事件过程代码来控制报表的行为,以及它们对用户操作做出的响应。 用户自定义模块 用户自定义模块可以不依赖于窗体或报表而独立存在,这类型的模块存放在“数据库”窗口中。 类模块和标准模块主要区别在于其作用范围不同

44 12.5 创建VBA模块 在窗体或报表中创建模块 直接创建新模块 VBA模块与宏之间的转换

45 Access中的模块分为标准模块和类模块,不同的模块具有不同的创建方法。创建类模块时,通常是在指定的窗体或报表中创建的;创建标准模块时,需要在“模块”窗口中选择“新建”按钮进行创建。
创建模块的实质是创建通用过程、函数过程和事件过程。 1.通用过程的定义和调用 定义通用过程的格式为: [Public|Private] [Static] Sub 过程名[(参数列表)] [语句块] End Sub Public、Private、Static分别表示公用的、局部的和静态的,前两者用作定义过程的作用域,后者表示在调用之间是否保留通用过程的局部变量值。参数列表形式为:[ByVal]变量名[( )][As 类型], [ByVal]变量名[( )][As 类型]…].过程以Sub开头,以End Sub结束 参数也称为形参或亚元,只能是变量名或数组名(需加括号),在定义时没有值;ByVal表示当该过程被调用时参数是值传递,ByRef是地址(引用)传递的。地址传递是默认的参数传递方式。P247提示

46 2. 创建过程也可以直接在代码窗口中输入过程结构和具体的代码。
创建通用过程通常可以使用以下两种方法: 1. 创建过程时,可以在VBA的编程环境中执行“插入”菜单中的“过程”命令,或在“插入模块”按钮的下拉列表中选择“过程”选项,在随后弹出的“添加过程”对话框中命名过程的名字并设置其作用域,设置好后,单击“确定”按钮,随后在代码窗口中自动添加该过程的框架结构,接着在框架结构中编写具体代码,完成过程的创建。 2. 创建过程也可以直接在代码窗口中输入过程结构和具体的代码。 (见p )

47 通用过程定义好后,要通过调用语句才可以执行该过程中的代码。
过程的调用是一条独立的语句,一般有两种表现形式: 使用Call语句调用:Call <过程名> ([<实参表>]) 直接使用过程名:<过程名> [<实参表>] 注意:有实参必须加括号,无实参则省去括号。②中无Call语句,也无括号。

48 【例12-4】将两个数按大小排序的子过程 Public Sub Swap(x As Integer, y As Integer) Dim z As Integer If x<y Then z=x; x=y; y=z End Sub 注:大数放在x 中,小数放在y中

49 子过程的调用格式为: 子过程名 [参数列表] 或 Call 子过程名 (参数列表) 注: 1. 参数列表中为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。 2. 调用时把实参值传递给对应的形参,其中,值传递时实参的值不随形参的值变化而改变,而地址传递时实参的值随形参值改变而改变。 3. 当参数是数组时形参与实参在参数声明时应省略其维数,但括号不能省。 4. 用call调用时,实参必须加括号,反之则实参之间用“,”分隔。

50 【例12-5】创建一个过程swap ,其功能是使给定的两个参数x和y值互换.
Public Sub Swap(x As Integer, y As Integer) Dim z As Integer z=x x=y y=z End Sub 【例12-6】调用【例12-5】定义的Swap过程 Public Sub li59( ) Dim a As Integer ; Dim b As Integer a=5 ; b=8 Swap a,b ‘调用swap过程也可使用call swap(a,b) MsgBox “交互后a的值为”& a ; MsgBox “交互后b的值为”& b End sub

51 函数过程的定义和调用 定义函数过程的格式为: [Private|Public] [Static] Function <函数过程名>([<形参表>]) [As <类型>] <语句系列> <函数过程名>=<表达式> End Function 在函数过程体内必须要有“<函数过程名>=<表达式>”这条语句,通过这条语句带出返回值。 创建函数过程的方法与创建通用过程的方法基本相似,同样可以通过“添加过程”对话框和直接输入函数过程代码两种方法实现。

52 函数过程的调用比较简单,可以像使用VB内部函数一样来调用Function函数过程。函数过程通常需要带回返回值,因此多采用表达式调用,调用时只需要在表达式中写上函数过程的名字,后面用括号将实参括起来,其语法格式如下: 变量=函数过程名(实参1,实参2,实参3,…,实参n) 函数过程的调用也可以采用通用过程的调用方法来进行调用,这时函数过程会放弃返回值。 提示:见P247

53 【例12-7】一个计算三角形面积的函数。若x、y、z为边长,c为三角形周长的一半。
Public Function area(x As Single,y As Single,z As Single) As Single Dim c Single c=1/2*(x+y+z) area=Sqr(c*(c-x)*(c-y)*(c-z)) end function

54 过程调用参数传递 形式参数是指在定义通用过程时,出现在Sub或Function语句中的变量名后面括号内的参数,是用来接收传送给子过程的数据,形参表中各个变量间用逗号隔开。 实际参数是指在调用Sub或Function过程时写入子过程名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形式参数。 实参可以是常量、表达式、有效的变量名、数组(如A( )). 参数传递指主调过程的参数(调用时已有确定值或内存地址的参数)传递给过程的参数.

55 1. 传址(ByRef) 【例12-8】 子过程: Private Sub GetData1(ByRef f As Integer) f=f+2 end sub 主过程 Private Sub commandil_click( ) Dim j As Integer j=5 Call GetData1(j) Msgbox j End 主过程执行完后j 的值变为7

56 1. 传值(Byval) 【例12-9】 子过程: Private Sub GetData2(Byval f As Integer) f=f+2 end sub 主过程 Private Sub commandil_click( ) Dim j As Integer j=5 Call GetData2(j) Msgbox j End 主过程执行完后j 的值仍然为5

57 3. 事件过程的定义和执行 事件过程通常是针对某个对象进行定义的,选定对象所在的窗体或报表,单击Access工具栏中的“代码”按钮打开VBA编辑界面,在代码窗口中的“对象”列表框中选择要定义事件过程的对象,在“事件”列表框中选择具体的事件名,随后在代码窗口的“代码编辑区”中自动显示出该对象的事件过程框架,在此编辑具体事件过程代码即可。

58 定义事件过程还可以通过另一种方法,选择要定义事件过程的对象,打开该对象的属性窗口,在对象的属性窗口中选择“事件”选项卡,在其中选择某个事件,单击该事件对应的组合框旁边的“省略号”按钮,随后打开“选择生成器”窗口,在其中选择“代码生成器”,打开VBA编程界面后,在代码窗口中自动显示出事件过程的框架,编辑具体的事件过程代码,完成事件过程的创建。 事件过程定义好后,要依靠相应的动作去触发它,只有发生了相关的动作,才可以执行相应的事件过程。如果动作不发生,相应的事件过程将永远不被执行。(见p )

59 在窗体或报表中创建模块 在选定的窗体或报表中创建模块,通常是指创建类模块。类模块中主要包含的是事件过程,因此创建类模块实际上就是创建事件过程。 创建类模块通常有以下两种方法: 第一种方法是,选择需要创建类模块的窗体或报表,单击Access工具栏上的“代码”按钮进入VBA编辑界面,在代码窗口中选择对象和事件,在代码编辑区完成事件过程代码的编辑。 第二种方法是,选择窗体或报表中的某个对象,打开对象的属性窗口,在属性窗口中单击对象某个事件对应的“省略号”按钮进入VBA编辑界面,在代码窗口中完成事件过程的编辑。

60 12.5.2 直接创建新模块 在Access中,直接创建新模块通常是指创建新的标准模块,标准模块中主要包含的是通用过程、函数过程和常用过程。
直接创建新模块 在Access中,直接创建新模块通常是指创建新的标准模块,标准模块中主要包含的是通用过程、函数过程和常用过程。 创建新模块的具体操作步骤如下: 在数据库窗口中选择“模块”对象,在“模块”对象窗口中单击数据库窗口工具栏上的“新建”按钮,随后打开VBA的编程界面,此时默认只显示Microsoft Visual Basic的代码窗口,代码窗口中主要包含了“对象列表框”、“事件列表框”、“代码编辑区”和“视图切换按钮”,按照前面讲述过的添加过程的方法,在VB的代码窗口中添加通用过程、函数过程,并编写具体的过程代码,最后执行“保存”命令保存当前模块,保存好的模块将会显示在“模块”对象窗口中,至此,VBA的一个标准模块就创建好了。(见p )

61 如果一个标准模块不够,还可以通过单击工具栏中的“插入模块”按钮或在“插入”菜单中选择“模块”命令来插入新的模块 。
标准模块创建好后,可以随时打开模块的代码窗口进行编辑、修改。操作方法是:在数据库窗口中选择“模块”对象,在“模块”对象窗口中双击需要进行编辑、修改的模块名称,随后再次打开VBA编辑界面,并显示代码窗口,在其中进行标准模块的编辑、修改即可。(见p250图12.35)

62 VBA模块与宏之间的转换 宏和模块是Access中的两个重要对象,这两个对象都能够灵活地实现许多特殊的任务,但实际使用中,更多时候需要将这两个对象结合起来使用,为了使宏和模块能够更好地结合,更方便用户的使用,Access提供了VBA模块和宏相互进行转换的方法。

63 在VBA模块中实现宏操作 在VBA模块中实现宏操作需要用到一种特殊的对象数据类型,即DoCmd。DoCmd对象允许用户执行各种Access命令,这些命令在Access宏中使用时称为“操作”,在代码中执行时称为DoCmd对象的方法。DoCmd对象可以用来在VBA过程内部实现宏操作。DoCmd对象拥有很多方法,不同的方法可以完成不同的任务,常用的方法有OpenForm(打开一个窗体)、OpenReport(打开一个报表)、 OpenQuery(打开一个查询)、Close(关闭Access对象)、Quit(退出)等。 使用DoCmd对象的语法格式为: DoCmd.方法名 [参数]

64 若要转换窗体或报表中已有的宏,具体操作为:
将已有的宏转换为VBA模块 Microsoft Access可以自动将窗体或报表中已有的宏转换为VB事件过程或模块,执行转换后的VB事件过程或模块与执行宏的效果相同。在Microsoft Access中可以转换窗体或报表中已有的宏,也可以转换不依赖窗体或报表而独立存在的全局宏. 若要转换窗体或报表中已有的宏,具体操作为: 在“设计”视图中打开指定的窗体或报表,在“工具”菜单中选择“宏”命令,在其下拉菜单中选择“将窗体的宏转换为Visual Basic代码”命令,或选择“将报表的宏转换为Visual Basic代码”命令,随后打开“转换窗体宏”对话框,或“转换报表宏”对话框,单击“转换”按钮后弹出“将宏转换到 Visual Basic”消息框,至此转换操作完成。 (见p )

65 若要将全局宏转换为Visual Basic代码,具体操作为:
(见p )

66 小 结 本章首先介绍了面向对象的基本概念以及VBA编程的一些基础知识,接着介绍了VBA的各种数据类型,常量和变量的定义及使用,常用运算符、内部函数的使用,VBA编程的基本语句,以及模块的基本概念和创建方法。 VBA模块设计是Access中的高级应用部分, VBA模块的设计涉及到了VB程序设计语言的程序代码编写,因此在设计过程中需要进行反复练习与调试。 相信在掌握了这部分内容之后,我们就可以轻松地实现一些复杂的任务了。


Download ppt "第12章 VBA模块设计."

Similar presentations


Ads by Google