第8章 模块与VBA编程基础.docx
《第8章 模块与VBA编程基础.docx》由会员分享,可在线阅读,更多相关《第8章 模块与VBA编程基础.docx(21页珍藏版)》请在冰豆网上搜索。
![第8章 模块与VBA编程基础.docx](https://file1.bdocx.com/fileroot1/2023-1/27/98977b9b-5743-479d-80ae-fa60595f355b/98977b9b-5743-479d-80ae-fa60595f355b1.gif)
第8章模块与VBA编程基础
第8章模块与VBA编程基础
一、模块的基本概念
模块是将VBA声明和过程作为一个单元进行保存的集合。
1、类模块
窗体和报表都是类模块,它们从属于各自的窗体或报表。
通过单击窗体或报表设计视图中工具栏上的“代码”命令,可进行类模块的编辑窗口。
2、标准模块
包含通用过程和常用过程,以.bas扩展名保存文件,缺省时应用程序中不包含标准模块,模块中对象的声明在缺省时是公有的。
3、将宏转换为模块
在Access系统中,可以将设计好的宏对象转换为模块代码形式。
其操作方法是:
右击指定宏,选择快捷菜单中“另存为”命令,将其另存为模块类型即可。
二、创建模块
过程是模块的单元组成,过程分为两种:
Sub子过程和Function函数过程。
1、在模块中加入过程
(1)子过程
⏹定义格式
Sub过程名([参数表])
[程序代码]
EndSub
⏹说明
Ø可在过程中放置ExitSub语句,强行退出过程
Ø过程的定义是平行,不能嵌套定义过程。
Ø过程结束标志为EndSub
⏹调用Sub过程
格式1:
Call过程名[(实参表)]
当过程没带参数时,缺省实参表。
否则带相应个数的实参,并参数间用逗号分隔。
格式2:
过程名[实参表]
当带参数时,则实参表不能用括号。
(2)函数过程
⏹定义格式
Function函数名([参数列表])[As类型]
程序代码
函数名=返回值
EndFunction
⏹说明
Ø以Function开头,并以EndFunction结束。
Ø函数中可用ExitFunction语句强行退出。
Ø类型选项表示该函数需要返回的数据类型,缺省时为Variant型。
⏹调用函数
与VB内部函数的调用相同,不能用Call调用。
2、在模块中执行宏
在模块中使用以下方式调用宏:
Docmd.RunMacro“宏名”[,Rcount][,Rexp]
Rcount用于计算宏运行次数,Rexp条件表达式,当结果为False时停止运行宏。
三、VBA程序设计基础
1、面向对象程序设计的基本概念
(1)对象是类的一个实例,每个对象都有自己的特征和行为。
(2)对象的属性:
指对象的特征,用数据来表示。
(3)对象的方法:
指对象的行为,用对象中的代码来实现。
(4)事件:
指对象可以识别和相应预定义的动作。
(5)类:
描述对象的特征以及对象外观和行为的模板。
其特征主要包括:
封装性、继承性、多态性、抽象性。
2、VisualBasic编辑环境
(1)启动VB编辑器方法
方法1:
通过各对象属性对话框中事件标签方式启动。
方法2:
通过模块对象列表中的“新建”按钮启动。
方法3:
通过主菜单“工具\宏\VisualBasic编辑器”命令或Alt+F11快捷键启动。
(2)VBA编辑器界面
⏹标准工具栏:
认识常用的命令按钮。
⏹工程窗口:
即资源管理器窗口,管理应用程序的所有模块文件。
⏹代码窗口:
有对象和事件下拉列表框、代码编辑区以及模块查看切换按钮组。
⏹属性窗口:
用于罗列指定对象的所有属性。
⏹立即窗口:
用于表达式计算和对象值的显示,主要用在程序调试时。
(3)程序语句书写规则
⏹多条语句写在同一行上时,语句间用冒号作分隔符
⏹将一条语句写在多行上时,此时可用续行符“_”。
⏹添加注释:
用单引号“‘”或Rem语句作为注释内容的开始。
3、数据类型与数据库对象
(1)标准数据类型
数据类型
类型标识
类型说明符
取值范围
整型
Integer
%
-32768~32767
长整型
Long
&
单精度
Single
!
双精度
Double
#
货币
Currency
@
字符串
String
$
0~65500
布尔型
Boolean
无
True或False
日期型
Date
无
100/1/1~9999/12/31
变体型
Variant
无
⏹布尔型数据:
其取值为True或False,True值存储为-1,False值存储为0。
⏹日期型数据:
其常量表示时以#号为定界符,如#2001-1-1#
⏹变体型数据:
可以包含除定长字符串与用户自定义类型外的任何数据类型。
(2)用户自定义类型
定义格式:
Type[数据类型名]
成员名1as<数据类型>
成员名2as<数据类型>
。
。
。
。
。
。
。
。
。
。
。
EndType
如:
TypeStud‘定义数据类型
Noasintger
Nameasstring*8
Sexasstring*1
Scoreassinge
Endtype
Dimstasstud‘定义数据类型变量
WithSt
.no=1001
.name=”李四”
.sex=”男”
.Score=88.5
endwith
‘给变量的各个成员赋值
St.no=1001
St.name=”李四”
St.sex=”男”
St.score=88.5
4、变量与常量
(1)变量声明
格式:
Dim变量名[As<数据类型>]或Dim变量名[类型说明符]
如:
dimaasinteger,basdate,c!
d
dimLg&
(2)强制声明
在通用声明区加上语句:
OptionExplicit。
这将要求程序中所有变量都必须先声明后才能使用。
(3)变量的作用域
⏹局部级:
在过程级定义的变量,仅在声明它的过程中可见。
⏹模块/窗体级:
在模块或窗体级声明的变量,在声明它的模块或窗体中的所有过程中可见。
⏹全局级:
用Public关键字在模块或窗体级声明的变量,在所有项目的任何过程中都可。
⏹定义静态变量:
用Static语句取代Dim语句,静态变量在调用时仍保留其原先的值。
(4)数组
⏹定义:
指连续可索引的具有相同数据类型的元素所组成的集合。
⏹使用一维数组
Ø声明格式:
Dim数组名([下标下界to]下标上界)as数据类型
Ø说明:
◆数组元素缺省下标值为0,
◆数组元素个数为(下标上界-下标下界)+1
⏹使用二维数组
Ø声明格式:
Dim数组名(下标1,下标2)as数据类型
Ø说明:
◆下标格式同一维数组下标格式,
◆最多可声明60个维数,
◆数组元素个数为:
下标1元素个数*下标2元素个数。
(5)变量命名规则
必须以字母打头,在同一范围内必须唯一,长度不能超过255个字符,且中间不能包含句点或类型声明符。
(6)常量
⏹概念:
指在程序运行过程中固定不变的数据量。
⏹Access支持三类常量:
Ø符号常量:
用Const语句定义,在模块中使用。
Ø固有常量:
是Access或引用库的一部分。
Ø系统定义常量:
True、False、Yes、No、On、Off、Null等等。
⏹声明符号常量
Ø使用Const语句进行符号常量声明。
Ø符号常量声明位置:
可在过程中或在模块顶部声明符号常量。
Ø模块级中声明的符号常量缺省为私有常量。
Ø在Const语句前加上Public声明的常量为公共常量,而加上Private声明的常量为私有常量。
Ø声明符号常量时,可定义的数据类型有:
Boolean、Byte、Integer、Long、Currency、Single、Double、Date、String或Variant。
例:
PublicConstconageasinteger=20
ConstconBirthasDate=#2006-01-01#,conWageasCurrency=3500¤
5、常用标准函数
(1)算术函数
⏹绝对值函数:
Abs(<数值表达式>)
如:
Abs(-10)=10
⏹向下取整函数:
Int(<数值表达式>)
如:
Int(3.25)=3,Int(3.99)=3,Int(-2.14)=-3,Int(-2.98)=-3
⏹取整函数:
Fix(<数值表达式>)
如:
Fix(3.25)=3,Fix(3.99)=3,Fix(-2.14)=-2,Fix(-2.98)=-2
⏹四舍五入函数:
Round(<数值表达式>[,<小数位数>])
如:
Round(3.84,1)=3.8,Round(3.86,1)=3.9,Round(3.84)=5,Round(3.84,0)=5
⏹开平方函数:
Sqr(<数值表达式>)
如:
Sqr(9)=3
⏹产生随机数函数:
Rnd(<数值表达式>)
产生0~1之间的随机小数。
用Randomize语句初始化随机数生成器,可以产生不同的随机数。
如:
Int(100*Rnd)‘产生[0,99]的随机数
Int(101*Rnd)‘产生[0,100]的随机数
Int(100*Rnd+1)‘产生[1,100]的随机数
Int(100*Rnd+200)‘产生[200,299]的随机数
通式:
Int(a*Rnd+b)=>产生[b,a+b-1]的随机数
(2)字符串函数
⏹字符串检索函数
InStr([start,]string1,string2[,compare])
start
可选参数。
为数值表达式,设置每次搜索的起点。
如果省略,将从第一个字符的位置开始。
如果start包含Null,将发生错误。
如果指定了compare参数,则一定要有start参数。
string1
必要参数。
接受搜索的字符串表达式。
string2
必要参数。
被搜索的字符串表达式。
Compare
可选参数。
指定字符串比较。
如果compare是Null,将发生错误。
如果省略compare,OptionCompare的设置将决定比较的类型。
指定一个有效的LCID(LocaleID)以在比较中使用与区域有关的规则。
compare参数设置为:
常数
值
描述
vbUseCompareOption
-1
使用OptionCompare语句设置执行一个比较。
vbBinaryCompare
0
执行一个二进制比较。
vbTextCompare
1
执行一个按照原文的比较。
vbDatabaseCompare
2
仅适用于MicrosoftAccess,执行一个基于数据库中信息的比较。
DimStr,Ch,MyPos
Str="XXpXXpXXPXXP"'被搜索的字符串。
Ch="P"'要查找字符串"P"。
'从第四个字符开始,以文本比较的方式找起。
返回值为6(小写p)。
'小写p和大写P在文本比较下是一样的。
MyPos=Instr(4,Str,Ch,1)
'从第一个字符开使,以二进制比较的方式找起。
返回值为9(大写P)。
'小写p和大写P在二进制比较下是不一样的。
MyPos=Instr(1,Str,Ch,0)
'缺省的比对方式为二进制比较(最后一个参数可省略)。
MyPos=Instr(Str,Ch)'返回9。
MyPos=Instr(1,Str,"W")'返回0。
⏹字符串长度检测函数
Len(string|varname)
部分
说明
string
任何有效的字符串表达式。
如果string包含Null,会返回Null。
Varname
任何有效的变量名称。
如果varname包含Null,会返回Null。
如果varname是Variant,Len会视其为String并且总是返回其包含的字符数。
如:
dimstrasstring*10
imI
str=”123”
I=12
Printlen(“12345”)‘长度为5
Printlen(12)‘出错
Printlen(i)‘长度2
Printlen(“等级考试”)‘长度4
Printlen(str)‘长度10
⏹字符串截取函数
ØLeft(string,length)
string
必要参数。
字符串表达式其中最左边的那些字符将被返回。
如果string包含Null,将返回Null。
length
必要参数;为Variant(Long)。
数值表达式,指出将返回多少个字符。
如果为0,返回零长度字符串("")。
如果大于或等于string的字符数,则返回整个字符串。
DimAnyString,MyStr
AnyString="HelloWorld"'定义字符串。
MyStr=Left(AnyString,1)'返回"H"。
MyStr=Left(AnyString,7)'返回"HelloW"。
MyStr=Left(AnyString,20)'返回"HelloWorld"。
ØRight(string,length)
string
必要参数。
字符串表达式,从中最右边的字符将被返回。
如果string包含Null,将返回Null。
length
必要参数;为Variant(Long)。
为数值表达式,指出想返回多少字符。
如果为0,返回零长度字符串("")。
如果大于或等于string的字符数,则返回整个字符串。
DimAnyString,MyStr
AnyString="HelloWorld"'定义字符串。
MyStr=Right(AnyString,1)'返回"d"。
MyStr=Right(AnyString,6)'返回"World"。
MyStr=Right(AnyString,20)'返回"HelloWorld"。
ØMid(string,start[,length])
string
必要参数。
字符串表达式,从中返回字符。
如果string包含Null,将返回Null。
start
必要参数。
为Long。
string中被取出部分的字符位置。
如果start超过string的字符数,Mid返回零长度字符串("")。
length
可选参数;为Variant(Long)。
要返回的字符数。
如果省略或length超过文本的字符数(包括start处的字符),将返回字符串中从start到尾端的所有字符。
DimMyString,FirstWord,LastWord,MidWords
MyString="MidFunctionDemo"建立一个字符串。
FirstWord=Mid(MyString,1,3)'返回"Mid"。
LastWord=Mid(MyString,14,4)'返回"Demo"。
MidWords=Mid(MyString,5)'返回"FuncionDemo"。
⏹生成空格字符函数
ØSpace(number)
DimMyString
'返回10个空格的字符串。
MyString=Space(10)
'将10个空格插入两个字符串中间。
MyString="Hello"&Space(10)&"World"
⏹大小写转换函数
ØLCase(string)‘只有大写的字母会转成小写;所有小写字母和非字母字符保持不变。
DimUpperCase,LowerCase
Uppercase="HelloWorld1234"'要输送的字符串。
Lowercase=Lcase(UpperCase)'返回"helloworld1234"。
ØUCase(string)‘只有小写的字母会转成大写;原本大写或非字母之字符保持不变。
DimLowerCase,UpperCase
LowerCase="HelloWorld1234"'要输送的字符串。
UpperCase=UCase(LowerCase)'返回"HELLOWORLD1234"。
⏹删除空格函数
ØLTrim(string)
ØRTrim(string)
ØTrim(string
返回Variant(String),其中包含指定字符串的拷贝,没有前导空白(LTrim)、尾随空白(RTrim)或前导和尾随空白(Trim)。
(3)日期/日间函数
见P215
(4)类型转换函数
见P218
6、运算符和表达式
⏹算术运算符
⏹字符串运算符
Ø运算符:
&和+
例:
VB=“Visual”+“Basic”'连接为字符串“VisualBasic”
label1.Caption="第"&Str(N)&"条记录"
'Str为数值型转字符型函数。
若N为1,标签上显示“第1条记录”
Ø说明:
◆v使用+号,要求连接的两个表达式均为字符串型
◆v使用&号,连接的两个表达式可以为任何类型,但结果为字符串型,如:
“当前日期”
/8/2002#
⏹关系运算符
Is:
判定两个Object类型的变量是否引用同一个对象
Like:
判定左边的字符串是否与右边的字符串匹配
⏹逻辑运算符
常用:
Not、And、Or
Not:
表达式数为True时,结果为False;反之亦然。
例如,Not(4>5),结果为True
And:
两个表达式均为True时,结果为True
例如,(4>5)And(8>7),结果为False
Or:
两个表达式均为False时,结果为False
例如,(4>5)Or(8>7),结果为True
⏹表达式和优先级
Ø表达式:
用运算符和圆括号将常量、变量、函数和常数连接起来组成的有意义的式子。
如,数值表达式Cos(180*Pi/180)*100
逻辑表达式(N>=0)And(NMod2<>0)
Ø运算优先顺序(从高到低):
函数→算术运算(乘方→取负→乘/除→整除→求余→加/减)
→字符串运算符→关系运算符→逻辑运算符(Not→And→Or)
Ø用括号可以改变运算顺序
Ø乘方和负号相邻时,取负优先。
例如:
2^-2的结果是0.25,相当于2^(-2)
四、VBA流程控制语句
控制语句分3种:
顺序结构、选择结构和循环结构。
1、赋值语句
格式:
变量名=值或表达式
2、条件语句
(1)行If语句
⏹格式:
If<条件>Then<语句组1>[else<语句组2>]
⏹说明:
Ø条件:
可以是关系、逻辑表达式,也可以是算术,算术表达式以零值为False,非零值为True。
Ø该语句只能在同一行上书写,对语句组中的语句间用冒号分隔。
Ø该语句自身还可嵌套使用。
⏹例:
If100thenprint“true”elseprint“false”
Ifx>ythenx=x*y:
printxelsey=y/x:
printy
Ifx>0theny=1elseifx=0theny=0elsey=-1
(2)块If语句
⏹格式:
If <条件>Then
<语句组1>
[Else
<语句组2>]
EndIf
⏹说明:
Øif-then、else和endif都必须单独成行。
Ø块If语句也可以进行嵌套使用。
⏹例:
If Pass="1234"Then
Ok=True
Else
Ok=False
EndIf
⏹示例
见222例8.4、例8.5、例8.6、例8.7
(3)SelectCase语句
⏹格式:
SelectCase测试表达式
Case表达式列表1
[语句块1]
[Case表达式列表2
[语句块2]
...
[CaseElse
[语句块n]
EndSelect
⏹说明
Ø当测试表达式一旦找到满足的表达式列表,就执行其后的语句,之后退出多分支选择结构,即多分支结构只能执行其中的一个分支。
Ø表达式列表有四种表示格式:
◆列举式:
如case2,4,6,8
◆闭区间式:
如case1to10
◆关系式:
Is<关系运算表达式>如caseis>1
◆以上三种的混合式。
Ø一般case后的表达式不能出现相同的情况。
Øcase子句的先后顺序不影响程序的运行结果。
Øcaseelse子句必须放在所有case子句之后。
⏹示例
见225例8.8、例8.9
(4)条件函数
⏹IIf函数
Ø格式:
IIf(条件表达式,表达式1,表达式2)
Ø说明:
当条件表达式值为真(true)时,函数返回表达式1的值,否则返回表达式2的值。
Ø例
要求性别字段值为1时,文本框TxtSex中显示“男”,性别字段值为2时,文本框TxtSex中显示“女”。
TxtSex=IIf(性别=1,“男”,“女”)
⏹Switch函数
Ø格式:
Switch(条件1,表达式1[,条件2,表达式2…..[,条件n,表达式n]])
Ø说明:
Switch函数的参数列表由多对表达式和数值组成。
表达式是由左至右加以计算的,而数值则会在第一个相关的表达式为True时返回。
Ø例:
Matchup=Switch(CityName="北京","中国",CityName="伦敦","英国",_
CityName="罗马","意大利",CityName="巴黎","法国")
⏹Choose函数
Ø格式:
Choose(index,choice-1[,choice-2,...[,choice-n]])
Ø说明:
◆Choose会根据index的值来返回选择项列表中的某个值。
如果index是1,则Choose会返回列表中的第1个选择项。
如果index是2,则会返回列表中的第2个选择项,以此类推。
◆当index小于1或大于列出的选择项数目时,Choose函数返回Null。
◆如果index不是整数,则会先四舍五入为与其最接近的整数。
Ø例:
Matchup=Choose(idx,"北京","伦敦","罗马","巴黎")
⏹示例
见226例8.10、例8.11
3、循环语句
(1)For–Next语句
⏹格式:
For循环变量=初值to终值[Step步长]
语句块
[ExitFor]
语句块
Next循环变量
⏹说明:
>0初值<终值=1时,可省略
Ø步长<0初值>终值
=0死循环
Ø缺省S