Access课件第十八十九课VBA编程基础.docx
《Access课件第十八十九课VBA编程基础.docx》由会员分享,可在线阅读,更多相关《Access课件第十八十九课VBA编程基础.docx(21页珍藏版)》请在冰豆网上搜索。
Access课件第十八十九课VBA编程基础
VBA编程基础
VBA(VisualBasicApplication):
是MicrosoftOffice系列软件的内置编程语言,VBA是面向对象的程序设计语言。
一般Access程序设计在遇到下列情况下需要使用VBA代码:
1、创建用户自定义函数(User-definedFunction,UDF)。
使用UDF,可以使程序代码更加简洁而有效
2、复杂程序处理。
可以编写选择结构、循环结构等复杂程序处理。
3、数据库的事务处理操作。
4、使用ActiveX控件和其他应用程序对象。
5、错误处理。
一、VBA编程环境
1.VisualBasic编辑器(VBE=VisualBasicEditor)是编辑VBA代码的工作界面,VBE窗口主要有标准工具栏、工程窗口、属性窗口和代码窗口等组成。
标准工具栏
工程窗口(工程资源管理器,其中列出了应用程序的所有模块文件)
注:
工程资源管理器将模块分为:
对象、类和标准模块
代码窗口(由三部分组成:
对象组合框、事件组合框、代码编辑区)进行程序设计的窗口,显示和编辑代码窗口
注:
可以查看多代码窗口及转换
属性窗口(列出了各个所选对象的属性:
分“按字母序”和“按分类序”,直接在属性窗口中编辑对象的属性,属于对象属性的“静态”设置方法,以在代码窗口内用VBA代码编辑对象的属性,这属于对象属性的“动态”设置方法)
立即窗口(用来进行快速的表达式计算、简单方法的操作及进行程序测试的工作窗口)
注:
默认界面及全部界面的操作(工具栏/“视图”菜单)
2、进入VBE编辑界面
对象模块
方式
标准模块
对象模块的操作步骤:
右击事件生成器代码生成器
打开事件属性单击(…)代码生成器
标准模块的操作步骤
模块对象下双击模块
模块对象下“新建”命令
数据库对象下“工具”菜单“宏”
VisualBasic编辑器
注:
Alt+F11进入VBE界面及数据库窗口与VBE之间的转换快捷键
3、编写VBA代码语句原则
语句书写规则:
通常一条语句写在一行;如果一行写不下,可以“_”将语句连续写在下一行(一条语句写在多行),也可以用“:
”将几个语句分隔在一行中(多条语句写在一行)如:
A=2:
b=3:
c=4
注:
编写完一语句后,如该句中有红色文本显示,则该语句出错
注释:
分Rem语句和单引号语句,起解释说明作用
书写格式:
:
Rem和’
注:
注释的语句不会执行!
二、VBA编程基础
1、面向对象程序设计的基本概念
对象:
客观存在的可相互区分的实体
比如一个人,一台电脑,一辆汽车、都是实体
集合:
某一类的对象的实体集,类
对象:
张三、李四→类:
人
属性:
就是描述一个对象的特征
比如描述一个人有哪些属性?
姓名、身高、性别、年龄……,每个对象这样的属性,取值是不同的
属性使用方式:
对象.属性=="对象名.属性名"
方法:
就是描述一个对象的行为(即对象所实施的动作)
比如说一个人能走路,能跑步…..,这些刻画一个对象的动态特征我们就称之为方法。
方法使用方式:
对象.行为="对象名.方法名"
注意:
属性是描述对象的静态特征,方法是描述一个对象的动态特征
Access中为我们提供了7种对象,此外还提供了DoCmd对象,它的主要功能是通过调用包含在内部的方法实现VBA编程中对Access的操作。
例如DoCmd.OpenReport报表名
事件就是Access窗体或报表及其上的控件等对象可以“识别”的动作(即动作之后发生的事情)例如鼠标单击等
事件过程:
对于一个事件我们需要编写相应的代码来反映执行这样的事件会带来什么样的结果!
事件过程的形式如下:
PrivateSub对象名_事件名()
…(VB程序代码)
EndSub
例
PrivateSubtest_Click()
MsgBox"你好吗?
",vbQuestion,"标题"
EndSub
总结:
一个具有某些特色(即:
对象的属性);
事物(即:
对象本身);
对这个事物实施了某个动作(即:
对象的方法);
由此产生了一个结果(即:
对象的事件)。
2、数据类型和数据库对象
Access数据库系统创建表时涉及的字段数据类型(除OLE和备注外),在VBA中都有相应的数据类型相对应
标准数据类型
VBA数据类型
用户自定义数据类型
标准数据类型
数据类型
类型标识
符号
字段类型
整型
Integer
%
字节/整数/是/否
长整型
Long
&
长整数/自动编号
单精度数
Single
!
单精度数
双精度数
Double
#
双精度数
货币
Currency
@
货币
字符串
String
$
文本
布尔型
Boolean
无逻辑值
日期型
Date
日期/时间
变体类型
Variant
任何
注:
1)布尔型数据(Boolean)只有两个值:
True和False,布尔型数据转换为数值型时:
True转换为-1,False转换为0
2)日期时间型(Date)必须前后用##封住,#2012-5-15#
日期和时间之间用空格隔开#2012/5/14□21:
30:
30#
3)变体类型数据(Variant):
变体数据类型是一种特殊的数据类型,除了定长字符串类型及用户自定义类型外,可以包含其它任何的数据。
如Empty(空)、Error(出错)、Nothing(无值)、Null(空值)
VBA中规定:
如果没有显示声明或使用符号来定义变量的数据类型,则默认为变体类型。
例如:
dimaasInteger(定义一个Integer型变量a)dima%
dimb(定义变体类变量b)
b=10(b是Integer)
b=#2009-2-8#(b是Date)
b=@10.1234(b是Currency)
用户自定义数据类型:
应用过程中用户可以创建一个或多个VBA标准数据类型的自己的数据类型
定义格式:
Type[数据类型名]===Type[数据类型名]
[域名]As<数据类型><成员变量名>As<数据类型>
[域名]As<数据类型><成员变量名>As<数据类型>
…………
EndTypeEndType
比如说:
想定义一个Student的数据类型
TypeStudent
stuNOasString*10’学号,10个长度字符串
stuNameasString’姓名,变长字符串(没有指定长度)
stuSexasStrinnteg*1’一个长度字符串
stuAgeasIger’年龄,整型
EndType
那么此时我们就有了一个新的数据类型,那就是Student类型
可以用DimPublicStatic关键字来定义用户类型变量
如可以这样定义一个Student类型的变量。
DimStuasStudent
DimaasInteger
a=1
接下来就是给变量赋值
Stu.stuNO=“200901005 ”
Stu.stuName=“张三”
Stu.stuSex=“男”
Stu.stuAge=21
也可以使用With关键字简化程序中重复的部分
WithStu
.stuNO=“200901005”
.stuName=“张三”
.stuSex=“男”
.stuAge=21
EndWith
VBA数据库对象类型:
数据库对象Database
连接Connection
窗体Form
报表Report
控件Control
查询QueryDef
表TableDef
命令Command
3.变量
变量:
在程序运行时值会发生变化的数据。
程序利用变量来保存数据,传送数据,处理数据
变量名:
变量的名字,由用户定义。
每个变量都属于某种数据类型,并在内存中占有一定的内存空间,每个变量在内存中所占有的位置都有一个内存地址,使用地址对变量操作并不方便,所以需要给变量取一个名字称为变量名。
在程序运行过程中,使用变量名就可以对变量的值进行存取,不必知道他的真正的地址
变量的命名规则:
a.以字母开头
b.除下划线字符(“_”)外,不能有标点符号(如:
!
&[]””)
c.最长只能有255个字符注:
一个汉字算一个字符
d.不能与VBA关键字重复(dim…as…)
e.不区分大小写,通常采用大写与小写字母相结合的
f.使用Set关键字来建立控件对象的变量
变量的声明:
就是使用前,定义变量名称及类型,使系统为变量分配存储空间
1)显示声明:
变量先定义后使用
定义变量的格式:
Dim…AS[VarType]==Dim<变量名>As<变量的类型>结构,其中,As后指明数据类型。
注意:
声明某个变量为某种类型后,该变量只能存储该类型的数据。
变量是一个内存区域,我们可以使用赋值语句对变量进行赋值(=)。
例如:
dima(表示定义一个“变体型”变量a)
dimaasInteger(表示定义一个整型变量a)
dimsasstring(表示定义字符串s)
dimnameasString’定义变量name为字符串类型
Name=“张三”
2)隐含声明:
没有定义而通过一个值指定给变量名,注意:
没有声明类型的变量都是Variant类型的。
例:
Dima,b’a,b为变体类型(variant类型)
age=20’age为变体类型(variant类型)
3)强制声明:
在默认情况下,VBA允许在代码中使用未声明的变量,如果在模式设计窗口的顶部“通用-声明”区域中,加入语句,
OptionExplicit强制要求所有变量必须先定义才能使用
说明:
如果用OptionExplicit则只能为当前模块设置了自动变量(显式变量)功能,后才能使用变量。
如果为所有模块灰启用此功能,方法:
“工具”菜单“选项”要求变量声明
例题:
dima
Subaa()'aa表示该过程的名字。
DimbAsInteger,cAsInteger'表示定义整型变量b和c。
b=10'给变量b赋一个值10。
c=20'给变量c赋一个值20。
MsgBoxb-c+a'输出b-c的值。
EndSub
变量的使用范围(作用域)
变量的作用域:
在VBA编程中,变量定义的位置和方式不同,则它存在的时间和起作用的范围也有所不同,这就是变量的作用域与生命周期。
在VisualBasic中变量的作用域有3个层次
1)局部范围(local)(定义在模块的过程内部,在子过程和函数过程中定义的或直接使用的变量作用范围都是局部的)
注:
子/涵数过程使用Dim、Static…As关键字则变量就是局部范围
2)模块范围(module)(变量定义在模块的所有过程之外的起始位置,运行时在模块所包含的所有子过程和函数过程中可见,在模块的通用说明区域用Dim、Static、Private…as关键字定义的变量都是模块变量)
3)全局范围(Public)变量定义在标准模块的所有过程之外的起始位置,运行时在所有类模块和标准模块的所有子过程和函数过程中都可见,在标准模块的变量定义区域,用Public…As关键字说明的变量就属于全局变量,
注:
变量还有一个特性就是变量的生命周期,变量的生命周期是从变量定义语句所在的过程第一次运行,到程序代码执行完毕并将控制权交回调用它的过程为止的时间。
要在变量运行时保留局部变量的值,可以用Static关键字代替Dim定义静态变量。
静态(Static)变量的持续时间是整个模块执行的时间,但它的有效作用范围是由其定义位置决定的
数据库对象的变量
Access中建立的数据库对象及其属性,均可被看成是VBA程序代码中的变量及其指定的值来加以引用。
引用窗体或是报表中的控件,它的引用方式是:
窗体:
Forms!
窗体名称!
控件名称[.属性名称]
报表:
Reports!
报表名称!
控件名称[.属性名称]
=====Forms!
[窗体名]!
[控件名][.属性名]
Repots!
[报表名]!
[控件名][.属性名]
注:
如对象名称中含有空格或标点符号,就要用方括号把名称括起来
可以使用Set关键字来建立控件对象的变量
例如:
Forms!
学生管理!
编号=“980306”
Forms!
学生管理!
[编号]=“980306
DimtxtNameAsCotrol定义控件类型变量
SettxtName=Forms!
学生管理!
姓名引用窗体控件对象
txtName=“张名”操作对象变量
数组(用来保存相同类型相同的数据集合)
数组是在有规则的结构中包含一种数据类型的一组数据,即数组元素变量。
数组变量由变量名和数组下标构成
数组有数组名,一个数组有多个数组元素组成,每个数组元素中保存一个数据。
要对某一个数组元素中的数据进行存取,必须指定这个元素在数组中的序号(下标,索引),每一个数组元素都可以使用数组名与下标唯一的确定,下标是连续的整数,下标的最小值叫着下标下界,最大值叫下标上界
用Dim语句定义数组。
格式:
Dim<数组名>([下标下限to]下标上限)
数组分为:
一维数组、多维数组和动态数组
(1)一维数组(缺省情况下,下标下限为0,数组元素从“数组名(0)”至“数组名(下标上限)”;如使用to选项,则可安排非0下限)即:
Dimarray(n)asinteger则数组有n+1个元素
Dimarray(ntom)asinteger则数组有m—n+1个元素
例:
dima(2to5)asinteger表示:
a
(2)、a(3)、a(4)、a(5)
dima(5)asinteger表示:
a(0)、a
(1)、a
(2)、a(3)、a(4)、a(5)
Dimb(10)asInteger从b(0)到b(10),共11个元素。
(2)多维数组:
在数组下标中加入多个数值,并以逗号分开维数组,最多可以定义60维。
定义了格式
DimNewArray(n,…,m)则数组有n+1*…*m+1个元素
DimNewArray(ntom,…,ktoL)则数组有m—n+1*…*L-K+1个元素
Dima(2,3)asInteger'定义二维数组(行和列)
注:
行:
0,1,2(3行)
列:
0,1,2,3(4列)
因此共3*4=12个元素,从a(0,0)到a(2,3)。
Dimc(1to2,2to3)asInteger
注:
行:
1→2(2行)
列:
2→3(2列)因此共2*2=4个元素,从a(1,2)到a(2,3)。
DimNewArray(5,5,5)AsInteger有6*6*6=216个元素
注意:
optionbase0/1的使用,OptionBase0(下标从0开始),OptionBase1(下标从1开始)
例如:
OptionBase0
Dimc(2,3,4)asInteger'定义三维数组
0→2(3个)、0→3(4个)、0→4(5个),共3*4*5=60个元素。
OptionBase1
Dimc(2,3,4)asInteger
1→2(2个)、1→3(3个)、1→4(4个),共2*3*4=24个元素
(3)动态数组:
先用Dim显式定义数组但不能指明数组元素数目,然后用ReDim关键字来决定数组元素数目
创建方法:
第一步:
声明一个没有下标参数的数组。
说明符数组名()[As类型]
第二步:
引用数组前用ReDim语句重新定义。
ReDim数组名([下界to]上界[,[下界to]上界……])[As类型]
例Dimarray()asLong先不分配空间,等使用的时候再分配空间。
ReDimarray(10,10,10)
注:
用ReDim定义的数组是"动态的",既数组的大小不固定
RepeatDimension,重复定义
在VBA中,模块的声明部分用OptionBase1语句,可以将数组的默认下标下限由0改为1
例题:
ReDim(RepeatDimension,重复定义)
Dima(3)AsInteger(固定数组,最多有4个元素)
Subxx()
Dima()AsInteger'定义动态数组
ReDima(5)AsInteger'分配空间
a(5)=10
MsgBoxa(5)'输出元素a(5)
EndSub
4、常量:
在程序运行期间不会改变的对象
分为符号常量、系统常量和内部常量。
常量的类型分为:
整数、长整型、单精度、双精度、字符串、货币、布尔型(逻辑性)、日期时间等类型
符号常量使用关键字Const来定义,格式如下:
Const符号常量名称=常量值
=====Const常量名[类型符号]=常数表达式
如:
ConstPI=3.1415926
Constss="相信自己,明天是你的"
MsgBoxss,vbInformation,"系统提示"
注:
在模块的声明区定义符号常量可以在所有的模块中使用。
一般是Const前加Global或Public关键字
符号常量定义时不需要为常量指用数据类型,一般要求大写命名
例题:
Subaa()
DimaAsInteger
ConstbAsInteger=10
a=20
b=20
MsgBoxa+b,vbInformation,"变量和常量的区别"
EndSub
注:
b=20(错误!
常量的值不能改变,常量不能重新赋值)。
系统常量:
Access系统内部包含有若干个启动时就建立的系统常量,有True、False、Yes、No、On、Off、Null等
查看方法:
数据库下“视图”菜单“对象浏览器”
内部常量:
主要作为DoCmd命令语句中的参数,以前缀ac开头,如acCmdSaveAs
查看内部常量:
“对象浏览器”窗口——“工程/库”列表的Access项——“类”列表中选择“全局”
注:
在列表“成员”中选择一个常量后,它的数值将出现在“对象浏览器”窗口的底部,能将这些内部常量的名字作为用户自定义常量或变量的名字。
5、常用标准函数
常用标准函数:
(系统提供的函数,可以直接使用)
使用形式如下:
函数名(〈参数1〉〈,参数2〉[,参数3][,参数4]…)
参数可以是常量、变量或表达式,可以有一个或多个,少数函数为无参函数
常用标准函数的使用
1)算数函数
Abs(<表达式>)求绝对值
Int(<数值表达式>)向下取整
Fix(<数值表达式>)取整(大于参数值的第一个负数)
Round(<数值表达式>,[,<表达式>])四舍五入
Sqr(<数值表达式>)开平方根
Rnd(<数值表达式>)产生[0,1)之间的随机数(单精度型)(表达式值小于0则每次产生相同的随机数,表达式值大于0则每次产生新的随机数,如果表达式值等于0则每次产生最近生成的随机数,默认是大于0)
Int(101*Rnd)[0,101)
注:
(1)正数:
Int和Fix没有区别,都是取"整数部分"
(2)负数:
Int和Fix有区别
Int是求"小于或等于"它的数,Fix是求"大于或等于"它的数。
Int(a)<=a<=Fix(a)(前提:
a<0,负数)
2)字符串函数(P214)
(1)字符串检索函数InStr(Str1,Str2)
检索子字符串Str2在字符串Str1中最早出现的位置,返回一整数值
MsgBoxInStr(1,"abcABC","A",1),vbInformation,"求子串的位置"
(1)InStr(1,"abcABC","A",1):
从"abcABC"中第1个字符开始求"A"在长串中第一次出现的位置。
(2)InStr(2,"abcABC","A",1):
从"abcABC"中第2个字符开始求"A"在长串中第一次出现的位置。
1表示不区分大小写字母,A和a可以看成一个字符。
(3)InStr(1,"abcABC","A",0):
从"abcABC"中第1个字符开始求"A"在长串中第一次出现的位置。
0表示区分大小写字母,A和a不可以看成一个字符
(2)字符串长度检测函数Len(<字符串表达式>或<变量名>)
(3)字符串截取函数Left()Right()Mid()
(4)生成空字符串函数Space(<数值表达式>)
返回数值表达式的值指定的空格字符数
(5)大小写转换函数
Ucase(<字符串表达式>)所有的字母变成大写字母
Lcase(<字符串表达式>)所有的字母变成小写字母。
(6)删除空格函数
LTrim(<字符串表达式>)去掉“前面(左边)”的空格。
RTrim(<字符串表达式>)去掉“后面(右边)”的空格
Trim(<字符串表达式>)去掉“前面和后面”的空格
注:
字符串中间的空格是不能去掉
3)日期/时间函数
(1)获取系统日期和时间函数Date()Time()Now()
(2)截取日期函数Year()Month()Day()WeekDay():
一定要注意它们都是要带参数的,参数都是Date()
(3)截取时间函数Hour()Minute()Second()
一定要注意它们都是要带参数的,参数是Time()
(4)日期/时间增加或减少一个时间间隔DateAdd(),第三个参数是Date
格式:
DateAdd(<间隔类型>,<间隔值>,<表达式>)
======DateAdd("格式",增加的值,日期/时间)
对表达式表示的日期按照间隔类型加上或减去指定的时间间隔值
注:
间隔类型参数值表示时间间隔,为一个字符串;
间隔参数值表示时间间隔的数目,正即未来,负为过去
(5)计算两个日期的间隔数目DateDiff()
格式:
DateDiff(<间隔类型>,<日期1>,<日期2>[W1][,W2])
====DateDiff("格式",日期/时间,日期/时间)
返回日期1和2之间按间隔类型指定的时间间隔数目
例题:
求一个人在世界活了多少天。
MsgBoxDateDiff("d",#2/14/19869:
30:
54PM#,Date)
MsgBoxDateDiff("d",Date,#4/7/2007#)
(6)返回日期指定时间部分函数DatePart()
举例:
D=#2005-7-1510:
25:
36#
N1=DatePart(“yyyy”,D)
N2=DatePart(“d”,D)
N3=DatePart(“ww”,D)
(7)返回包含指定年月日的日期函数D