1、第第7 7章章 学习使用学习使用VBA VBA“超级货架超级货架”什么是什么是VBAVBA “内部结构内部结构”VBAVBA程序的基本语法与书写格式程序的基本语法与书写格式 “增加内涵增加内涵”功能模块的创建功能模块的创建 “兢兢业业兢兢业业”VBAVBA程序的调试程序的调试 典型实例:给典型实例:给“考勤管理系统考勤管理系统”添加功能代码添加功能代码 7.1 “超级货架”什么是VBA VBA(Visual Basic for Application)是Microsoft Office系列的内置编程语言,其功能十分强大。在Access 2007中,VBA的功能是通过模块来实现的。事实上,在Ac
2、cess 2007中,程序设计的核心工作就是编写模块和事件过程。如下图所示为Access 2007中VBA程序的编写界面。打开此窗口的方法为在“创建”选项卡中单击“宏”下拉按钮,在打开的列表中选择“模块”项功能模块的事件过程(不同的功能模块,具有不同的事件过程,实际上这里就是所谓的程序源代码)功能模块属性窗格7.2 “内部结构”VBA程序的基本语法与书写格式7.2.1 变量和常量 在任何编程语言中,都要用到变量和常量,它们都是用来存储数据的。变量存储的是经常需要变动的数据,常量储存的是不用改变的数据(或对象)。1变量 变量在引用之前必须被声明,声明一个变量就是事先将变量的有关信息告诉程序,声明
3、变量要使用Dim语句,其语法格式为:Dim Str1 As String 声明一个名为Str1的字符串变量Str1=Hello 给变量赋值Str1=Goodbye 改变变量的值Dim 变量名As 类型以上语句中的“As 类型”子句是可选的。如果选择了该子句,就可以定义变量的数据类型或对象类型。例如以下语句:2常量 在VBA中,声明常量的语法格式为:Const 常量名 As 类型表达式在这个表达式中,“常量名”的命名规则同变量一样,语句中的“表达式”是由数值常量和字符串常量以及运算符组成的。例如:Public Const PI=3.1415926声明一个在整个程序中都能使用的常量PI 7.2.2
4、 流程控制语句 程序员最基本和最重要的工作就是告诉计算机何时要做出什么样的动作。就像一个交通警察指挥大量的车辆和行人何时该走、何时该停、该向哪边走一样。本节主要介绍If语句、Select Case语句、Do.Loop语句、For.Next语句、GoTo 语句以及With语句等流程控制语句,下面我们分开详细介绍。1If 语句 If语句是我们最常用的一种分支语句。它符合人们通常的语言习惯和思维习惯。比如if(如果)绿灯亮是真,then(那么)车就可以通行,else(否则)车辆要等待行人通过。If语句有三种语法形式。1)最简单的形式if then 2)带有else的形式if thenelseend
5、ifif thenelseif thenelse end if3)带有多重条件的形式2Select Case语句 根据表达式的值,来决定执行多组语句中的哪一组,这就是Select Case语句。它的语法如下:Select Case 表达式 Case 表达式列表1 语句陈述1 Case 表达式列表2 语句陈述2.Case 表达式列表n 语句陈述nEnd Select下面的实例可以使我们进一步了解Select Case语句的用法。Dim Score As Integer Select Case Score Case Is=90 MsgBox You got an A on the test.Cas
6、e 80 To 89 MsgBox You got a B on the test.Case 60 To 79 MsgBox You got a C on the test.Case Else MsgBox You failed.End Select在此例子中,Case语句按照先后顺序进行比较,首先执行与第一个Case条件相匹配的代码,若不存在匹配的条件,则执行Case Else语句,然后程序将执行End Select语句后面的代码。3DoLoop语句 用Do.Loop语句可以定义要多次执行的语句块。我们也可以定义一个条件,当这个条件为假时,就结束这个循环。Do.Loop语句有以下两种形式。第
7、1种:DoWhile|UntilExit Do Loop第2种:Do Exit Do LoopWhile|Until 上面格式中,是用来检查真(非零)或假(零或Null)的一个比较谓词或表达式。While子句和Until子句的作用正好相反。如果指定了一个While子句,则当是真,就继续执行。如果指定了Until子句,则当为真时,循环执行结束。4ForNext语句 按照指定次数来重复执行同一组语句,这就是For.Next 语句。在事先不知道循环需要执行多少次时,应该使用Do循环。而事先知道要执行多少次时,最好使用For.Next语句。ForNext语句的语法格式为:For 循环控制变量=初值 T
8、o 终值 Step 步长 循环语句Next其中,“Step 步长”可以省略,省略时步长为1。循环控制变量可以为整型、长整型、实型以及字符串;但最常用的还是整型和长整型。在循环中可以通过Exit For跳出循环体,下面的例子说明了ForNext语句的使用方法:For i=1 To 100 Step 2 Score=Score+10Next上边语句的意义是:将初值赋予循环控制变量,即循环控制变量的值从1开始,在执行完一次循环体后,将循环控制变量加上步长2,当i的值大于100时,跳出循环。是一个逻辑表达式,if语句通过检查的真或假来进行语句判断。比如,若为True(真),则执行紧接在关键字Then后
9、面的一条或多条语句。若为False(假),则无论接下来是什么语句,程序都检查下一个Else或执行Else关键字后面的语句。6With语句 在引用对象的时候,我们通常会感到冗长的对象限定,繁琐而又累赘。如果你喜欢简单,那么用With可以简化代码中对复杂对象的引用。可以用With语句建立一个“基本”对象,然后用一个速记符号来引用这个对象上的对象、集合、属性或方法。With End With例如,下面的代码来自一个Access窗体,它设置了一个组件框控件的“可见性”属性,并调用了该组件框的两个方法。With Me!cboAuthorSearchList.Visible=True设置为可见.Dropd
10、own点击下拉菜单End With7.2.3 过程与函数 简单地讲,过程和函数就是指能够执行特定功能的语句块,都是为编写程序而服务的。但是它们之间是有区别的。1过程 过程是VBA代码的一个单元,它包括一系列用于执行某个任务或是进行某种计算的语句。过程只执行一个或多个操作,没有返回值。比如下面就是一个过程的例子。Sub cmdSmallFont_Click()With Selection.Font .Name=Arial .Size=16 End WithEnd Sub上面列出的代码就是一个简单的过程。实际上在With下的所有操作,默认访问的都是cmdSmallFont对象通常用Sub声明一个新
11、的过程,其语法格式如下:Private|Public|FriendStaticSub name(arglist)statementsEnd Sub各项的意义请参考书中表格7-1。2函数 函数其实也是过程,不过它是一种特殊的、能够返回具体值的过程,返回的值通常是计算的结果或测试的结果,能够在表达式中使用。用Function语句可以声明一个新函数。其语法形式如下:Public|Private|FriendStatic Function name(arglist)As type statements name=expression Exit FunctionEnd Function各项的意义请参考书
12、中表格7-27.2.4 注释语句 注释语句就是穿插在程序代码中并对代码的意义和功能进行说明的语句,它不参与程序的运行。在VBA程序中,添加注释可以通过两种方式来实现:一是使用Rem语句,二是使用“”符号。Dim Mystr1,Mystr2Mystr1=”Welcome”:Rem为Mystr1赋值。Mystr2=”Goodbye”为Mystr2赋值。这也是一条注释,无需使用冒号。“Rem注释”在语句之后要用冒号隔开。7.2.5 语句的连写和换行 Dim MyNO As String MyNo=“2002091229”可以写成下面的一行:Dim MyNo As String:MyNo=“20020
13、91229”一般而言,程序语句都是一句一行,但是有些时候可能需要在一行中连写几句代码。这时需要用冒号“:”来分开这些不同用途的语句。例如:另外,还有一种情况在编程中经常遇到,那就是程序代码过长,虽然一行能够写完。但是书写起来不方便,看上去也不美观,希望将这句代码分开写成几行。这时要用到空格加下划线“_”,比如下面的例子。Public Const Date=#1/1/2000#,Author=Nancy,_Tel=62774059空格加下划线(“_”)被称为续行号,它可以把语句分成两行或多行,用于解决程序代码中语句过长的问题。7.3 “增加内涵”功能模块的创建 7.3.1 模块简介 模块作为Ac
14、cess数据库中的一个重要对象,它是将VBA声明、表达式和程序作为一个单元进行保存的集合。模块由一个通用声明部分以及一个或多个子程序或函数组成的。模块的通用声明部分用来对要在模块中或模块之间使用的变量、常量、自定义数据类型以及模块级的Option语句进行声明。其它部分为子程序或函数部分,具体如下图所示。这是多功能模块(写在窗体的模块就是窗体操作模块,写在报表里边的就是报表模块)模块的声明部分 模块里边的函数和代码 7.3.2 创建具有密码验证的主窗体模块 1打开“计件工资管理系统”数据库,打开新建“窗体”的设计视图 单击组合框按钮,将鼠标光标移动到要添加组合框的位置单击鼠标左键,添加一个组合框
15、23将组合框的标签修改为“请选择要打开的表格”。然后双击组合框,打开组合框的“属性”窗口单击“数据”标签,在“行来源类型”下拉列表中选择“值列表”项在“行来源”中输入几个已经创建好的窗体的名称:“人事表”;“加班表”;“请假表”456在组合框的下面添加两个命令按钮,并更名为“打开”和“关闭”选中“打开”按钮,然后单击代码按钮,打开该窗体的代码编辑窗口 79在事件列表中选择“Click”项 在对象选择下拉列表中选择“Command2”项 为“打开”按钮的单击事件输入代码 81012在事件列表中选择“Click”项 在对象选择下拉列表中选择“Command3”项 为“关闭”按钮的单击事件输入代码
16、111315在对象列表中选择“Form”,在事件过程列表中选择“Load”事件 为Load事件输入代码 1416双击打开“密码窗体”,将首先弹出要求输入密码的窗口,输入密码,单击“确定”按钮单击组合框的下拉按钮,从下拉列表中选择一个窗体名称(这里选择“人事表”)后,单击“打开”按钮即可打开相应的表格了 177.3.3 创建查询窗体模块 1打开“计件工资管理系统”数据库,打开新建窗体的“设计视图”2创建一个命令按钮,将其标题更改为“查询”添加一个文本框,将其标签的标题更改为“请输入员工编号:”重复相同的操作创建另外一个标签为“返回的员工姓名:”的文本框 34创建一个函数Search,编写如下代码
17、 在对象列表中选择“Command4”,在事件过程列表中选择“Click”事件,为“查询”按钮(Command4)的单击(Click)事件编写“Text2.Value=Search(Text0.Value,”PrimaryKey“,”人事表“)”代码56通过以上步骤我们就完成了函数的创建和调用,双击打开“查询员工姓名”窗体,执行的效果如图所示 7.3.4 边学边练:使用VBA增加“计件工资管理系统”的功能我们这里主要需要添加在“系统设置”窗口实现“人事调整”功能的代码。“工资录入和查询”、“加班录入和查询”和“请假录入和查询”在这三个窗体中都需要添加代码来实现各自的功能。需要在“本月工资统计”
18、和“上月工资统计”报表中添加代码实现动态打印报表。1、给“系统设置”窗体添加代码 这是“系统设置”窗体的操作界面 我们首先需要实现的功能是:在下拉标签中进行选择时,员工编号列表框和右侧的“员工列表”同时跟着改变 2添加当单击“打印个人档案”按钮时应执行的操作添加当选择下拉列表时,应执行的操作 添加当选择列表项时,应执行的操作 135添加错误提示窗口设置代码 添加用于自动添加班组操作的代码 添加“同步更新操作”函数,完成代码的添加 46调用更新过程72、给“录入和查询”窗体添加代码 在此窗体我们主要应实现,当输入或选择了员工编号后,在姓名栏中自动显示出此人的姓名,然后当选择用户或添加记录时,应在
19、下边员工列表中显示其当天的工作记录,以及合计的工资数 1另外需要定义两个函数“chaxun”和“chaxun2”(至于代码请到书中查询),并在此处进行调用,然后保存就可以了对“件数”文本框的限制操作,即让其只能输入数字 23、给“工资统计和打印”报表添加代码 打开“本月工资统计”的设计视图,添加三个标签控件,分别位于“报表页眉”、“页面页眉”和“主体”节,其中位于“报表页面”的节我们将会在代码中动态更新其内容,所也我们这里将其命名为“月”在“主体”节中,添加一个文本框“工资合计”,此文本框用于显示最后的工资统计记录 21这是窗体的最终执行效果,关于报表代码,由于代码较多,我们这里不再列举,请大
20、家到正文中查询和分析7.4 “兢兢业业”VBA程序的调试 1、调试工具栏及功能 简单地讲,“调试”就是查找错误并对错误进行排除的过程。以下我们从调试工具栏及功能、设置断点、跟踪和设置监视点等方面对VBA程序调试进行介绍。当您对程序进行调试时,可以使用VBA的“调试”工具栏,它提供了一些非常实用的工具。打开“调试”工具栏的方法为:选择【视图】【工具栏】【调试】命令,即可调出“调试”工具栏工具栏中各按钮的功能可在正文中查询2、设置断点直接在要设置断点的位置单击左边的断点设定区,如图所示。当您再次单击该处时,断点的设定将被取消也可以将插入点移到要设置断点的位置,然后打开“调试”菜单,选择“切换断点”
21、命令,或者单击“调试”工具栏中的按钮来设置断点 运行到此处,程序暂停 将鼠标光标移动到变量处即可查看变量的值3、跟踪 1在中断点程序停止执行 单击逐语句按钮执行下一句 24、设置监视点 1打开一个模块编辑窗口,选择主菜单的【调试】【添加监视】命令,弹出“添加监视”对话框 3在“监视类型”列表中选择“当监视值改变时中断”。单击“确定”按钮,完成监视的添加 在“表达式”文本框中输入要监视的表达式或变量(必须是代码中存在的变量或表达式,这里输入“panduan1”,下边可选择“变量”所在的“过程”和“模块”,通常保持系统默认即可)2监视点设定好以后,运行程序,在“监视窗口”中您可以查看程序运行的结果
22、 程序运行过程中,当监视的值发生变化时,程序中断 7.5 典型实例:给“考勤管理系统”添加功能代码 1打开“信息录入”窗体的设计界面后,单击数据库工具栏的代码按钮打开VB程序编写窗口 在“代码编辑”窗口添加代码23选择“通用”下拉列表中的“添加记录”项,在其click事件中添加代码(代码请到书中查询),此段代码实现添加记录的操作。4在“代码编辑”窗口的“通用”下拉列表中选择“出勤统计”项,在其click事件中添加代码(代码请到书中查询),此段代码对出勤信息进行统计。5下面为“添加记录”和“退出窗体”命令按钮添加代码。在“代码编辑”窗口的“通用”下拉列表中选择“添加记录”项,在其click事件中添加书中代码。