VBA编程基础讲义.docx
《VBA编程基础讲义.docx》由会员分享,可在线阅读,更多相关《VBA编程基础讲义.docx(31页珍藏版)》请在冰豆网上搜索。
VBA编程基础讲义
VBA编程基础
8.1模块的基本概念
模块是access系统中的一个重要对象,它以VBA(VisualBasicforApplications)为基础编写,以函数过程(Function)和子过程
(Sub)为单元的集合方式存储。
在access中,模块分为类模块和标准模块两种类型。
8.1.1类模块
窗体和报表模块都是类模块,而且它们各自与某一窗体或报表相关联。
窗体和报表模块通常都含有事件过程,该过程用于响应窗体或报表中的事件。
可以使用事件过程来控制窗体或报表的行为,以及它们对用户操作的响应,例如:
用鼠标单击某个命令按钮。
为窗体或报表创建第一个事件过程时,Microsoft Access将自动创建与之关联的窗体或报表模块。
如果要查看窗体或报表的模块,请单击窗体或报表“设计”视图中工具栏上的“代码”命令。
窗体或报表模块中的过程可以调用已经添加到标准模块中的过程。
窗体和报表模块具有局部特性,其作用范围局限在所属窗体和报表内部,而生命周期则是伴随着窗体和报表的打开而开始,关闭而结束。
8.1.2标准模块
标准模块一般用于存放供其他access数据库对象使用的公共过程。
在系统中可以通过创建新的模块对象而进入其代码设计环境。
标准模块通常安排一些公共变量或过程供类模块里的过程调用。
在各个标准模块内部也可以定义私有变量和私有过程仅供本模块内部使用。
标准模块中的公共变量和公共过程具有局部特性,其作用范围在整个应用程序里,而生命周期则是伴随着应用程序的运行而开始,关闭而结束。
8.1.3将宏转换为模块
在Access系统中,根据需要可以将设计好的宏对象转换为模块代码的形式。
8.2创建模块
过程是模块的组成单元,由VBA代码编写而成。
过程分两种类型:
Sub子过程和Function函数过程。
8.2.1在模块中加入过程
模块是装着VBA代码的容器。
在窗体和报表的设计视图中,单击工具栏“代码”按钮或者创建窗体和报表的事件过程可以加入类模块的设计和编辑窗口。
单击数据库窗体中的“模块”对象标签,然后单击“新建”按钮即可进入标准模块的设计和编辑窗口。
一个模块包含一个声明区域,且可以包含一个或多个子过程或函数过程。
1、Sub过程(子过程)
执行一系列操作,无返回值。
定义格式如下:
Sub过程名
[程序代码]
EndSub
可以引用过程名来调用该子过程。
此外,VBA提供了一个关键字Call,可显示调用一个子过程。
2、Function过程(函数过程)
执行一系列操作,有返回值。
定义格式如下:
Function过程名As(返回值)类型
[程序代码]
EndFunction
函数过程不能使用Call来调用执行,需要直接引用函数过程名,并直接在函数过程名后的括号所辨别。
8.2.2在模块中执行宏
在模块的过程定义中,使用DoCmd对象的RunMacro方法,可以执行设计好的宏。
其调用格式为:
DoCmd.RunMacro MacroName [,RepeatCount][,RepeatExpression]
其中MacroName表示当前数据库中宏的有效名称;RepeatCount为可选项,用于计算宏运行次数的整数值;RepeatExpression也是可选项,为数组表达式,在每一次运行宏时进行计算,结果为False(0)时,停止运行宏。
8.3VBA程序设计基础
VBA是MicrosoftOffice内置的编程语言,是根据VisualBasic简化的宏语言,其基本语法、词法与VisualBasic基本相同,因而具有简单、易学的特点。
与VisualBasic不同的是,VBA不是一个独立的开发工具,一般被嵌入到像Word、Excel、Access这样的软件中,与其配套使用,从而实现在其中的程序开发功能。
8.3.1面向对象程序设计的概念
1.对象和集合
对象:
在采用面向对象程序设计方法的程序中,程序处理的目标被抽象成了一个个对象,每个对象具有各自的属性、方法和事件。
类:
是对一类相似对象的定义和描述。
因此类可看做是对象的模板,每个对象由类来定义。
集合:
是由一组对象组成的集合,这些对象的类型可以相同,也可以不同。
Access有几十个对象,其中包括对象和对象集合。
所有对象和对象集合按层次结构组织,处在最上层的是Application对象,即Access应用程序,其他对象或对象集合都处在它的下层或更下层。
2.属性和方法
对象的特征用属性和方法描述。
属性:
用来表示对象的状态,如窗体的Name(名称)属性、Caption(标题)属性等。
方法:
用来描述对象的行为,如窗体有Refresh方法,Debug对象有Print方法等。
引用对象的属性或方法时应该在属性名或方法名前加对象名,并用对象引用符“.”连接,即对象.属性或对象.行为
例如DoCmd.OpenReport“教师信息“
是指利用DoCmd对象的OpenReport方法打开报表“教师信息”
3.事件和事件过程
事件:
是对象可以识别的动作,通常由系统预先定义
事件过程:
对象在识别了所发生的事件后执行的程序
例如,下面的事件过程描述了单击按钮之后所发生的一系列动作。
PrivateSubCommand1_Click()
Me!
Label1.Caption=“Access程序设计"
Me!
Text1=""
EndSub
8.3.2VBA编程环境
一、VisualBasic编辑器
VisualBasic编辑器VBE(VisualBasicEditor)是编辑VBA代码时使用的界面。
VBE窗口主要由标准工具栏、工具窗口、属性窗口、代码窗口和立即窗口等组成。
二、进入VBA编程环境
Access模块分成类模块和标准模块两种。
对于类模块,可以直接定位到窗体或报表,然后单击工具栏上的“代码”按钮进入;或定位到窗体、报表和控件上通过指定对象事件处理过程进入。
其方法有两种:
(1)右键单击控件对象,单击快捷菜单上的“事件生成器命令”,打开“事件生成器”对话框,选择其中的“代码生成器”,单击“确定”按钮即可进入;
(2)单击属性窗口的“事件”选项卡,选中某个事件直接单击属性右侧的“…”按钮,打开“事件生成器”对话框,选择其中的“代码生成器”,单击“确定”按钮即可进入。
对于标准模块,有3种方法进入:
(1)对于已存在的标准模块,只需从数据库窗体对象列表上选择“模块”,双击要查看的模块对象即可进入;
(2)要创建新的标准模块,需要从数据库窗体对象列表上选择“模块”,单击工具栏上的“新建”按钮即可进入;
(3)在数据库对象窗体中,选择“工具”菜单里“宏”子菜单的“Visual Basic编辑器”选项即可进入。
三、VBE环境中编写VBA代码
VBA代码是由语句组成的,一条语句就是一行代码。
例如
intCount=3’将3赋值给变量intCount
Debug.PrintintCount’在立即窗口打印变量intCount的值3
Access的VBE编辑环境提供了完整的开发和调试工具。
其中的代码窗口顶部包含两个组合框,左侧为对象列表,右侧为过程列表。
操作时,从左侧组合框选定一个对象后,右侧过程组合框中会列出该对象的所有事件过程,再从该对象过程列表选项中选择某个事件名称,系统会自动生成相应的事件过程模块,用户添加代码即可。
双击工程窗口中的任何类或对象都可以在代码窗口中打开相应代码进行编辑处理。
四、程序语句书写原则
8.3.3数据类型和数据库对象
一、标准数据类型
(1)布尔型数据
布尔型数据只有两个值True或False。
布尔型数据转换为其他类型数据时,Ture转换为-1,False转换为0;其他类型数据转换为布尔型数据时,0转换为False,其他类型转换为Ture。
(2)日期型数据
“日期/时间”类型数据必须前后用“#”号封住。
如#2007-1-1#、#2002-5-414:
30:
00PM#。
(3)变体类型数据
变体类型数据是特殊的数据类型。
VBA中规定,如果没有显示声明或使用符号来定义变量的数据类型,则默认为变体类型。
二、用户定义的数据类型
应用过程中可以建立包含一个或多个VBA标准数据类型的数据类型,这就是用户定义数据类型。
它不仅包含VBA的标准数据类型,还包含其他用户定义的数据类型。
(1)用户定义数据类型的定义:
用户定义数据类型可以在Type ... End Type关键字间定义,定义格式如下:
Type[数据类型名]
<域名>As<数据类型>
<域名>As<数据类型>
…
End Type
如:
TypeStudent
IdAsInteger'学号
NameAsString*20'姓名
SexAsString*1'性别
EndType
(2)自定义类型变量的声明
声明形式:
Dim变量名As自定义数据类型名
例:
DimStu1AsStudent
(3)自定义类型变量的使用
自定义类型变量的元素引用形式:
变量名.元素名
例:
给Stu1变量中的姓名、性别赋值:
Stu1.Name=“张三”
Stu1.Sex=“男”
三、数据库对象
8.3.4变量与常量
变量是程序运行过程中值会发生变化的数据。
如同一间旅馆客房,昨天可住旅客A,今天住旅客B,明天又有可能被闲置。
变量的命名规则如下:
(1)以字母或汉字开头,后可跟字母、数字或下划线。
(2)变量名最长为255个字符。
(3)不区分变量名的大小写,不能使用关键字。
(4)字符之间必须并排书写,不能出现上下标。
以下是合法的变量名:
a,x,x3,BOOK_1,sum5
以下是非法的变量名:
3ss*T-3xbowy-1if
常量是在程序中可以直接引用的实际值,其值在程序运行过程中不变。
在VBA中,常量可以分为3种:
直接常量、符号常量和系统常量
一、变量的声明
VBA变量声明有两种方法。
1、显式声明
VBA中定义变量的格式为:
Dim变量名[AS类型]
格式中Dim是一个VBA命令,此处用于定义变量;As是关键字,此处用于指定变量的数据类型。
例如:
DimbAgeasInteger’bAge为整型变量
2、隐含声明
VBA允许用户在编写应用程序时,不声明变量而直接使用,这就是隐式声明。
所有隐式声明的变量都是Variant数据类型。
例如:
Dimm,n,’m,n为变体Variant变量NewVar=528’NewVar为Variant类型变量,其值为258。
二、强制声明
在默认情况下,VBA允许在代码中使用未声明的变量,如果在模块设计窗口的顶部“通用—声明”区域中,加入语句:
OptionExplicit
强制要求所有变量必须定义才能使用。
这种方法只能为当前模块设置了自动变量声明功能,如果想为所有模块都启用此功能,可以单击菜单命令“工具”下“选项”对话框中,选中“要求变量声明”选项即可。
三.变量的作用域
(1)局部范围(Local)
在Sub…EndSub或Function…EndFunction范围内部使用Dim、Static…As关键字声明的变量就是局部范围的,出了Sub…EndSub或Function…EndFunction范围内就无效了,只在过程内部可见。
(2)模块范围(Module)
变量定义在模块的所有过程之外的起始位置,运行时在模块所包含的所有子过程或函数过程中可见。
在模块的通用说明区,用Dim、Static、Private…As关键字定义的变量作用域都是模块范围。
(3)全局范围(Public)
在标准模块的所有过程之外的起始位置,用Public…As关键字说明的变量就属于全局的范围,运行时在类模块和标准模块的所有子过程或函数过程中都可见。
变量的持续时间(生命周期)是从变量定义语句所在的过程第一次运行,到程序代码执行完毕并将控制权交回调用它的过程为止的时间。
注:
关于变量的补充说明
1、当局部变量和模块变量同名,或局部变量和全局变量同名时,在Sub…EndSub或Function…EndFunction范围内只认自己内部定义的局部变量,而将同名的模块变量和全局变量隐藏起来。
例:
2、在Sub子过程或Function函数过程中用Dim、static声明的变量的不同:
(1)Dim声明的是动态变量,每次调用要重新分配内存并初始化,调用完Sub子过程或Function函数过程就回收该变量的内存。
(2)Static声明的是静态变量,只有第一次调用时才分配内存和初始化,第二次及之后的调用都不再初始化。
只能整个程序关闭了,才回收该变量的内存。
例子:
Subs1()
Dimx1AsInteger
Staticx2AsInteger
x1=x1+1
x2=x2+1
Debug.Print"x1="&x1
Debug.Print"x2="&x2
EndSub
Subs2()
s1
Calls1
s1
EndSub
运行子过程s2后的输出结果为:
x1=1
x2=1
x1=1
x2=2
四.数据库对象变量
Access建立的数据库对象及其属性,均可被看成是VBA程序代码中的变量及其指定的值来加以引用。
例如,Access中窗体和报表对象的引用格式为:
Forms!
窗体名称!
控件名称[.属性名称]
或Reports!
报表名称!
控件名称[.属性名称]
关键字Forms或Reports分别表示窗体或报表对象集合。
感叹号“!
”分隔开对象名称和控件名称。
“属性名称”部分缺省,则为控件基本属性。
如果对象名称中含有空格或标点符号,就要用方括号把名称括起来。
五.数组
数组是在有规则的结构中包含一种数据类型的一组数据,也称作数组元素变量。
数组变量由变量名和数组下标构成,使用数组必须先定义数组。
通常用Dim语句来定义数组,定义格式为:
格式1:
Dim数组名(下标上界)[As<数据类型>]
格式2:
Dim数组名(下标下界TO下标上界)
[As<数据类型>]
注:
缺省情况下,下标下界为0,数组元素从“数组名(0)”至“数组名(最大下标)”;如果使用to选项,则可以安排非0下界。
一维数组的元素个数=下标上界-下标下界+1
dimscore(10)asInteger11个元素
dimscore(1to10)asInteger10个元素
注:
(1)所有数组元素在内存连续存放
(2)根据下标区分数组元素
关于数组的定义,还有下面的几点说明:
(1)定义数组时数组名的命名规则与变量名的命名规则相同。
(2)一般在定义数组时应给出数组的上界和下界。
但也可以省略下界,<下界>缺省为0。
例如,Dima(10)AsSingle
默认情况下,数组a由11个元素组成。
若希望下标从1开始,可在模块的通用声明段使用OptionBase语句声明。
其使用格式为
OptionBase0|1'后面的参数只能取0或1
(3)<下界>和<上界>不能使用变量,必须是常量,常量可以是字面常量或符号常量,一般是整型常量。
(4)如果省略As子句,则数组的类型为Varient变体类型。
二维数组的定义
使用Dim语句定义二维数组
格式1:
Dim数组名(一维下标上界,二维下标上界)
[As<数据类型>]
格式2:
Dim数组名([一维下标下界TO一维下标上界],[二维下标下界TO二维下标上界])[As<数据类型>]
例如,
Dimc(1To3,1To4)AsSingle12个元素
c(1,1)
c(1,2)
c(1,3)
c(1,4)
c(2,1)
c(2,2)
c(2,3)
c(2,4)
c(3,1)
c(3,2)
c(3,3)
c(3,4)
DimC(1,2)AsInteger6个元素
六、变量标识命名法规
在编写VBA程序代码时,会用到大量的变量名称和不同的数据类型。
对于控件对象,可以用VBA的Set关键字将每个命名的控件对象指定为一个变量名称。
目前,VB和VBA均推荐使用Hungarian符号法作为命名法则。
该方法也被广泛用在C和C++等一些程序中。
Hungarian符号法使用一组代表数据类型的码。
用小写字母作为变量名的前缀。
七.符号常量
如果程序中多处用到某个常量,将其定义成符号常量可增加代码的可读性,也便于维护。
符号常量用关键字Const来定义,格式如下:
Const符号常量名称=常量值
例如:
ConstPIassingle=3.1415926
定义了一个符号常量PI,其值为3.1415926
若是在模块的声明区中定义符号常量,则建立一个所有模块都可以用的全局符号常量。
一般是Const前加Global或Public关键字。
八.系统常量
这是一类特殊的符号常量,Access系统内部包含若干个启动时就建立的系统常量,有True、False、Yes、No、On、Off和Null等。
在编码时可以直接使用。
例如:
VBA类库中,vbRed代表红色,vbBlue代表蓝色。
这里开始的两个字母表示所在的类库
Access类库的常量以ac开始,如acForm等。
ADO类库的常量以ad开始,如adOpenKeyset。
8.3.5常用标准函数
在VBA中,除在模块创建中可以定义子过程与函数过程完成特定功能外,又提供了近百个内置的标准函数,可以方便完成许多操作。
标准函数一般用于表达式中,有的能和语句一样使用。
其使用形式如下:
函数名(<参数1><,参数2>[,参数3][,参数4][,参数5]…)
其中,函数名必不可少,函数的参数放在函数名后的圆括号中,参数可以是常量、变量或表达式,可以有一个或多个,少数函数为无参函数。
8.3.6运算符和表达式
在VBA编程语言中,提供了许多运算符来完成各种形式的运算和处理。
根据运算不同,可以分成4种类型的运算符:
算术运算符、关系运算符、逻辑运算符和连接运算符。
8.4VBA流程控制语句
一个语句是能够完成某项操作的一条命令。
VBA程序的功能就是由大量的语句串命令构成。
VBA程序语句按照其功能不同分成两大类型:
(1)声明语句,用于给变量、常量或过程定义命名;
(2)执行语句,用于执行赋值操作,调用过程,实现各种流程控制。
执行语句分为3种结构:
(1)顺序结构,按照语句顺序顺次执行。
(2)条件结构,又称为选择结构,根据条件选择执行路径。
(3)循环结构,重复执行某一段程序语句。
8.4.1赋值语句
赋值语句是最基本的语句。
它的功能是给变量或对象的属性赋值。
其格式为
<变量名>=<表达式>或<对象名.属性>=<表达式>
例如:
Rate=0.1‘给变量Rate赋值0.1
Me!
Text1.Value=“Access程序设计"“给控件的属性赋值
8.4.2条件语句
1.If…Then语句例如:
语句格式为
If<表达式>
Then
<语句块1>
EndIf
‘输入一个数并在立即窗口输出其值
DimxAsInteger
x=InputBox("请输入x的值:
")
IfxThen
Debug.Printx
EndIf
2.If…Then…Else语句
语句格式为
If<表达式>Then
<语句块1>
Else
<语句块2>
EndIf
说明:
(1)<表达式>可以是任何表达式,一般为关系表达式或布尔表达式。
如果是其他表达式,则非0认为是True,0认为是False。
(2)执行时,先判断表达式的值,为True则执行语句块1,否则执行语句块2。
例如:
(1)输入两个数并在立即窗口输出其中较大的数
DimxAsInteger,yAsInteger
x=InputBox("请输入x的值:
")
y=InputBox("请输入y的值:
")
Ifx>yThen
Debug.Printx
Else
Debug.Printy
EndIf
(II)Ifx>0ThenMsgbox“x>0”ElseMsgbox“x<=0”
(III)在窗体中有一个文本框Test1,编写事件代码如下:
PrivateSubForm_Click()
X=val(Inputbox(“输入x的值”))
Y=1
IfX<>0ThenY=2
Text1.Value=Y
EndSub
打开窗体运行后,在输入框中输入整数12,文本框Text1中输出的结果是
A)1
B)2
C)3
D)4
(IV)若窗体中已有一个名为Command1的命令按钮、一个名为Label1的标签和一个名为Text1的文本框,且文本框的内容为空,然后编写如下事件代码:
PrivateFunctionf(xAsLong)AsBoolean
IfxMod2=0Then
f=True
Else
f=False
EndIf
EndFunction
PrivateSubCommand1_Click()
DimnAsLong
n=Val(Me!
text1)Date()Str()Mid()Len()
p=IIf(false,"Evennumber","Oddnumber")
Me!
Label1.Caption=n&"is"&p
21&“is”&"Oddnumber"
EndSub
窗体打开运行后,在文本框中输入21,单击命令按钮,则标签显示内容为“21isOddnumber”。
3.If…Then…ElseIf语句
语句格式为
If<表达式1>Then
<语句块1>
ElseIf<表达式2>Then
<语句块2>
…
[ElseIf<表达式n>Then
<语句块n>
Else
<语句块n+1>]
EndIf
运行时,从表达式1开始逐个测试条件,当找到第一个为True的条件时,即执行该条件后所对应的语句块。
例:
x=10
Ifx<0Then
Msgbox“x<0”
ElseIfx=0Then
Msgbox“x=0”
ElseIfx<100Then
Msgbox“0Else
Msgbox“x>=100”
EndIf
4.SelectCase—EndSelect语句
语句格式为
SelectCase<变量或表达