第8章 模块与VBA编程基础
在Access系统中,借助前面章节介绍的宏对象可以完成事件的响应处理,例如打开和关闭窗体、报表等。但宏的使用也有一定的局限性。一是宏只能处理一些简单的操作,对于复杂条件和循环等结构则无能为力,二是宏对数据库对象的处理,例如,表对象或查询对象的处理能力很弱。
“模块”是将VBA声明和过程作为一个单元进行保存的集合体。通过模块的组织和VBA代码设计,可以大大提高Access数据库应用的处理处理能力,解决复杂问题。
本章主要介绍Access数据库的模块类型及创建、VBA程序设计的基础。 8.1 模块的基本概念
模块是Access系统中的一个重要对象,它以VBA(Visual Basic for Aapplication)以函数过程(Function)或子过程(Sub)为单元的集合方式存储。Access中,模块分为类模块和标准模块两种类型。 8.1.1 类模块
窗体模块和报表模块都属于类模块,它们从属于各自的窗体或报表。在窗体或报表的设计视图环境下可以用两种方法进入相应的模块代码设计区域;一是鼠标点击工具栏“代码”按钮进入;二是为窗体或报表创建事件过程时,系统会自动进入相应代码设计区域。
窗体模块和报表模块通常都含有事件过程,而过程的运行用于响应窗体或报表上的事件。使用事件过程可以控制窗体或报表的行为以及它们对用户操作的响应。
窗体模块和报表模块中的过程可以调用标准模块中已经定义好的过程。
窗体模块和报表迷狂具有局限性,其作用范围局限在所属窗体或报表内部,而生命周期则是伴随着窗体或报表的打开而开始、关闭而结束。 8.1.2 标准模块
标准模块一般用于存放供其他Access数据库对象使用的公共过程。在系统中可以通过创建新的模块对象而进入其代码设计环境。
标准模块通常安排一些公共变量或过程供类模块里的过程调用。在各个标准模块内部也可以定义私有变量和私有过程仅供本模块内部使用。
标准模块中的公共变址和公共过程具有全局特性,其作用范围在整个应用程序里,生命周期是伴随着应用程序的运行而开始、关闭而结束。 8.1.3 将宏转换为模块
在Access系统中,根据需要可以将设计好的宏对象转换为模块代码形式。 8.2 在Access中创建模块 8.2 创建模块
过程是模块的单元组成,由VBA代码编写而成。过程分两种类型:Sub子过程和Function函数过程。 一、在模块中加入过程
模块是装着VBA代码的容器。在窗体或报表的设计视图里,单击工具栏“代码”按钮或者创建窗体或报表的事件过程可以进人类模块的设计和编辑窗口;单击数据库窗体中的“模块”对象标签,然后单击“新建”按钮即可进人标准模块的设计和编辑窗口。
一个模块包含一个声明区域,且可以包含一个或多个子过程(以Sub开头)或函数过程(以Function开头)。模块的声明区域是用来声明模块使用的变量等项目。 1.Sub过程
又称为子过程。执行一系列操作,无返回值。定义格式如下: Sub过程名 [程序代码] End Sub
可以引用过程名来调用该子过程。此外,VBA提供了一个关键字Call,可显示调用的一个子过程。在过程名前加上Call是一个很好的程序设计习惯。 2.Function过程
又称为函数过程。执行一系列操作,有返回值。定义格式如下:
Function过程名As(返回值)类型 [程序代码] End Function
函数过程不能使用Call来调用执行,需要直接引用函数过程名,并由接在函数过程名后的括号所辨别。 二、在模块中执行宏
在模块的过程定义中,使用Docmd对象的RunMacro方法,可以执行设计好的宏。其调用格式为: Docmd.RunMacro MacroName[,RepeatCount ][,RepeatExpression]
其中,MacroName表示当前数据库中宏的有效名称;RepeatCount可选项,用于计算宏运行次数的整数值;RepeatExpression可选项,数值表达式,在每一次运行宏时进行计算,结果为False时,停止运行宏。 8.3 VBA程序设计基础
VBA是徽软Office套件的内置编程语言,其语法与Visual Basic编程语言互相兼容。在Access程序设计中,当某些操作不能用其他Access对象实现,或者实现起来很困难时,就可以利用VBA语言编写代码,完成这些复杂任务。
下面介绍VBA编程语言的一些概念和方法。
8.3.1 面向对象程序设计的基本概念
Access内部提供了功能强大的向导机制,能处理基本的数据库操作。在此基础上再编写适当的程序代码,可以极大地改善程序功能。
Access内嵌的VBA,功能强大,采用目前主流的而向对象机制和可视化编程环境。 1.对象和集合
Access采用面向对象程序开发环境,其数据库窗口可以方便地访问和处理表、查询、窗体、表、页、宏和模块对象。VBA中可以使用这些对象以及范围更广泛的一些可编程对象,例如“记录集”等。
一个对象就是一个实体,如一辆自行车或一个人等。每种对象都具有一些属性以相互区分,如自行车的尺寸、颜色等。即属性可以定义对象的一个实例。例如一辆28#的自行车和一辆26#自行车就分别定义了自行车对象的两个不同的实例。
对象的属性按其类别会有所不同,而且同一对象的不同实例属性构成也可能有差异。比如自行车对象的属性与人这个对象的属性显然不同、同属自行事对象的普通自行车和专业自行车的属性构成也不尽相同。
对象除了属性以外还有方法。对象的方法就是对象的可以执行的行为,自行车行走、人说话等。一般情况下,对象都具有多个方法。
Access应用程序由表、查询、窗体、报表、页、宏和模块对象列表构成,形成不同的类。Access数据库窗体左侧显示的就是数据库的对象类,单击其中的任一对象类,就可以打开相应对象窗口。而且,其中有些对象内部,例如窗体、报表等,还可以包含其他对象-Access中,控件外观和行为可以设置定义。 集合表示的是某类对象所包含的实例构成。 2.属性和方法
属性和方法描述了对象的性质和行为。其引用方式为:对象.属性或对象.行为。
Access中“对象”可以是单一对象,也可以是对象的集合。例如,Labell.Caption属性表示“标签”控件对象的标题属性,Reports.Item(0)表示报表集合中的第一个报表对象。数据库对象的属性均可以在各自的“设计”视图中,通过“属性窗体”进行浏览和设置。
Access应用程序的各个对象都有一些方法可供调用。了解并掌握这些方法的使用可以极大地增强程序劝能,从而写出优秀的Access程序来。
Access中除数据库的7个对象外,还提供一个重要的对象:DoCmd对象。它的主要功能是通过调用包含在内部的方法实现VBA编程中对Access的操作。例如,利用DaCmd对象的 Open Report方法可打开报表“教师信息”,语句格式为: DoCmd.OpenReport“教师信息”
DoCmd对象的方法大都需要参数。有些是必给的。有些是可选的,被忽略的参数取缺省值。例如,上述OpenReport方法有4个参数.见下面调用格式:
DoCmd. OpenReport reportname[,view][,filtername][,wherecondition ] 其中只有reportname(报表名称)参数是必需的。
DoCmd对象还有许多方法,可以通过帮助文件查询使用。 3.事件和事件过程
事件是Access窗休或报表及其上的控件等对象可以“辨识”的动作,如单击鼠标、窗体或报表打开等。在Access数据库系统里,可以通过两种方式来处理窗体、报表或控件的事件响应。一是使用宏对象来设置事件属性,对此前面已有叙述;二是为某个事件编写VBA代码过程,完成指定动作,这样的代码过程称为事件过程或事件响应代码。 8.3.2 Visual Basic编辑环境 一、Visual Basic编辑器
Visual Basic编辑器(VBE,Visual Basic Editor)是编辑VBA代码时使用的界面。VBE编辑器提供了完整的开发和调试工具。图8.1所示的是Access数据库的VBA窗体。窗体主要由标准工具栏、工程窗口、属性窗口和代码窗口等组成。
1.标准工具栏
VBA窗口中的工具栏如图8.2所示。工具栏中主要按钮的功能见表8.1所示。
2.工程窗口(Project)
工程窗口又称工程资源管理器。在其中的列表框中列出了应用程序的所有模块。单击“查看代码”按钮可以打开相应代码窗口,单击“查看对象”按钮可以打开相应对象窗口,单击“切换文件夹”按钮可以隐藏或显示对象分类文件夹。
双击工程窗口上的一个模块或类,就会显示出相应代码的窗口。 3.代码窗口(Code)
代码窗口是由对象组合框、事件组合框和代码编辑区3部分构成。
在代码窗口中可以输入和编辑VBA代码。实际操作时,可以打开多个代码窗口查看各个模块的代码,且代码窗口之间可以进行复制和粘贴。 4.属性窗口(Propertis)
属性窗口列出了所选对象的各个属性,分“按字母序”和“按分类序”两种查看形式。可以直接在属性窗口中编辑对象的属性,这种方法称对象属性的一种“静态”设置法;此外,还可以在代码窗口内使用VBA代码编辑对象的属性,这属于对象属性的“动态”设置方法。
注意,为了在属性窗口中列出Access类对象,应首先打开这些类对象的“设计”视图。 5.立即窗口(Immediate)
立即窗口是用来进行快速的表达式计算、简单方法的操作及进行程序测试的工作窗口。在代码窗口编写代码时,要在立即窗口打印变量或表达式的值,可使用Debug.Print语句。 二、进入VBE编程环境
在本章8.1节介绍了关于模块的概念,VBE的工程资源管理器将模块分为“对象”、“标准”和“类”3种类型模块,全部的VBA代码全都包含在这3种类型模块中。对象模块包含了对窗体和报表发生的事件响应编写的代码;标准模块包含独立于指定对象的代码;类模块用于定义自定义对象的代码,在这里类模块暂不做讨论。
进人VBE编辑环境有多种方式:对于对象模块,在数据库对象窗体中,直接定位到窗体或报表上,然后单击菜单“视图”下的“代码”命令进人;或先定位到窗体或报表设计视图窗口上,通过指定对象事件处理过程进人,其方法有两种:
(1)右键单击控件对象,单击快捷菜单上的“小件生成器”命令,打开如图8.3所示的对话框,选择其
中的“代码生成器”,单击“确定”按钮即可进人。
(2)单击属性窗口的“事件”选项卡,选中某个事件直接单击属性栏右旁的“…”按钮,也可以打开如图8.3所示“选择生成器”对话框,选择其中的“代码生成器”,单击“确定”按钮即可进入。
对于标准模块,有3种进入方法:
(1)对于已存在的标准模块,只需从数据库窗体对象列表上选择“模块”选项打开模块窗口,双击要查看的模块对象即可进人。
(2)要创建新的标准模块,需从数据库窗体对象列表上选择“模块”选项打开模块窗口,单击工具栏上“新建”按钮即可进人。
(3)在数据库对象窗体中,选择“工具”菜单里“宏”子菜单的“Visual Basic编辑器”选项即可进人。使用Alt+F11组合键,可以方便地在数据库窗口和VBE之间进行切换。
三、VBE环境中编写VBA代码
VBA代码是由语句组成的,一条语句就是一行代码,例如: intCount=3 ’将3赋值给变量intCount
Debug. Print intCount ’在立即窗口打印变量intCount的值3
在VBA模块中不能存储单独的语句,必须将语句组织起来形成过程,即VBA程序是块结构,它的主体是事件过程或自定义过程。
在VBE的代码窗口,将上面的两条语句写入一个自定义的子过程Procel: Sub Procel()
Dim intCount As Integer intCount=3
Debug.Print intCount End Sub
将光标定位在子过程Procel的代码中,按F5键运行子过程代码,在立即窗口会看到程序运行结果:3。 对事件过程的代码编写,只要双击工程窗口中任何类或对象都可以在代码窗口中打开相应代码并进行编辑处理。操作时,在代码窗口的左边组合框选定一个对象后,右边过程组合框中会列出该对象所有事件过程,再从该对象事件过程列表选项中选择某个事件名称,系统会自动生成相应的事件过程模板,用户添加代码即可,如图8.4所示。