资源描述
第9章,为了能解决一些实际开发活动中的复杂的数据库应用问题,Access数据库系统提供了“模块”对象来解决此类难题。本章主要介绍Access数据库的模块的基本概念及VBA语言的程序设计。,模块与VBA程序设计,第9章模块与VBA程序设计,本章主要内容,退出,9.1模块概述9.2VBA程序设计概述9.3VBA编程环境VBE窗口9.4VBA编程基础9.5VBA程序语句9.6VBA中的常用操作方法9.7VBA程序调试和错误处理,9.1模块概述,模块是Access数据库中的一个数据库对象,它以VBA(VisualBasicforApplication)语言为基础编写。通俗来说,模块是Access数据库中用于保存VBA程序代码的容器。模块基本上是由声明、语句和(Sub和Function)过程组成的集合,它们作为一个已命名的单元存储在一起,对VBA程序代码进行组织。Access有两种类型的模块:标准模块和类模块。,9.1.1模块类型,1标准模块标准模块包含与任何其他对象都无关的常规过程,以及可以从数据库任何位置运行的经常使用的过程。在标准模块中,可以放置希望供整个数据库的其他过程使用的Sub过程和Function过程。标准模块中的公共变量或公共过程具有全局特性,其作用范围在整个应用程序里,生命周期是伴随着应用程序的运行而开始、关闭而结束。,9.1.1模块类型(续),类模块是可以包含新对象的定义的模块。一个类的每个实例都新建一个对象。窗体模块和报表模块都是类模块,它们从属于各自的窗体和报表。窗体模块和报表模块通常都含有事件过程,而过程的运行用于响应窗体或报表上的事件。窗体模块和报表模块中的过程可以调用标准模块中已经定义好的过程。为窗体或报表创建第一个事件过程时,Access将自动创建与之关联的窗体模块或报表模块。窗体模块和报表模块具有局部特性,其作用范围局限在所属窗体或报表内部,而生命周期则是伴随着窗体或报表的打开而开始、关闭而结束。,9.1.2模块的组成,模块是装着VBA代码的容器。一个模块包含一个声明区域,包含一个或多个过程。如图9-1所示。过程是模块的单元组成,用VBA代码编写而成。过程分为Sub过程和Function过程两种类型。,1声明区域,声明部分主要包括:Option声明、变量或常量或自定义数据类型的声明。模块中可以使用的Option声明语句包括:(1)OptionBase1声明模块中数组下标的默认下界为1,不声明则默认下界为0。(2)OptionCompareDatabase声明模块中需要字符串比较时,将根据数据库的区域ID确定的排序级别进行比较;不声明则按字符ASClI码进行比较。(3)OptionExplicit强制模块用到的变量必须先进行声明。此外,有关变量或常量的声明的语句格式将在9.4节介绍。,2Sub过程,Sub过程又称为子过程。执行一系列操作,无返回值。Sub过程的定义格式如下:Sub过程名(形参列表)VBA程序代码EndSubVBA提供了一个关键字Call,可以调用该子过程。此外,可以引用该过程名来调用该子过程,此时,过程名后不能带有一对圆括号。,3Function过程,Function过程又称为函数过程。执行一系列操作,有返回值。Function过程的定义格式如下:Function过程名(形参列表)VBA程序代码EndFunction函数过程不能使用Call来调用执行,需要直接引用函数过程名并必须后带一对圆括号。,9.2VBA程序设计概述,VB(VisualBasic)是一种面向对象程序设计语言,微软公司将其引用到其他常用的应用程序中,例如,在Office的成员Word、Excel、Access中,这种夹在应用程序中的VisualBasic版本称之为VBA(VisualBasicforApplication)。VBA是VB的子集。Access中使用的编程语言是VBA语言。当某些操作不能用其他Access对象实现或实现起来很困难时,就可以在模块中编写VBA程序代码,以完成这些复杂任务。,Access内部提供了功能强大的向导机制,能处理基本的数据库操作。在此基础上再编写适当的程序代码,可以极大的改善程序功能。VBA是面向对象的程序设计语言。面向对象程序设计是一种以对象为基础,以事件来驱动对象的程序设计方法。,9.2.1对象和对象名,对象是VBA应用程序的基础构件。在开发一个Access数据库应用系统时,必须先建立各种对象,然后围绕对象进行程序设计。在Access中,表、查询、窗体、报表等是对象,字段、窗体和报表中的控件(如标签、文本框、按钮等)也是对象。每个对象均有名称,称为对象名。每个对象都有其属性、方法、事件等。对象有效的名称必须符合Access的标准命名规则,窗体、报表、字段等对象的名称不能超过64个字符,控件对象名称长度不能超过255个字符。,9.2.1对象和对象名(续),对于未绑定控件,默认名称是控件的类型加上一个唯一的整数。例如,对于新建的文本框控件,其默认名称为:Text0、Text1等,以此类推。对于绑定控件,如果通过从字段列表中拖放字段来创建控件,则对象的默认名称是记录源中字段的名称。在“设计视图”(如窗体“设计视图”)窗口中,如果要修改某个对象的名称,可在该对象“属性”对话框中,对“名称”属性赋予新的对象名称。注意:同一窗体、报表或数据访问页上的控件的名称不能相同。但不同窗体、报表或数据访问页上的控件的名称可以相同。,9.2.1对象和对象名(续),Access数据库由表、查询、窗体、报表、页、宏和模块对象列表构成,形成不同的类。集合表达的是某类对象所包含的实例构成。,9.2.2对象的属性,对象属性是描述对象的特征。对象的每个属性都有一个默认值,这在“属性”对话框中可以看到。如果不改变该值,应用程序就使用该默认值,如果默认值不能满足要求,就要对它重新设置。在VBA代码中,对象属性的引用方式:对象名.属性名Access中“对象”可以是单一对象,也可以是对象的集合。例如,Label0.caption中的Label0表示一个“标签”对象,Reports.Item(0)表示报表集合中的第一个报表对象。,9.2.2对象的属性(续),在可视化的“设计视图”(如窗体“设计视图”)窗口中,若要查看或设置某一对象的属性,可以通过“属性”对话框来进行,不过此时在“属性”对话框中列出的属性名是中文的,如图9-2所示。但在VBE窗口中,输入某一对象名及“.”后弹出的“属性及方法”列表框中的属性名或方法名全都是英文的,如图9-3所示。,英文的,中文的,表9-1窗体常用的格式属性,表9-2窗体常用的数据属性,表9-3文本框常用的属性,表9-4命令按钮常用的属性,9.2.3对象的方法,对象的方法就是对象可以执行的行为。如果说,对象的属性是静态规格,那么对象的方法便是动态操作,目的是改变对象的当前状态。在VBA代码中,对象方法的引用方式:对象名.方法名例如,将光标插入点移入名为Text0文本框内的SetFocus方法引用方式为:Text0.SetFocus,9.2.3对象的方法(续),Access应用程序的各个对象都有一些方法可供调用。在VBE窗口中,输入某一对象名及“.”后弹出的“属性及方法”列表框中,列出了该对象可用的的属性名或方法名。此外,Access还提供一个重要的对象:DoCmd对象。它的主要功能是通过调用包含在内部的方法来实现VBA编程中对Access的操作。例如,利用DoCmd对象的OpenReport方法来打开“课程信息”报表的语句格式为:DoCmd.OpenReport课程信息,9.2.4对象的事件,事件是Access窗体或报表及其上的控件等对象可以“辩识”的动作,是对象对外部操作的响应,如在程序执行时,单击命令按钮会产生一个Click事件。事件的发生通常是用户操作的结果。事件在某个对象上发生或对某个对象发生。Access可以响应多种类型的事件:鼠标单击、数据更改、窗体打开或关闭及许多其他类型的事件。,9.2.5对象的事件(续),Access数据库系统里,可以通过两种方式来处理窗体、报表或控件的事件响应。一是使用宏对象来设置事件属性;二是为某个事件编写VBA代码过程,完成指定动作,这样的代码过程称为事件过程或事件响应代码。每个对象都有一系列预先定义的事件集。例如,命令按钮能响应单击、获取焦点、失去焦点等事件,可以通过属性对话框中的“事件”选项卡查看。实际上,Access窗体、报表或控件的事件有很多,其中一部分对象事件如表9-5、表9-6、表9-7、表9-8、表9-9所示。,表9-5窗体对象的部分事件,注意:首次打开窗体时,下列事件将按如下顺序发生:Open事件Load事件Resize事件Activate事件Current事件,表9-6报表对象的部分事件,表9-7命令按钮对象的部分事件,表9-8标签对象的部分事件,表9-9文本框对象的部分事件,9.2.5事件过程,事件过程是事件处理程序,与事件一一对应。它是为响应由用户或程序代码引发的事件或由系统触发的事件而运行的过程。过程包含一系列的VBA语句,用以执行操作或计算值。用户编写的VBA程序代码是放置在称为过程的单元中。例如,需要命令按钮响应Click事件,就把完成Click事件功能的VBA程序语句代码放置到该命令按钮的Click事件的事件过程中。,9.2.6事件过程(续),事件过程的形式如下:PrivateSub对象名_事件名()(事件过程代码)EndSub,例9-1(事件过程例子),例9-1新建一个窗体并在其上放置一个命令按钮,然后创建命令按钮的“单击”事件响应过程。当运行该窗体时,单击该窗体中的命令按钮,显出一个含有“欢迎光临!”文字的消息框。,例9-1(续),图9-7命令按钮的“Click”事件过程代码,9.3VBA编程环境VBE窗口,Access提供了一个VBA的编程环境VBE(VisualBasicEditor)窗口,即VisualBasic编辑器窗口,它是编写和调试VBA程序代码的重要环境。,9.3.1进入VBE编程环境,Access模块分成类模块和标准模块两种。1进入类模块的VBE编程环境对于类模块,在窗体“设计视图”入VBE有如下三种方法:(1)单击工具栏中的“代码”按钮,便打开VBE窗口,进入VBE环境。(2)先打开某对象的“属性”对话框。在该对话框中单击选择“事件”选项卡。在该“事件”选项卡中,选中某个事件并设置其属性为“事件过程”选项。单击“选择生成器”对话框中的“代码生成器”项,单击“确定”按钮,便打开VBE窗口,进入VBE环境。这是进入VBE环境最通用的最方便的方法之一。(3)右键单击某控件,弹出快捷菜单。单击该快捷菜单中的“事件生成器”项,显出“选择生成器”对话框。单击“选择生成器”对话框中的“代码生成器”项,单击“确定”按钮,便打开VBE窗口,进入VBE环境。此时,系统已经为该对象的默认事件自动创建了事件过程的模板,例如,命令按钮的默认事件是Click。,9.3.1进入VBE编程环境(续),2进入标准模块的VBE编程环境对于标准模块,进入VBE有三种方法:(1)在数据库窗口对象列表上选择“模块”,单击工具栏上“新建”按钮,便打开打开VBE窗口,进入VBE环境。(2)在数据库对象窗口,单击“工具”菜单中“宏”级联菜单中的“VisualBasic编辑器”选项,便打开VBE窗口,进入VBE环境。(3)在数据库窗口对象列表上选择“模块”,双击模块对象列表中的某个模块名,便打开VBE窗口,进入VBE环境,并显出该模块已有的代码。,9.3.2VBE窗口,9-14VBE窗口中的“视图”菜单,1标准工具栏,视图MicrosoftOfficeAccess切换Access数据库窗口。插入模块用于插入新模块。运行子过程用户窗体运行模块程序。中断中断正在运行的程序。终止运行重新设计结束正在运行的程序,重新进入模块设计状态设计模块设计模块和非设计模块切换。工程资源管理器打开工程资源管理器窗口。属性窗口打开属性窗口。对象浏览器打开对象浏览器窗口。,图9-15VBE窗口中的标准工具栏,工程资源管理器窗口,单击VBE窗口菜单栏中的“视图”菜单中的“工程资源管理器”命令,即可打开工程资源管理器窗口。工程资源管理器窗口简称工程窗口。在工程窗口中的列表框当中列出了应用程序的所有模块文件。单击“查看代码”按钮可以打开相应代码窗口,单击“查看对象”按钮可以打开相应对象窗口,单击“切换文件夹”按钮可以隐藏或显示对象分类文件夹。双击工程窗口上的一个模块或类,相应的代码窗口就会显示出来。,3属性窗口,单击VBE窗口菜单栏中的“视图”菜单中的“属性”命令,即可打开属性窗口。在属性窗口中,列出了所选对象的各个属性,分“按字母序”和“按分类序”两种查看形式。可以直接在属性窗口中编辑对象的属性,这属于对象属性的“静态”设置方法;可以在代码窗口内用VBA代码编辑对象的属性,这属于对象属性的“动态”设置方法。注意:为了在属性窗口中列出Access类对象,应首先打开这些类对象的“设计”视图。,4代码窗口,单击VBE窗口菜单栏中的“视图”菜单中的“代码窗口”命令,即可打开代码窗口。可以使用代码窗口来编写、显示以及编辑VBA程序代码。实际操作时,在打开各模块的代码窗口后,可以查看不同窗体或模块中的代码,并且在它们之间做复制以及粘贴的动作。,5立即窗口,单击VBE窗口菜单栏中的“视图”菜单中的“立即窗口”命令,即可打开立即窗口。在立即窗口中,可以键入或粘贴一行代码,然后按下ENTER键来执行该代码。但是立即窗口中的代码是不能存储的。若在立即窗口键入“Print19Mod7”,则在下一行输出的结果是5。若在立即窗口键入“?19Mod7”,则在下一行输出的结果是5。若在立即窗口键入“?Mid(“Access”,3,2)”,则在下一行输出的结果是ce。,5立即窗口(续),注意,“Print”命令与“?”命令的功能相同,都是在立即窗口输出结果值。此外,在VBE代码中,若使用形如“Debug.Print表达式”的语句,也将在立即窗口中输出该表达式的结果值。例如,语句Debug.Print3*5,将在立即窗口输出结果值是15。,6.本地窗口7.监视窗口,6本地窗口单击VBE窗口菜单栏中的“视图”菜单中的“本地窗口”命令,即可打开本地窗口。在本地窗口中,可自动显示出所有在当前过程中的变量声明及变量值。7监视窗口单击VBE窗口菜单栏中的“视图”菜单中的“监视窗口”命令,即可打开监视窗口。当工程中有定义监视表达式定义时,就会自动出现。,9.3.3VBE环境中编写VBA代码,Access的VBE编辑环境提供了完整的开发和调试工具。其中的代码窗口顶部包含两个组合框,左侧为对象列表,右侧为过程列表。操作时,从左侧组合框选定一个对象后,右侧过程组合框中会列出该对象的所有事件过程,再从该对象事件过程列表选项中选择某个事件名称,系统会自动生成相应的事件过程模块板,用户添加代码即可。双击工程窗口中任何类或对象都可以在代码窗口中打开相应代码并进行编辑处理。在代码窗口使用时,系统提供了一些便利的功能:,1自动显示提示信息,在代码窗口中输入程序代码时,VBE会根据情况显示不同的生成器提示信息。(1)输入控件名当输入已有的控件名后接着输入英文的句号字符“.”时,VBE自动弹出该控件可用的属性和方法列表。注意,如果不会弹出该控件的属性和方法列表,肯定该控件名有错。(2)输入函数当输入已有函数名时,VBE自动列出该函数的使用格式,包括其参数提示信息。例如,当输入函数名及左圆括号“Mid(”时,显出Mid函数的参数提示信息如图9-17所示,1自动显示提示信息(续),(3)输入命令对于输入命令代码,在关闭VBE窗口时,VBE自动对该命令代码进行语法检查。,2F1帮助信息,可以将光标停留在某个语句命令上并按F1键,系统会立刻提供相关命令的帮助信息。也可以在代码窗口中,先选择某个“属性”名或选择“方法”名,然后按F1键,系统会立刻提供该“属性”或“方法”的功能说明、语法格式及使用范例等帮助信息。例如,先选择Caption(如图9-18所示),按F1键便显出Caption的帮助信息,如图9-19所示。,9.4VBA编程基础,在编写VBA代码时,需要用到程序设计基础知识,包括VBA的标准数据类型、自定义数据类型、常量与变量、运算符、表达式以及常用函数等内容。,9.4.1VBA的标准数据类型,VBA的数据类型有系统定义和自定义两种,系统定义的数据类型称为标准数据类型。Access数据库系统创建表对象时所涉及到的字段数据类型(除了OLE对象和备注数据类型外),在VBA中都有相对应的数据类型。VBA的标准数据类型如表9-10所示。在表9-10中列出了VBA数据类型及其对应的类型关键字、类型符、(用于变量命名的)前缀、所占的存储空间及取值范围等内容。其中的类型符即是类型声明字符,它是附加到变量名上的字符,指出变量的数据类型,如k$。,表9-10VBA标准数据类型,表9-10VBA标准数据类型(部分说明),(1)字符串型(String,类型符$)字符串是一个字符序列,包括除双引号和Entrer键以外可打印的所有字符。一个字符串的前后要用英文的双引号括起来,故英文的双引号作为字符串的定界符号。例如:2008、刘星和都是字符串型数据。字符串中的空格也是有效字符。字符串长度是指该字符串所包含的字符个数。例如:2008年的长度为5。长度为0的字符串(即)称为空字符串。字符串有两种,即变长字符串与定长字符串。变长字符串的长度是不确定的,变长字符串最多可包含大约20亿(231)个字符。定长字符串的长度是确定的,定长字符串可包含1到大约64K(216)个字符。,表9-10VBA标准数据类型(部分说明),(2)布尔型数据(Boolean)布尔型数据只有两个值:True或False。布尔型数据转换为其他类型数据时,True转换为-1,False转换为0;其他类型数据转换为布尔型时,0转换为False,其他转换为True。,表9-10VBA标准数据类型(部分说明),(4)日期型数据(Date)任何可以识别的文本日期数据可以赋给日期变量。“日期/时间”类型数据必须前后用英文的井号“#”括住。允许用各种表示日期和时间的格式。日期可以用“/”、“,”、“-”分隔开,可以是年、月、日,也可以是月、日、年的顺序。时间必须用“:”分隔,顺序是:时、分、秒。例如:#1999-08-1110:25:00pm#、#08/23/2008#、#03-25-200720:30:00#等都是有效的日期型数据。在VBA中会自动转换成mm/dd/yyyy(月/日/年)的形式。,表9-14VBA标准数据类型(部分说明),(4)变体类型(Variant)Variant数据类型是所有没被显式声明(用如Dim、Private、Public或Static等语句)为其他类型变量的数据类型。Variant数据类型并没有类型符。变体类型是一种特殊的数据类型,除了定长字符串类型及用户自定义类型外,可以包含其他任何类型的数据;变体类型还可以包含Empty、Error、Nothing和Null特殊值。使用时,可以用VarType与TypeName两个函数来检查Variant型变量中数据的具体对应数据类型。VBA中规定,如果没有显式声明或使用类型说明符来定义变量的数据类型,默认为变体类型(Variant)。,9.4.2变量,变量在程序运行期间其值可以发生变化的量。实际上,变量是内存中的临时存储单元,用于存储数据。由于计算机处理数据时,必须将数据装入内存,因此,在高级语言编写的程序中,需要将存放数据的内存单元命名,通过内存单元名(即变量名)来访问其中的数据。一个变量有三个要素:变量名、数据类型和变量值。在VBA代码中,通过变量名来引用变量。,1.变量的命名,变量名的命名规则如下:(1)变量名的命名同字段命名一样,变量名必须以字母(或汉字)开头;(2)变量名可以包含字母、数字或下划线字符,但不能包含标点符号或空格;(3)变量名的字符个数不能超过255个字符;(4)变量命名不能使用VBA的关键字(如For、To、Next、If、While等)。注意:VBA中的变量命名不区分字母大小写,如“a”和“A”代表的是同一个变量。,9.4.2变量(例),例如,a、b_1、st_x等可以作为变量名,但1a、b.1、x-1、y5、s/3不可作为变量名。,有一个空格,2.显式变量,变量先声明(即先定义)后使用是较好的程序设计习惯。可以在模块设计窗口的顶部说明区域中,加入OptionExplicit语句来强制要求所有变量必须先定义才能使用。显式声明变量的基本格式:Dim变量名As类型关键字,变量名As类型关键字其中“As类型关键字”用于指明该变量的数据类型。如果省略As类型关键字部分,则默认定义该变量为Variant数据类型。例如:DimiAsIntegerDimjAsLong,nAsSingle,tAsString,fAsBoolean,g注意,变量g是定义成变体类型(即Variant)。,2.显式变量(续),例如:DimiAsIntegerDimjAsLong,nAsSingle,tAsString,fAsBoolean,g注意,变量g是定义成变体类型(即Variant)。DimxmAsString,xhAsString*8注意,xm是变长的字符串型变量,xh是定长的8个字符长度的字符串型变量。此外,下面这个声明语句DimaAsinteger,bAslong,cAssingle也可以用类型符代替类型关键字来定义变量,即可以改写为:Dima%,b&,c!,3隐式变量,隐式变量(或称隐含变量)是指没有直接定义,借助将一个值指定给变量名的方式来建立的变量。当在变量名称后没有附加类型符来指明隐含变量的数据类型时,默认为变体类型。例如:m=168.95语句定义一个变体类型变量m值是168.95。下面语句建立了一个整型数据类型的变量。k%=59,9.4.3变量的作用域与生命周期,1变量的作用域(1)局部变量在模块的过程内部声明的变量称为局部变量。局部变量仅在过程代码执行时才可见。在子过程或函数过程中声明的或不用DimAs关键字声明而直接使用的变量作用域都属于局部范围。局部变量仅在该过程范围中有效。(2)模块级变量在模块中的所有过程之外的起始位置声明的变量称为模块级变量。在模块级变量声明区域,用DimAs关键字声明的变量的作用域就属于模块范围。模块级变量仅在该模块范围中有效。(3)全局变量在标准模块的所有过程之外的起始位置声明的变量称为全局变量,在标准模块的变量声明区域,用PublicAs关键字声明的变量的作用域就属于全局范围。,9.4.3变量的作用域与生命周期(续),2变量的生命周期变量的生命周期是指变量在运行时有效的持续时间。变量的持续时间是从变量声明语句所在的过程第一次运行到代码执行完毕并将控制权交回调用它的过程为止的时间。每次子过程或函数过程被调用时,以DimAs语句声明的局部变量,会被设定默认值,数值数据类型变量的默认值为0,字符串型变量的默认值为空字符串(“”),布尔型变量的默认值为False。这些局部变量,有着与子过程或函数过程等长的持续时间。,9.4.4数组,数组是在有规则的结构中包含一种数据类型的一组数据,也称作数组元素变量。数组变量由变量名和数组下标构成,通常用Dim语句来声明数组。,1一维数组,一维数组定义格式:Dim数组名(下标下界to下标上界)As类型关键字说明:(1)下标:下标下界和下标上界必须为常数,不允许表达式或变量。下标下界和下标上界为整数,不得超过Long数据类型的范围,并且下标下界应该小于下标上界。如果不指定下标下界,即省略了“下标下界to”部分,则默认该数组的“下标下界”为0,该数组的数组元素从“数组名(0)”至“数组名(下标上界)”。,1一维数组(续),(2)“As类型关键字”用于声明数组的数据类型。如果省略了“As类型关键字”部分,默认为变体类型数组。如果声明为数值型(如字节型、整型、长整型、单精度、),数组中的全部元素都初始化为0,如果声明为字符串型,数组中的全部元素都初始化为空字符串。如果声明为布尔型,数组中的全部元素都初始化为False。(3)“数组名”的命名遵守变量命名规则。,1一维数组(续),DimE(1to4)AsSingle声明了一个一维数组,该数组的名称为E,类型为Single,占据4个单精度变量的空间。该数组包含4个数组元素,数组下标为14,即:E(1)、E(2)、E(3)和E(4)。例如:DimF(5)AsInteger声明了一个一维数组,该数组的名字为F,类型为Integer,占据6个整型变量的空间。该数组包含6个数组元素,数组下标为05,即:F(0)、F(1)、F(2)、F(3)、F(4)和F(5)。,2二维数组,二维数组定义格式:Dim数组名(下标下界ito下标上界i,下标下界jto下标上界j)As类型关键字如果省略“下标下界ito”,默认该数组的“下标下界i”为0。如果省略“下标下界jto”,默认该数组的“下标下界j”为0。,1二维数组(续),例如:DimG(2,3)AsLong定义了一个二维数组,该数组的名字为G,类型为Long,占据12个(3行4列)长整型变量的空间。该数组包含12个数组元素,如表9-11所示。,3多维数组,VAB也支持多维数组。可以在数组下标中加入多个数值,并以逗号分隔开,由此来建立多维数组,最多可以声明60维。下面语句声明了一个三维数组W:DimW(5,3,4)AsInteger数组W有6*4*5=120个元素,4动态数组,VBA还特别支持动态数组。定义和使用方法是:先用Dim显式定义数组但不指明数组元素数目,然后用ReDim关键字来决定数组包含的元素数目来定义数组,以建立动态数组。例如:DimE()AsLong定义动态数组EReDimE(9,9,9)分配数组的空间大小.,5数组的下标下界,通常,数组的默认下标下界是0,但如果在模块的声明部分使用了“OptionBase1”语句,则数组的默认下标下界就是1。,9.4.5用户自定义的数据类型,用户定义数据类型可以是任何用Type语句定义的数据类型。用户自定义类型可包含一个或多个某种标准数据类型的数据元素、数组或一个先前定义的用户自定义数据类型。Type语句格式如下:Type用户定义数据类型名AsAs.EndType,例9-2(用户定义的数据类型例子),例9-2创建一个标准模块,模块名为“例9-2标准模块-声明自定义数据类型XJ”。创建一个窗体,窗体名为“例9-2用户自定义数据类型XJ应用”。(1)标准模块“例9-2标准模块-声明自定义数据类型XJ”中的VBA代码如下:TypeXJ学号AsString*8姓名AsString班号AsLong性别AsString*1EndType,(2)“例9-2用户自定义数据类型XJ应用”窗体类模块中的VBA代码如下:PrivateSubCommand0_Click()Rem在标准模块“例9-2自定义数据类型XJ的模块”中已声明了用户自定义数据类型XJDimStAsXJ将变量St指定为用户自定义数据类型XJSt.学号=08031001St.姓名=刘娟娟St.班号=2St.性别=女Text0=St.学号&“,”&St.姓名&“,”&St.班号&“,”&St.性别用关键字WithEndWith语句简化上述程序中变量St重复的部分WithSt.学号=08031001.姓名=刘娟娟.班号=2.性别=女text1=.学号&,&.姓名&,&.班号&,&.性别EndWithEndSub,9.4.6数据库对象变量,Access建立的数据库对象及其属性,均可被看成是VBA程序代码中的变量及其指定的值来加以引用。Access中窗体与报表对象的引用格式分别为:Forms!窗体名称!控件名称.属性名称Reports!报表名称!控件名称.属性名称关键字Forms表示窗体对象集合,Reports表示报表对象集合。英文的感叹号“!”分隔开父子对象。若省略“属性名称”部分,则默认为控件的基本属性Value。如果在本窗体的模块中引用,可以使用Me代替Forms!窗体名称,窗体对象的引用格式变为:Me!控件名称.属性名称,9.4.6数据库对象变量(续),例如,要在VBA代码中引用窗体“学生资料”中名为“学号”的文本框控件,可使用下面三个语句之一:(注:下面这三个语句的效果是一样的。)Forms!学生资料!学号.Value=08031001或Forms!学生资料!学号=08031001或Forms!学生资料!学号=08031001,省略属性名称.Value,用英文方括号括住文本框控件名“学号”,9.4.6数据库对象变量(续),例如,如果在窗体“学生资料”的模块中,引用本窗体“学生资料”中名为“学号”的文本框控件,可以使用Me代替Forms!学生资料,则上例中的三个语句变为:Me!学号.Value=08031001或Me!学号=08031001或Me!学号=08031001,用Me代替Forms!学生资料,9.4.6数据库对象变量(续),此外,还可以使用Set关键字来建立控件对象的变量。当需要多次引用对象时,这样处理很方便。例如,要多次操作引用窗体“学生资料”中的控件“姓名”的值时,可以使用以下方式:DimtxtNameAsControl定义控件类型变量SettxtName=Forms!学生资料!姓名txtName=刘娟娟操作对象变量借助将变量定义为对象类型并使用Set语句将对象指派到变量的方法,可以将任何数据库对象指定为变量的名称。当指定给对象一个变量名时,不是创建而是引用内存的对象。,请在p235第7行首im之前补加D,9.4.7常量,常量是指在程序运行过程中,其值不能被改变的量。常量的使用可提高程序代码的可读性,并且能使程序代码更加容易维护。在VBA中,常量有:直接常量符号常量系统常量内部常量,1直接常量,直接常量直接出现在代码中,即通常的数值或字符串值,也称为字面常量,它的表示形式决定它的类型和值。例如:字符型:中大2009届毕业生数值型:3.14159、-56、8.432E-15日期型:#2007-01-03#逻辑型:True、False,2符号常量,在VBA编程过程中,符号常量使用关键字Const来定义。定义符号常量的格式:Const常量名=常量值说明:常量名的命名规则同变量。符号常量定义时不需要为常量指明数据类型,该符号常量的数据类型由常量值决定,VBA会自动按存储效率最高的方式来确定其数据类型。符号常量一般要求大写命名,以便与变量区分。例如,ConstPI=3.14159就是把3.14159定义为符号常量PI,在程序代码中,就可以在使用圆周率的地方使用PI,方便修改。,3系统常量,Access系统内部包含有若干个启动时就建立的系统常量,有True、False、Yes、No、On、Off和Null等。编码时可以直接使用。,4内部常量(也称固有常量),VBA提供了一些预定义的内部符号常量。Access内部常量以前缀ac开头。一般来说,来自Access库的常量以“ac”开头,来自ADO库的常量以“ad”开头,而来自VisualBasic库的常量则以“vb”开头。例如:acForm、adAddNew、vbCurrency。也可以用“对象浏览器”来查看所有可用对象库中的固有常量列表。,在列表“成员”中选择一个常量后,它的数值将出现在“对象浏览器”窗口的底部,如图9-20所示的“ConstacCmdQueryGroupBy=361”。一个好的编程习惯是尽可能的使用常量名字而不使用它们的数值。用户不能将这些内部常量的名字作为用户自定义常量或变量的名字。,9.4.9运算符,在VBA编程语言中,提供许多运算符来完成各种形式的运算和处理。根据运算不同,可以分成四种类型运算符:算术运算符关系运算符逻辑运算符连接运算符,1算术运算符,算术运算符用于算术运算,主要有8个运算符,如表9-12所示。,2关系运算符,关系运算(也称比较运算)符用于对两个表达式的值进行比较,比较的结果为逻辑值:True(真)或False(假)。关系运算符有6个,如表9-13所示。,3逻辑运算符,逻辑运算符用于对两个或一个逻辑量进行逻辑运算,逻辑运算的结果仍为逻辑值。逻辑运算主要有And(“与”)、Or(“或”)和Not(“非”)3个运算符。其中的AND和OR是对两个逻辑量进行逻辑运算,Not是对一个逻辑量进行逻辑运算。运算时,按Not,And,Or优先级执行,Not的优先级最高,Or的优先级最低。逻辑运算的运算法则如表9-14所示。,3逻辑运算符(续),逻辑运算的运算法则如表9-14所示。,3逻辑运算符(续),4字符串连接运算符,字符串连接运算符有“&”和“+”两个连接运算符。字符串连接运算符作用是把两个字符串连接起来。注意“+”和“&”的区别。当两个被连接的数据都是字符串型时,它们的作用相同。当字符串型和数值型连接时,若用“&”连接运算符,则会先把数值型数据都转化成字符串型然后连接;若用“+”连接运算符,则会出现语法错误,如图9-21所示。,4字符串连接运算符(续),例如:DimMyValue变量定义MyValue=电子大学&通讯学院返回电子大学通讯学院MyValue=电子大学+通讯学院返回电子大学通讯学院MyValue=电子大学&68&届毕业生返回电子大学68届毕业生MyValue=电子大学+68+届毕业生将返回运行时错误信息,如图9-21所示。,9.4.10表达式和运算符的优先级,1表达式将常量、变量或函数等用上述运算符连接在一起构成的式子就是表达式。例如,4*32/4-7Mod52+23就是一个表达式,该表达式的运算结果是布尔值True。补充说明:在VBA中,逻辑量在表达式里进行算术运算时,True值被当成-1,False值被当成0处理。例如:表达式185-True+2+False的运算结果是11。其运算步骤如下:185-True+2+False3-(-1)+2+04+2+06,在书写表达式时,应当注意一些规则:,(1)每个符号占一格,所有符号必须一个一个地并排写在同一横线上,不能在右上角或右下角写方次或下标。例如:X3要写成X3例如:X1+X2要写成X1+X2(2)所有运算符都不能省略。例如:2X必须写成2*X例如:3(a+b)要写成3*(a+b)(3)所有括号都用圆括号,要成对出现。例如:5X+2(Y+Z)必须写成5*(X+2*(Y+Z)(4)要把数学表达式中的有些符号,改成VB可以表示的符号。例如:2R可改为2*PI*R例如:数学式,写成VBA表达式为:(-b+sqr(b2-4*a*c)/(2*a),Sqr是平方根函数,表达式中运算符优先级,当一个表达式由多个运算符连接在一起时,运算进行的先后顺序是由运算符优先级决定的。优先级高的运算先进行,优先级相同的运算依照从左向右的顺序进行。VBA中常用运算的优先级的划分如表9-15所示。,表9-15运算符的优先级,例如:算术表达式5+2*42Mod218/2按运算符的优先级分成若干运算步骤,按乘幂“”、乘“*”、除“/”、整除“”、求模“Mod”、加“+”次序进行运算,运算结果是7。具体运算步骤大致如下:5+2*42Mod218/25+2*16Mod218/25+32Mod2145+32Mod55+27,9.4.10常用标准函数,标准函数的调用格式:函数名(,)其中,函数名必不可少,函数的实参(即实际参数)放在函数名后的圆括号中,每两个实参之间要用英文的逗号分隔开。实参可以是常量、变量或表达式。函数可以没有实参,也可以有一个或多个实参。每个函数被调用时,都会返回一个值。函数的实参和返回值都有特定的数据类型对应。,1数学函数(表9-16),Rnd函数说明,Rnd通常与Int函数配合使用,要生成a,b区间范围内(包括a和b)的随机整数,a是下限,b是上限,并且a小于b,可以采用如下表达式:Int(b-a+1)*Rnd+a)例如,Int(4-1+1*Rnd+1),即Int(4*Rnd+1),可以产生14之间(含1和4)的随机整数。可以是1,2,3或4,这由运行时随机产生。,Rnd函数说明,例如:RandomizeInt(100*Rnd)产生0,99的随机整数Int(101*Rnd)产生0,100的随机整数Int(100*Rnd+1)产生1,100的随机整数Int(200*Rnd+100)产生100,299的随机整数Int(201*Rnd+100)产生100,300的随机整数Int(900*Rnd+100)产生100,999的随机整数,2字符串函数(表9-17),字符串长度检测函数Len示例,格式:Len(或)返回字符串所含字符数。注意:定长字符串,其长度是定义时的长度。DimxAsString*10声明x为10个字符长度的定长字符串变量DimIx=200808Len1=Len(12345)返回5Len2=Len(168)出错Len3=Len(计算机中心)返回5Len4=Len(x)返回10,打开“Len函数示例”窗体看运行结果,字符串截取函数示例,例如:str1=optionStr2=计算机软件水平考试Str=Left(str1,3)返回optStr=Left(str2,5)返回计算机软件Str=Right(str1,2)返回onStr=Right(str2,2)返回考试Str=Mid(str1,3,2)返回tiStr=Mid(str2,1,3)返回计算机Str=Mid(str2,4)返回软件水平考试,生成n个重复字符的String函数示例,格式:String(n,字符)注意:如果参数“字符”是一个字符串,则仅返回n个该字符串第1个字符。如果参数“字符”是某一字符的ASCII码,则仅返回n个该ASCII码对应的字符例如:str1=String(5,b)返回bbbbbstr1=String(5,bcd)返回bbbbbstr1=String(5,98)返回bbbbb,98是b的ASCII码值,3日期/时间函数p241,常用的日期/时间函数如表9-18所示。获取系统日期和时间函数例子:D=Date返回系统日期,如:2009-01-16D=Date()返回系统日期,如:2009-01-16T=Time返回系统时间,如:10:45:29T=Time()返回系统时间,如:10:45:29DT=Now返回系统日期和时间如:2009-01-1610:46:02DT=Now()返回系统日期和时间如:2009-01-1610:46:02,4类型转换函数p244,类型转换函数的功能是将某数据类型的数据转换成指定数据类型的数据。Access提供了一些数据类型转换函数,如表9-22所示。,说明:(4)Chr函数Chr()注意:Chr函数将字符代码转换字符,即返回与字符代码相关的字符。例如:s=Chr(70)返回fs=Chr(13)返回回车符(5)Str函数Str()注意:Str函数将数值表达式值转换成字符串。当一数字转成字符串时,总在前头保留一空格来表示正负。表达式值为正,返回的字符串包含一个前导空格表示有一个正号。例如:s=Str(86)返回86,有一前导空格s=Str(-6)返回-6,(6)Val函数Val()Val函数将数字字符串转换成数值型数字。数字串转换时可自动将字符串中的空格、制表符和换行符去掉,当遇到它不能识别为数字的第一个字符时,停止读入字符串。例如:s=Val(16)返回16s=Val(-345)返回-345s=Val(76af89)返回76,9.5VBA程序语句,VBA程序是由若干VBA语句构成。一个VBA语句是能够完成某项操作的一条命令。VBA程序语句按照其功能不同分为以下两大类型:1声明语句声明语句用于给变量、常量或过程定义命名。2执行语句执行语句用于执行赋值操作,调用过程,实现各种流程控制。执行语句又分为如下三种结构:(1)顺序结构:按照语句顺序顺次执行。即程序从左至右、自顶向下执行语句。顺序结构最简单。如赋值语句、过程调用语句等。(2)选择结构:根据条件值选择执行路径。如条件语句。(3)循环结构:重复执行某一段程序语句。如循环语句。,9.5.1VBA程序语句编写规则,(1)通常每个语句占一行,如果要在一行中编写多个语句,则每两个语句之间必须用英文的冒号“:”分隔。例如:a=0:i=i+1Text0.Value=你好!:Text0.Enabled=True(2)当一条语句很长时,一行编写不下,可使用续行符(一个空格后面跟随一个下划线“_”),将长语句分成多行。例如:Msgbox(尊敬的&name&先生/女士:欢迎您使用&_Access基础知识教育的示范数据库家庭经营管理数据库!)(3)在VBA代码中,不区分字母的大小写,例如,SUM与Sum是等同的。(4)当输入一行语句并按下回车键后,如果该行代码以红色文本显示(有时伴有错误信息出现)时,则表明该行语句代码存在语法错误,用户应更正。,9.5.2VBA注释语句,在VBA程序中,注释可以通过以下两种方式实现:(1)使用Rem语句(2)用英文单引号注释语句可写在某个语句的后面,也可以单独占据一整行,但是,当把Rem表示的注释语句写在某个语句的后面的同一行时,必须在该语句与Rem之间用一个英文的冒号“:”分隔开。例如:s=3.14*r*r求圆的面积上一句是把英文单引号注释语句写在某个语句的后面的同一行时例句r=2:Remr表示圆的半径Rem上一句是把Rem表示的注释语句写在某个语句的后面的同一行时例句,此外,可以通过选中两行或多行代码后,通过单击“编辑”工具栏(如图9-22所示)上的“设置注释块”按钮或“解除注释块”按钮来对该代码块添加或删除注释符号“”。,图9-22“编辑”工具栏,9.5.3VBA声明语句,声明语句用于命名和定义常量、变量、数组和过程。在定义了这些内容的同时,也定义了它们的生命周期与作用范围,这取于定义位置(局部、模块或全局)和使用的关键字(Dim、Public、Static或Global)。例如,有一程序段如下:SubSample()ConstPI=3.14159DimintIasInteger,lngKasAsLong,Y(3,5)AsDouble.EndSubConst声明语句定义了一个名为PI的符号常量。Dim声明语句则定义了一个名为intI的整型变量、一个名为lngK的长整型变量和一个名为Y的有24个数组元素的双精度型的二维数组。,9.5.4VBA赋值语句,赋值语句是为变量指定一个表达式。通常以符号(=)连接。赋值语句格式:Let变量名=表达式功能:计算右端的表达式,并把计算结果(值)赋值给左端的变量。Let为可选项,表示赋值,通常省略。符号“=”被称为赋值号。赋值号“=”左边的变量也可以是对象的属性,但赋值号“=”左边不能是常量。例如:I=72Mod5把右端表达式的运算结果值4赋给变量Itext1.Value=语言把字符串语言赋给文本框text1的Value属性P=VBA&text1.Value把右端表达式的运算结果值VBA语言赋给变量P,9.5.5输入/输出的语句,在VBA程序中,有时需要接收用户的数据输入,有时需要将操作的结果数据输出告知用户,为此,VBA提供有相应的输入和输出功能。InputBoxMsgBox,1InputBox函数,InputBox函数调用的功能是显出一个输入对话框,等待用户在该对话框的文本框中键入文本。当用户单击“确定”按钮,该函数返回文本框中的输入的值;当用户单击“取消”按钮,该函数将返回长度为零的空字符串()。InputBox函数格式:InputBox(prompt,title,default,xpos,ypos,helpfile,context)DimaAsLonga=InputBox(请输入8个字符的学号:,输入学号,1000,200),2MsgBox,MsgBox调用的功能是打开一个消息对话框,并在该对话框中显示消息,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。MsgBox函数格式:MsgBox(prompt,buttons,title,helpfile,context)MsgBox过程格式:MsgBoxprompt,buttons,title,helpfile,context请注意MsgBox函数与MsgBox过程的格式区别,MsgBox函数格式中是有一对圆括号的,而MsgBox过程格式中是没有圆括号的。,MsgBox的参数说明,MsgBox函数与MsgBox过程的参数相同。(1)prompt:本参数是MsgBox函数中必需的、唯一不能省略的选项。本参数是字符串表达式,作为显示在对话框中的消息。(2)buttons:本参数可选的。它是整型表达式,指定显示按钮的数目及形式,使用的图标样式,默认按钮是什么以及消息框的强制回应等。如果省略buttons参数,默认值为0。本参数按钮的整型表达式中的各项值如表9-23所示。在表9-23中,第一组值(05)描述了对话框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512)说明哪一个按钮是缺省(默认)值;而第四组值(0,4096)则决定消息框的强制返回性。将这些数字相加以生成buttons参数值的时候,只能由每组值取用一个数字。(3)title:本参数是可选的。用于指定在对话框标题栏中要显示的字符串表达式。,MsgBox函数的返回值,表9-24MsgBox函数的返回值,例如:a=MsgBox(请用户选择单击某一按钮,4+48+0,MsgBox函数)4表示显示“是”及“否”按钮48表示显示WarningMessage图标0表示第一个按钮(“是”按钮)是缺省值,例9-3,例9-3使用InputBox函数、MsgBox函数与MsgBox过程的例子。PrivateSubCommand0_Click()DimaAsLonga=InputBox(请输入8个字符的学号:,输入学号,1000,200)MsgBox输入学号是&aa=MsgBox(请用户选择单击某一按钮,4+48+0,MsgBox函数)如图9-24所示Rem4+48+0表达式中的4的含义:4表示显示“是”及“否”按钮Rem4+48+0表达式中的48的含义:48表示显示WarningMessage图标Rem4+48+0表达式中的0的含义:0表示第一个按钮(“是”按钮)是缺省值Ifa=6Then注意,本语句中的a=6也可改用a=vbYesMsgBox用户已单击了MsgBox函数对话框中的“是”按钮,MsgBox过程EndIfIfa=vbNoThen注意,本语句中的a=vbNo也可改用a=7MsgBox用户已单击了MsgBox函数对话框中的“否”按钮,MsgBox过程如图9-25所示EndIfEndSub,例9
展开阅读全文