资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Edit Master title,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,第,8,章,VBA,编程入门,VBA(Visual,Basic for Application),是,Microsoft Office,系列软件的内置编程语言,其语法结构与,Visual Basic,编程语言互相兼容,采用的是面向对象的编程机制和可视化的编程环境。,8-1 VBA,概述,8-1-1 VBA,简介,集合和对象,VBA,中的应用程序是由许多对象组成的,如表、窗体、查询等。对象是帮助构造应用程序的元素,以特定的方式组织这些对象,就形成了应用程序。,数据库窗口把可供选择的对象排列在一起,形成不同的类。,8.1.2,面向对象程序设计的基本概念,对象的属性、事件和方法,属性,属性描述了对象的自身性质。其格式为:,对象名,.,属性,=,属性值,事件,事件是指可以发生在一个对象上且能够被该对象所识别的动作。,如:单击某个命令按钮就产生该按钮的,“,单击,”,事件,当某个对象发生某一事件后,就会驱动系统去执行预先编好的、与这一事件相对应的一段程序。,方法,方法是系统事先设计好的,可以完成一定操作的特殊过程,是附属于对象的行为和动作。在需要使用的时候可以直接调用。,其调用格式为:,对象名,.,方法名,Access,中除数据库的,7,个对象外,还提供一个重要的对象:,DoCmd,对象,除窗体、控件的,SetFocus,(,获得控制焦点,),方法外,用得最多得是,DoCmd,对象,的一些方法。使用这些方法,可以在,VBA,中运行,Access,的操作。,(1),打开当前数据库中的,“,教师信息窗体,”,并显示男教师的记录,DoCmd.OpenForm,formname,view,filtername, ,wherecondition,datamode,windowmode,例:,DoCmd.OpenForm,“,教师信息窗体,”, , ,“,性别,=,男,”,DoCmd.OpenForm,“,学生基本信息,”,acDialog,说明,: view,可以取下列值之一,: (1)acNormal(,默认值,显示窗体视图,),acDesign,(,显示窗体设计视图,),acFormDS,(,显示数据表视图,),DoCmd,对象的常用方法(参照教材,P239,页),(2),打开当前数据库中的报表,DoCmd.OpenForm,reportname,view,filtername,wherecondition,例,:,DoCmd.OpenForm,“,学生成绩,”,acViewNormal,(3),打开查询,DoCmd.OpenQuery,查询名,view,datamode,说明,:,datamode,表示查询的输入模式,仅应用于,”,数据表,”,视图中打开的查询,可取下列值之一,:,(1)acEdit(,默认值,编辑记录模式,),(2)acAdd(,添加记录模式,), (3)acReadOnly(,只读模式,),例,:,DoCmd.OpenQuery,“,学生成绩查询,”,acReadOnly,(4),删除数据库中的对象,DoCmd.DeleteObject,对象类型,对象名,例,:,DoCmd.DeleteObject,acTable,”,课程表,”,(5),关闭数据库对象,DoCmd.Close,对象类型,对象名称,是否保存,例,:,DoCmd.Close,acQuery,“,学生成绩查询,”,acSaveYes,8.1.3 VBA,编程环境,1.,进入,VBE,编程环境,2. VBE,窗口的组成,VBE,窗口由工具栏、工程资源管理器窗口、,属性窗口、代码窗口和立即窗口组成。,3.,在,VBE,环境中编写,VBA,代码,工程窗口,选择对象,属性窗口,选择对象的属性,代码窗口,选择事件,VBE,编程环境,8.2 VBA,编程基础,8.2.1,常量、变量,VBA,使用常量、变量来存储值。用来保存在程序运行期间数据。,常量,在程序运行过程中,其值,不会被改变,的量称为常量。在,VBA,中有三类常量:,(1),直接常量,如:,10,,,20%,,,123.0,,“,VBA,程序设计”等,(2),系统常量,指,VBA,系统预先定义好的,用户可以直接引用的量。,如:,acForm,,,acQuery,,,vbOk,,,vbRed,(3),符号常量,在程序中,某个常量多次被使用,则可以使用一个符号来代替该常量,这样不仅在书写上方便,而且有效地改进了程序的可读性和可维护性。,VBA,中使用关键字,Const,声明符号常量。,其格式如下:,Const,常量名,As,类型,=,常数表达式,如:,Const,PI,=3.1415926,Const,constr,=,“,abcdef,”,Const,ConAge,As Integer=19,Const Pi = 3.1415926,Public Sub area( ),Dim r As Integer,Dim cir, area As Integer,r =,InputBox,(,请输入圆的半径,:),cir = 2 * Pi * r,area = Pi * r * r,MsgBox,圆的周长是,: & cir & ,圆的面积是,: & area,End Sub,变量,在程序中使用变量,就要给变量定义名称及类型,即对变量进行声明,变量命名规则,变量名必须以字母或汉字开头,后可跟字母、汉字、数字或下划线组成(不能含有小数点和空格),长度不超过,255,个字符的字符串;,不能使用,VBA,中的关键字;,VBA,中不区分变量名的大小写;,变量名的最后一个字符可以是,%,、,&,、!、,#,、,$,等表示数据类型的声明符。,A$,8.2.2,数据类型与变量的声明,数据类型,类型声明符,存储空间,取值范围,整型(,Integer,),%,2,-32768,32767,长整型(,Long,),&,4,-2147483648,2147483647,单精度浮点型,(,Single,),!,4,负数:,-3.402823E38,-1.401298E-45,正数:,1.401298E-45,3.402823E38,双精度浮点型,(,Double,),#,8,负数,: -1.79769313486232E308,-4.94065645841247E-324,正数:,4.94065645841247E-324,1.79769313486232E308,货币型,(Currency),8,-922337203685477.5808,922337203685477.5807,日期型,(Date),8,100,年,1,月,1,日,9999,年,12,月,31,日,字符型,(String),$,0,字符,65400,个字符,字节型,(Byte),1,0,255,逻辑型,(Boolean),2,True,或,False,对象型,(Object),4,任何引用的对象,变体型,(Variant),变量声明,1),用,Dim| Static,语句显式声明局部变量,格式,:,Dim,变量名,AS,类型,或,Dim,变量名 类型符,语句中的“,As,类型”子句是可选的。如果使用该子句,就可以定义变量的数据类型。未使用,默认变量的类型为变体型(,Variant,)。,例如:,Dim i As integer, s,表示声明了一个名为,i,的整型变量和一个名为,s,的变体型变量。,或,Dim i %,s,或使用类型符定义,例,: name $=“,李玲,”,mark% = 86,输出测试语句,Debug. Print ,表达式列表,;|,例,:,变量的输出结果,2),静态变量,Static,声明,:,Static,声明的变量,也称为静态变量。静态变量在程序运行过程中一直保留其值,,即,每次调用过程,变量保持原来的值。,隐式声明变量,未进行上述的声明而直接使用变量,称变量的,隐式声明,。采用隐式声明的变量都是变体型(,Variant,)。,注意,:,VBA,中允许不事先声明而直接使用变量,可以通过语句,Option Explicit,,来要求所使用的变量必须事先声明,否则,VBA,会发出警告信息。,下面是一个简单的程序,其使用的变量,a, b, Sum,都没有事先定义。,Private Sub Form_Click(),Sum,= 0,a,= 10,b,= 20,Sum = a + b,Print Sum=; Sum,End Sub,良好的编程习惯应该是“先声明变量,后使用变量”,这样做可以提高程序的效率,同时也使程序易于调试。,VBA,中可以强制显式声明,可以在窗体模块、标准模块和类模块的通用声明段中加入语句:,Option Explicit,声明而未赋值的变量的值为:,数值型变量初始化为,0,;,字符型变量为零长度字符串;,变体型变量初始化为,Empty,。,变量的初始化,8.2.3,运算符和表达式(教材,P251,页),运算符,1.,算术运算符,例如:,123 + 456,结果,123456,123 & 456,结果,123456,使用上 与,+,的区别:,例如:,abcdef, & 12345,结果为,abcdef12345,123 & 456,结果为,123456,abcdef, +12345,结果为,出错,123 + 456,结果为,579,2.,连接运算符:,、,+,(字符串连接),将两个操作数进行大小比较,结果为逻辑值。,注意:,字符串比较,则按字符的,ASCII,码值从左到右一一比较,直到出现不同的字符为止。,3.,关系运算符,4.,逻辑运算符,将操作数进行逻辑运算,结果是逻辑值,5.,表达式,组成,由变量、常量、函数等运算对象加上运算符、圆括号组成的式子。,书写规则,(1),运算符不能相邻。例,a+ -b,是错误的。,(2),乘号不能省略。例,x,乘以,y,应写成:,x*y,。,(3),括号必须成对出现,均使用圆括号。,(4),表达式从左到右在同一基准上书写,无高低。,运算优先级,算术运算符,连接运算符,关系运算符,逻辑运算,例,1:,用人单位招聘秘书,:,年龄小于,40,岁的女性,学历专科或本科,,年龄,40,,性别,=,“,女,”,,,(,学历,=,“,专科,”,,学历,=,“,本科,”,),And,And,Or,考虑:,若分别写成:,年龄,40 And,性别,= ,女, And,(,学历,= ,专科, And,学历,= ,本科,),年龄,40 Or,性别,= ,女, Or (,学历,= ,专科, Or,学历,= ,本科,),例,2,:算术表达式:,正确的,VBA,表达式:,3=x And x =7,错误的,VBA,表达式:,3=x=7,或,3=x Or x=7,8.2.4,常用函数,函数实际上是系统事先定义好的内部程序,用来完成特定的功能。,VBA,提供了大量的内部函数,供用户在编程时使用。,函数的调用形式为:,函数名,(,参数表,),常用内部函数,参照教材,P253,页表,8-6,常用内部函数,输入、输出函数,InputBox,函数,InputBox,(,,对话框标题,,默认内容,x,坐标,y,坐标,),其中:提示信息不能省略;,对话框标题,若省略则显示默认,Access,;,第三个参数:对话框上文本框中的输入信息,如果没有输入,则将默认内容作为输入的内容。,注意:函数的返回值为字符型数据。,例,:Dim,stu,as string,Str,=,InputBox,(,“,请输入学生姓名,”,”,输入函数应用,”,),MsgBox,函数或方法,(,用于显示输出信息,),使用,MsgBox,,可以在对话框中显示文本信息。,格式为:,MsgBox,(提示信息,,按钮数目和类型,,标题,),MsgBox,函数:变量,%=,MsgBox,(,按钮形式,,对话框标题,),MsgBox,方法:,MsgBox,(,按钮形式,,对话框标题,),说明,:(1),不能省略,(2),按钮形式,是一个整数值,用来设置消息框中按钮的形式,显示的图标类型和设置默认的活动按钮,三者以,”,和,”,的形式存在,例,: Dim,stu,As String,str,=,MsgBox,(“,请确认输入的学生名,”, 3+32+0, ”,输入姓名,”,),或,:,str,=,MsgBox,(“,请确认输入的学生名,”,VbYesNoCancel+VbQuestion,+VbDefaultButtonn1, ”,输入姓名,”,),(3),当单击消息框上的按钮时,返回一个整数值,系统判断用户单击了哪个按钮,.,例,8.2.5,以下过程使用,InputBox,函数返回由键盘输入的用户名,并在消息框中显示字符串,Private Sub hello( ),Dim,str,msg,As String,str,=,InputBox,(,请输入你的名字, ,用户信息,),MsgBox,你好,! &,str,vbInformation, ,问候,End Sub,8.3 VBA,常用语句,8.3.1 VBA,语句书写规则,VBA,代码不区分字母的大小写,系统保留字自动转换每个单词的首字母大写;,语句书写自由,(1),一行可书写几句语句,之间用冒号,(:),分隔;,(2),一句语句可分若干行书写,用续行符,(,一个空格加一个,_,组成,),将语句分开,8.3.2 VBA,常用语句,1.,赋值语句:,给变量、常量或对象的属性指定一个值或表达式。,格式:,LET,变量名表达式,作用:将表达式的值赋值给变量名。 一般用于给变,量赋值或对控件设定属性值。,例如:,s=10,Text1.Text,欢迎使用,VBA,注意:,虽然赋值号与关系运算符等于号都用,“,=,”,表示,,VBA,会根据所处的位置自动判断是何种意义的符号,2.,声明语句:命名和定义常量、变量、数组以及过程。,格式,: Dim |Static|,Private|Public,变量名,as,类型,变量名,as,类型,3.,注释语句,在程序中的适当位置加上注释语句有利于程序的维护和阅读。,格式:,Rem,注释内容,或用单引号 注释内容,结构化程序设计由,顺序、分支、循环,这,3,种基本结构所组成。,语句组,2,语句组,1,T,F,语句组,2,条件,语句组,1,8-4 VBA,程序流程控制,F,T,条件,语句组,T,F,条件,语句组,分支结构,单行,If,语句,格式:,If,表达式,Then,语句,1 Else,语句,2,功能:,If,测试指定的条件,如果条件表达式为真,(True),则执行,Then,后面的语句,1,,否则执行语句,2(,若,Else,子句未省略)。,T,F,语句,2,条件,语句,1,T,F,条件,语句,1,1.,单行,If,语句,Private Sub prg3( ),Dim a As Integer,a =,Val(InputBox,(,请输入一个整数,判断奇偶数,),If,a Mod 2=0,Then,MsgBox,偶数,else,MsgBox,奇数,End Sub,例,:,输入三个整数,然后把这,3,个整数按从小到大的顺序重新排序输出,Private sub prg4( ),Dim a, b, c, temp as Long,a=,val(InputBox,(“,请输入第一个数,:”),b=,val(InputBox,(“,请输入第二个数,:”),c=,Val(InputBox,(“,请输入第三个数,:”),If a b Then ,执行,If,语句后, b,中存放,a,b,中最大数,temp = a,a = b,b = temp,End If,If b c Then ,执行,If,语句后, c,中存放,a,b,c,中最大数,temp = b,b = c,c = temp,End If,If a b Then ,执行,If,语句后, b,中存放三个数中次大数,temp = a,a = b,b = temp,End If,MsgBox,三个数从小到大的顺序为,: & a & Space(2) & b & Space(2) & c,End Sub,多行,If,语句,格式:,If,表达式,Then,语句组,1,Else,语句组,2,End If,多行,If,语句的执行过程是:,如果,“,表达式,”,的值为真,则执行语句组,1,;否则执行语句组,2,。当执行完语句组,1,或语句组,2,后,程序流程跳转到语句,End If,的后面。,语句组可以由一条或多条语句组成,语句组不能与,Then,书写在同一行,否则,VBA,认为是一个单行,If,语句,会导致,Else,没有匹配的,If,。,语句,“,End If,”,是多行,If,语句的结束标志。,在多行,If,语句中,即使省略,Else,子句,也要写该结束标志。省略,Else,子句时的多行,If,语句形式为:,If,表达式,Then,语句组,End If,例:计算分段函数,单行,If,语句实现:,If x=0 Then y=,cos(x,),x3+3*x,If x0 Then y=,sin(x)+sqr,(x*x+1),多行,If,语句实现:,If x0 Then,y=,sin(x)+sqr,(x*x+1),Else,y=,cos(x,),x3+3*x,End If,If,语句的嵌套,If,语句的嵌套是指,If,或,Else,后面的语句块中又包含,If,语句。,If Then,If Then,End If,End If,例,:,修改,prg4(),用嵌套的,if,语句实现,:,输入三个整数,然后把这,3,个整数按从小到大的顺序重新排序输出,Private sub prg4(),Dim a, b, c, temp as Long,a=,InputBox,(“,请输入第一个数,:”),b=,InputBox,(“,请输入第二个数,:”),c=,InputBox,(“,请输入第三个数,:”),If ab then,temp=,a;a,=,b;b,=temp,End if,If bc then,temp=,b;b,=,c;c,=temp,if ab then,temp=,a;a,=,b;b,=temp,end if,End if,MsgBox,“,三个数从小到大的顺序为,:”&a &space(2) &b & space(2) &c,End sub,IfThen,ElseIf,语句,(,多分支结构,),If Then,ElseIf, Then,Else,语句块,n+1,End If,说明,:,不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有,Else,子句,则执行该语句块,否则什么也不执行。,ElseIf,不能写成,Else If,。,例,8-6:,根据输入的一个分数,判断对应的成绩等级,分数在,90100,分记为,A, 8089,为,B , 7079,为,C, 6069,为,D,059,为,E,否则显示出错信息,.,Private Sub prg5( ),Dim mark As Integer,mark =,InputBox,(,输入一个,0100,之间的分数, ,判断成绩等级,),If mark = 90 Then,MsgBox,成绩为,A,ElseIf,mark = 80 Then,MsgBox,成绩为,B,ElseIf,mark = 70 Then,MsgBox,成绩为,C,ElseIf,mark = 60 Then,MsgBox,成绩为,D,ElseIf,mark = 0 Then,MsgBox,成绩为,E,Else,MsgBox,数据输入错误,End If,End Sub,注意:,出了循环,循环控制变量值的问题。,例程序段:,For i=2 To 13 Step 3,循环执行次数,debug.Print,i,输出,i,的值分别为,:,2 5 8 11,Next i,debug.Print i,出了循环输出为,: i=14,例,:,改变循环控制变量对循环的影响,Private Sub Command1_Click(),j = 0,For i = 1 To 20 Step 2,i = i + 3,j = j + 1,Print ,第,; j; ,次循环,i=; i,Next i,Print ,退出循环后,i=; i,End Sub,正常情况:,i=1,3,5,7,9,11,13,15,17,19,现在:,i=4,9,14,19,:与,同类型的下面四种形式之一:,表达式,例:,A,一组枚举表达式,(,用逗号分隔,),2,4,6,8,表达式,1 To,表达式,2,60 To 100,Is,关系运算符表达式,Is = 90,MsgBox,成绩为,A,case is = 80,MsgBox,成绩为,B,case is = 70,MsgBox,成绩为,C,case is = 60,MsgBox,成绩为,D,case is = 0,MsgBox,成绩为,E,case Else,MsgBox,数据输入错误,End select,End Sub,例:,变量,strC,中存放了一个字符,判断该字符类型。,用多分支结构实现:,If,Ucase(strC,) =A And,Ucase,(,strC,) =0 And,strC, y,,,x,,,y,),a$=,iif(k,mod 2=0,“,偶数,”,”,奇数,”,),8.4.3,循环结构,1.For,Next,循环结构:,将一段程序重复执行指定的次数,其中使用一个计数变量,统计执行的次数。,格式:,For,循环变量, to Step,步长,语句块,Exit For,语句块,Next ,循环变量,循环变量, =,终值,语句块,Exit For,语句块,循环变量加步长,T,F,循环变量得初值,例,8-8,:计算累乘程序,S=1*2*3*4,X,方法:接收一个累乘的终值,确定一个循环变量,循环变量有,2,个作用(乘数和循环变量),确定一个存储累乘积的变量。使用循环计算,最后输出显示结果。,Private Sub prg7(),Dim s As long, i As Integer,x =,Val(InputBox,(,请输入累乘的终值,),S = 1,For i = 1To x,S = S * i,Next i,MsgBox,输出结果为,: & S,End Sub,注意:,累乘的乘数和乘积变量的初值为,1,。,DoLoop,语句,(,循环结构,),适用于循环次数未知的循环结构,格式,(1)Do While ,Exit Do,Loop,或,: Do until,Exit Do,Loop,格式,(2)Do,Exit Do,loop While ,格式,(2) Do,Exit do,Loop While |Until,DoLoop,循环语句,(,用于控制循环次数未知,),形式,1,:,Do While|Until ,语句块,Exit Do,语句块,Loop,形式,2,:,Do,语句块,Exit Do,语句块,Loop While|Until ,Do While Loop,语句,Private Sub prg8( ),i=1,Do While i=10,s=s+i,i=i+1,Loop,当,i10,s=s+i,i=i+1,Loop,Debug.Print,s,End Sub,当,i10,成立时,结束执行循环体,有可能一次也不执行循环体,修改循环控制变量,改变加数值,Do Loop While,Private Sub prg10( ),i=1,Do,s=,s+i,i=i+1,Loop While i=10,Debug.Print,s,End Sub,3,:,While,Wend,语句,格式如下:,While ,Wend,说明:,该语句的功能与,Do While ,.Loop,实现的循环完全相同。,例,:,计算 ,+3+5+99,Private Sub prg12( ),i=1,S=0,While i=99,s=s+1,i=i+2,Wend,Debug.Print,“1+3+5+99=”;s,End Sub,8-5,数组,数组:,数组不是一种数据类型,而是一组相同类型的变量的集合。可以像使用普通变量一,样使用数组中的每一个元素。,使用数组的好处是用一个,数组名,代表逻辑上相关的一批数据,用,下标,表示该数组中的各个元素,可以提高处理数据的效率,缩短和简化程序。,8.5.1,数组的定义,数组不是一种数据类型,而是一组相同类型的变量的集合,,数组必须先声明后使用。,两类数组: 静态,(,定长,),数组、动态,(,可变长,),数组,1.,静态数组,(1),一维数组,定义一维数组的形式:,Dim,数组名,(,下界,To,上界,) As,类型,声明了数组的名、维数、大小、类型,例,: Dim mark(1 to 100) as integer,存储单元如下,:,mark(1), mark(2),mark(3),.,mark(99),mark(100),例,: Dim b(5) as integer,存储单元如下,:,b(0), b(1), b(2), b(3),b(4),b(5),b(6),说明:,数组名的命名规则与变量的命名相同。,数组的元素个数:上界,-,下界,+1,。,缺省,为,0,,若希望下标从,1,开始,可在模块的通用部分使用,Option Base,语句将设为,1,。其使用格式是:,Option Base 0|1,后面的参数只能取,0,或,1,例如:,Option Base 1 ,将数组声明中缺省,下标设为,1,和,不能使用变量,,必须是常量,,常量可以是直接常量、符号常量,一般是整型常量。,如果省略,As,子句,则数组的类型为变体类型。,2.,二维数组,定义二维数组的形式:,Dim,数组名,(,下界,1,To,上界,1,,,下界,2,To,上界,2,) As,类型,例如:,Dim a(2,3) As Single,二维数组在内存的存放顺序是,“先行后列”,。,数组,a,的各元素在内存中的存放顺序是:,a(0,0)a(0,1)a(0,2)a(0,3),a(1,0)a(1,1)a(1,2) a(1,3),a(2,0)a (2,1)a(2,2)a(2,3),例:,Dim,lArray,( 0 To 3,,,0 To 4) As Long,共有,4,5,个元素等价于,: Dim lArray(3,,,4) As Long,3.,动态数组,动态数组指在声明数组时未给出数组的大小,(,省略括号中的下标,),,当要使用它时,随时用,ReDim,语句,重新指出数组大小。,形式如下:,ReDim,数组名,(,下标,,下标,2) As,类型,例:,Private,Sub S1( ),Dim x( ) As Single,n =,Inputbox,(“,输入,n”,),ReDim,x(n,),End Sub,说明:,Dim,、,Static,、,Public,声明语句是说明性语句,可出现在过程内或通用声明段;,ReDim,语句是执行语句,只能出现在过程内;,在过程中可多次使用,ReDim,来改变数组元素的个数,ReDim,中的下标可以是常量,也可以是有了确定值的变量。如:,n=,InputBox,(,“,输入,n,的值,”,),ReDim,Arr(n,),静态数组在程序编译时分配存储单元,动态数组在运行时分配存储单元。,8.5.2,数组的基本操作,1.,数组元素的引用,一维数组元素的引用,使用形式:,数组名,(,下标,),其中:,下标可以是常量、整型变量或表达式。,例如:,设有下面的数组,A,(10),、,B(10) As Integer,则下面的语句都是正确的。,A(1)=B(2)+B(1)+5 ,取数组元素运算,A(i,)=,B(i,) ,下标使用变量,A(i+2) = B(i+1) ,下标使用表达式,注意:引用数组时不能下标越界,引用二维数组的形式:,数组名,(,下标,1,,下标,2,),下标,1,指定元素在二维表中所在的行,下标,2,指定元素在二维表中所在的列。,例如:,a(1,2)=10,a(i+2,j),a(2,3)*2,在程序中常常通过二重循环来操作使用,二维数组元素。,2.,数组元素的输入,通过循环给数组元素的初值,For i = 1 To 10 A,数组的每个元素值为,1,A(i,)=1,Next i,数组的输入,(,通过,InputBox,( ),函数,),For i = 1 To 4,For j = 1 To 5,sc(i, j) =,InputBox,(,输入,sc( &i & , & j & ),的值,),Next j,Next i,8.6,模块,模块是,Access,数据库中的一个重要对象,是由,VBA,语言编写的程序的集合。,由于模块是由编程语言创建的,所以它的功能比,Access,数据库中其他对象的功能要强大得多。使用模块可以建立用户自己的函数、完成复杂的计算、替代宏所不能完成的功能等。,8.6.1,模块的基本概念,模块是由过程组成的,过程是将,VBA,声明、语,句集合在一起,作为一个命名单位的程序段;,模块是过程的容器,所有,VBA,代码都以模块的,方式保存在数据库中;,模块中的每一个过程都可以由一个函数过程或,一个子程序过程组成。,在,Access,中,模块有两种基本类型:类模块和标准模块。,类模块:,Access,中的类模块可以独立存在,也可以与窗体和报表同时出现。窗体和报表模块是类模块的典型例子,该类模块与某一窗体或报表相关联。窗体和报表模块通常都含有事件过程,该过程用于响应窗体或报表中的事件,可以使用事件过程来控制窗体或报表的行为,以及它们对用户操作的响应。,标准模块包含的是通用过程,这些过程不与任何,Access,中的对象相关联,每一个过程都可以由一个个子程序过程或函数过程组成。,模块的组成,模块由一个声明区域和一个或多个过程组成,创建,VBA,模块与编程环境,Access,提供了一个编程界面,-VBE,进入,VBE,编程环境,1.,创建类模块,2.,创建标准模块,8.6.2,创建新模块,创建新模块的具体操作步骤如下:,(1),打开要建立模块的数据库,在,“,模块,”,选项卡中单击,“,新建,”,按钮,出现模块编辑窗口。,(2),在模块编辑窗口中编辑模块代码。,2.,创建新过程,在,VBA,中是用过程来实现程序模块的。将一个程序分成若干个相对独立的过程,每个过程可实现单一的功能。,过程有,:,事件过程和通用过程,S,ub,过程,(,子程序,),和,Function,过程,(,函数,),。,事件过程的格式,Private|PublicStaticSub,对象名,_,事件名,(,形参列表,),语句组,End Sub,事件有,:,鼠标常用事件,:,(1) Click (2),DbClick,(3),MouseMove,2.,窗体常用事件,:,(1) Open (2) Active (3) Close,关键字,Private,和,Public,中最多只能选其一;,使用,Private,,,表示该过程是私有的局部过程,只能被该过程所在的窗体或标准模块中的其他过程所调用;,使用,Public,,,表示该过程是公共的全局过程,可被应用程序中的任何窗体或任何标准模块中的过程所调用;,关键字,Static,的作用是声明该过程中定义的变量均为静态局部变量。,Private|PublicStatic,Sub,子程序名,(,形参列表,),语句组,1,Exit Sub,语句组,2,End Sub,(1)SUB,(子程序)过程的定义格式为:,子程序体,强制退出子程序过程,例,8-21 .sub,过程的定义与调用,Private Sub pro1(),Dim a As Integer, b As,Interger,a=,InputBox,(“,请输入第一个数,:”): b=,InputBox,(“,请输入第二个数,:”),Call,swap(a,b,),Debug.Print,a;b,Private Sub,swap(x,As Integer, y As Integer),Dim t As Integer,if xy then,t=x: x=y: y=t,End If,End Sub,Private Sub pro1( ),Call Swap(a,b),Swap a,b,End Sub,Private Sub Swap(x%,y%),Dim temp%,Temp=X,X=Y,Y=Temp,End Sub,过程调用的执行示意图,第一种形式:,Call,子程序名,(,实参列表,),如,: call,swap(a,b,),调用子程序过程的一般形式,若带有实参,则实参必须用括号括起,实参可直接加在子程序名后面,第二种形式:子程序名,实参列表,swap,a,b,例,8.22,按地址传递参数,Private Sub pro2(),Dim a As Integer, b As Integer, c as Integer,a=1:b=3:c=5,Debug.Print,a,b,c,call pro3(a,b,c),Debug.Print,a,b,c,Private Sub pro3(Byval x As Integer, y As Integer, z as Integer),x=2: y=4: z=6,End Sub,值传递,:,调用前,调用 在,pro3(),过程中 调用结束返回后,a=1 a=1,x=1 a=1,x=2 a=1,通过地址传输数据的过程,:,调用前,调用 在,pro3(),过程中 调用结束返回后,b=3 b= b= b=,y y,c=5 c= c= c=,z,z z,3,5,4,6,4,6,(2) Function,过程(函数过程),在解决实际问题时,如果没有现成的函数的函数可用时,我们可以自定义函数过程。函数过程同,Sub,过程一样也是由一段独立的代码组成,可以被某个过程多次调用;,Private|PublicStatic,Function,函数名,(,形参列表,)As,类型,语句组,1,函数名,=,函数返回结果,Exit Function,End Function,定义函数过程的一般格式,函数体,在函数体内至少,对函数名赋值一次,例,(8-24):,运行窗体,根据在文本框中输入的数,判断并显示该数是奇数还是偶数,Private Sub Command3_Click(),Dim n As Long, m As String,n = Val(Me!Text1),m =,IIf(f(n,), ,偶数, ,奇数,),MsgBox,n & ,是, & m,End Sub,Private Function,f(x,As Long) As Boolean,If x Mod 2 = 0 Then,f = True,Else,f = False,End If,End,Function,(1),函数过程名有值,有类型,在函数体内至少赋值一次;子过程名无值,无类型,在子过程体内不能对子过程名赋值;,(2),调用时,子过程调用是一句独立的语句。,函数过程不能作为单独的语句加以调用,必须参与表达式运算。,(3),一般当过程有一个函数值,使用函数过程较直观;反之若过程无返回值,或有多个返回值,使用子过程较直观。,子过程与函数过程区别,8.6.3,变量的作用域,一个,VBA,应用程序可以包含若干个过程,这些过程可以出现在窗体或标准模块中,而且在过程中必不可少的要使用变量。变量在程序中所处的位置不同,其使用的范围也不同,我们将变量的有效范围称为变量的作用域。,变量按其作用域分为局部变量、模块级变量和全局变量。,局部变量:,在过程内用声明的变量,只能在本过程中使用。,窗体,/,模块级变量:,在,“,通用声明,”,段中用,Dim,语句或用,Private,语句 声明的变量,可被本窗体,/,模块的任何过程访问。,全局变量:,在,“,通用声明,”,段中用,Public,语句声明的变量,可被本应用程序的任何过程或函数访问,。,例如:在一个标准模块中不同级别的变量声明:,Public Pa As integer,全局变量,Private Mb As string,窗体,/,模块级变量,Sub F1( ),Dim,Fa,As integer,局部变量,End Sub,Sub F2( ),Dim,Fb,As Single,局部变量,End Sub,8.6.4,程序的调试,程序代码颜色说明,从代码窗口中可以看到,程序代码中每一行的每一个单词都具有自己的颜色,这样用户可以从复杂的代码中轻松地辨别出程序的各个部分。代码行中各种颜色所代表的含义如下:,绿色,:表示注释行,它不会被执行,只用于对代码进行说明;,蓝色,:表示,VBA,预定义的关键字名;,黑色:表示存储数值的内容,如赋值语句,变量名;,红色,:表示有语法错误的语句。,
展开阅读全文