Access_CH07_VBA与模块
Access_CH07_VBA与模块
本章目标
- VBA与模块概述
- 面向对象程序设计
- VBA编程基础
- 程序语句
- 数组
- 创建模块
- 数据库对象与ADO的使用
- VBA程序调试
VBA与模块概述
在设计数据库应用系统的一些特殊功能时,需要用“模块”对象来实现,这些‘模块“都是用VBA语言来创建的。
VBA简介
VBA(Visual Basic for Application)是Microsoft Office系列软件的内置编程语言,它使得在Microsoft Office系列软件中开发应用程序更加容易,并且可以完成特殊的、复杂的操作。在Access中,当某些操作不能用Access其他对象完成,或实现起来比较困难的时,就可以利用VBA语言编写代码,完成这些复杂任务
VBA与Visual Studio系列中的VB(Visual Basic)编程语言很相似,包括各种主要的语法结构,函数命令等,二者都来源于同一种编程语言BASIC。VBA与VB所包含的对象集是相同的,也就是说,对于VB所支持对象的多数属性和方法,VBA也同样支持。但二者并非完全一致,在许多语法和功能上有所不同,VBA从VB中获得了主要的语法结构,另外又提供了很多VB中没有的函数和对象,这些函数和对象都是针对Office应用的,以增强Word,Excel等软件的自动化能力。
VBA与VB的最大不同之处是,VBA不能在一个环境中独立运行,也不能使用它创建独立的应用程序,也就是说VBA需要宿主应用程序支持它的功能特性。宿主应用程序,诸如Word,Excel或Access,能够为VBA变成提供集成开发环境。
在Access中,用VBA语言编写的代码,将保存在一个模块里,并通过类似在窗体中触发宏那样来启动这个模块,从而实现响应的功能。
模块与宏的使用方法基本相同。在Access中,宏也可以存储为模块,宏的每个基本操作在VBA中都有响应的等效语句,使用这些语句就可以实现所有单独的宏命令,所以VBA的功能是非常强大的。要用Access来开发一个实用的数据库应用系统,就应该掌握VBA。
模块简介
模块是Access对象之一,起着存放用户为实现某些操作而编写的VBA代码的作用,模块中的代码以过程的形式加以组织。模块是将VBA声明和过程作为一个单元进行保存的集合。
在Access中,模块有类模块和标准模块两类。
1、类模块
类模块是可以包含新对象的定义的模块,一个类的每个实例都新建一个对象。在模块中定义的过程为该对象的属性和方法。Access中的类模块可以独立存在,也可以与窗体和报表同时出现。所以,可以将类模块分为以下三类:
(1)自定义类模块:用这类模块能创建自定义对象,可以为这些对象定义属性、方法和事件,也可以用New关键字创建窗体对象的示例
(2)窗体类模块:该模块中包含在指定的窗体或其控件上事件发生时触发的所有事件过程的代码。这些过程用于响应窗体的事件,实现窗体的行为动作,从而完成用户的操作
(3)报表类模块:该模块中包含在指定报表或其控件上发生的事件触发的所有事件过程的代码
窗体和报表模块都各自与某一窗体或报表相关联。在为窗体或报表创建第一个事件过程时,Access将自动创建与之关联的窗体或报表模块
2、标准模块
标准模块一般用于存放公共过程(函数过程和子过程)和公共变量,不与其他Access对象相关联。
在标准模块中,通常为整个应用系统设置全局变量或通用过程,供其他窗体或报表等数据库对象在类模块中使用或调用。反过来,在标准模块的子过程中,也可以调用窗体或运行宏等数据库对象
VBA编程环境
Access系列为VBA提供了一个编程开发环境VEB(Visual Basic Editor)。VBE以VB编程环境的布局为基础的,在VBE下,可编写程序、创建模块
1、进入VBE窗口
Access模块分为类模块和标准模块两种,它们进入VBA编程环境的方式也有所不同。
(1)类模块。以窗体为例,首先进入窗体设计视图,选定需要对之编写事件代码的控件,例如,选定某个命令按钮,打开该控件的“属性表”窗格
选择“事件”选项卡中某个事件,例如“单击”,单击该栏右侧的“选择生成器”按钮,打开“选择生成器”对话框
在“选择生成器”对话框中,选中“代码生成器”选项,单击确定按钮,即可打开VBE窗口
或者是单击“创建”选项卡“宏与代码”组的“Visual Basic”按钮,也可以进入VBE窗口
(2)标准模块。对于标准模块,常用的进入VBE的方法有如下两种:
一、创建新的标准模块。单击“创建”选项卡“宏与代码”组的“模块”按钮,即可启动VBE编辑窗口,并创建一个空白模块。
二、编辑已有的标准模块。在导航窗格中右击要编辑的模块对象,在弹出的快捷菜单中选择“设计视图”命令,就可以启动VBE,并使得VBE代码窗口中显示被选中的模块对象包含程序代码。在导航窗格中,直接双击要编辑的模块对象,也可以启动VBE。
2、VBE窗口组成
VBE编辑窗口中,主要包含标准工具栏、工程窗口、属性窗口和代码窗口等。
(1)标准工具栏。标准工具栏如下图所示,鼠标指向某个按钮,就会显示该按钮的名称
一、“视图Microsoft Office Access”按钮:切换到Access窗口,按Alt+F11组合键可在VBE窗口和数据库窗口间切换。
二、“插入模块”按钮:用于插入新模块对象。只要单击此按钮,系统将自动新建另一模块对象,并置新模块对象为当前操作目标。
三、“运行宏”按钮:运行模块中的程序。如果光标在过程中,则运行当前过程;如果用户窗体处于激活状态,则运行用户窗体;否则将运行宏。
四、“中断“按钮:中断正在运行的程序。
五、“重新设置”按钮:结束正在运行的程序。
六、“设计模式”按钮:在设计模式与非设计模式之间切换。
七、“工程资源管理器”按钮:打开工程资源管理器窗口。
八、“属性窗口”按钮:打开属性窗口。
九、“对象浏览器”按钮:打开对象浏览器窗口
VBE使用多种窗体来显示不同对象或是完成不同任务,如代码窗口、属性窗口、工程资源管理器窗口、对象浏览器窗口、立即窗口和监视窗口等。通过VBE窗口的“视图”菜单可以打开各种窗口
(2)工程资源管理器窗口。工程资源管理器窗口又称为工程窗口,一个数据库应用系统就是一个工程,系统中的所有类模块对象及标准模块对象都在该窗口中显示出来。工程资源管理器窗口的列表框列出了在应用程序中用到的模块,双击其中的某个模块,相应的代码窗口就会显示出来。
工程资源管理器窗口中包含3个工具栏按钮,功能如下:
一、“查看代码”按钮:显示代码窗口,用来编辑所选工程目标代码
二、“查看对象”按钮:打开响应对象窗口,可以是文档或是用户窗体的对象窗口
三、“切换文件夹”按钮:显示或隐藏对象分类文件夹
(3)属性窗口。属性窗口列出了选定对象的属性,可以在设计时查看、改变这些属性。当选取了多个控件时,属性窗口会列出所有控件的共同属性。
属性窗口的窗口部件主要有对象下拉列表和属性列表框
对象下拉列表用于列出当前所选的对象,但只能列出当前窗体中的对象。如果选取了多个对象则会以第一个对象为准,列出各对象均具有的共同属性
属性列表框可以按分类或字母对象属性进行排序。
一、“按字母序”选项卡:按字母顺序列出了所选对象的所有属性以及其当前设置,这些属性和设置可以在设计时改变。若要改变属性的设置,可以选定属性名,然后在其右侧文本框中输入新值或直接在其中选取新的设置
二、“按分类序”选项卡:根据兴致、类型列出所选对象的所有属性。
(4)代码窗口。代码窗口用来显示、编写以及修改VBA代码。实际操作中,可以打开多个代码窗口,查看不同窗体或模块中的代码,代码窗口之间可以进行复制和粘贴
“代码窗口”主要有对象下拉列表、过程下拉类别、代码框等组成
一、对象下拉列表:显示对象的名称。单击下拉列表中的下拉箭头,可查看或选择其中的对象,对象名称为建立Access对象或控件时的命名
二、过程下拉列表:在对象下拉列表中选择了一个对象后,该对象相关的时间会在过程下拉列表中显示出来,可以根据应用的需要设置相应的事件过程
1 | Click:单击时 |
三、代码块:输入程序代码
四、过程视图:只显示所选的一个过程
五、全模块视图:显示模块中全部过程
VBA编程方法
VBA提供面向对象的设计功能和可视化编程环境。编写程序的目的就是通过计算机执行程序解决实际问题。下面通过实例说明VBA程序设计的方法及步骤。
例如:新建下列图上的窗体。点击“显示”按钮,窗体的标题显示为“welcome to you!”,文本框中显示“欢迎您学习VBA编程”(演示为红色,字号为20磅);单击“清除”按钮,清空文本框
(1)创建一个空白窗体,添加一个文本框,删除掉文本框的标签,并给文本框设置一个简单的名字(方便调用)
(2)添加两个按钮控件,将名称改为简单一点的,将标题更改为“显示”和“清除”
(3)窗口设置好了之后,要选择按钮,通过“事件“进入到VBA窗口,点击”显示“按钮,打开”属性表“,切换到”事件”选项卡,点击“单击”旁边的按钮,弹出选择生成器,选择“代码生成器”,进入VBA窗口
(4)刚刚说到的需求,要求点击“显示”按钮,将窗体标题更改为“Welcome to you”,然后文本框里面的内容为“欢迎你学习VBA编程”,并且颜色为红色,字号为20磅,那么需要插入以下代码:
1 | Me.Caption="Welcome to you!" //设置窗体的标题 |
(5)在“对象下拉列表中”选择第二个按钮cmd2,同样是Click方法,输入以下代码:
1 | Text0.SetFocus //文本框得到焦点 |
(6)运行程序,保存并关闭VBA窗口,进入窗体的窗体视图,运行查看
面向对象程序设计
Access内嵌的VBA,不仅功能强大,而且采用目前主流的面向对象程序设计机制和可视化编程环境,其核心由对象及响应各种事件的代码组成
面向对象程序设计概述
面向对象程序设计(OOP,Object Oriented Programming),不仅是一种程序设计方法,更多意义上是指一种程序开发方式。它将对象作为程序的基本单元,将数据和对数据的操作封装其中,以提高软件的重用性、灵活性和扩展性
面向对象是观察世界和编写计算机程序的自然方式。面向对象变成使人们的变成与实际的世界更加接近,所有的对象被赋予属性和方法,从而变成就更加富有人性化,变成的结构更加清晰完整,数据更加独立和易于管理
对象和类
1、对象
客观世界的任何实体都可以被看做是对象(Object)。对象可以是具体的事物,也可以是某些概念,例如,一辆汽车、一名学生、一个窗体、一个命令按钮都可以作为对象。每个对象都具有描述它的特征的属性,及附属于它的行为。对象把事物的属性和行为封装在一起,是一个动态的概念。
在Access中,除表、查询、窗体、报表、宏和模块等对象外,还可以在VBA中使用一些范围更广泛的对象,例如,记录集对象、DoCmd对象等
2、类
所谓类(Class),就是一组对象的属性和行为特征的抽象描述。或者,类是具有共同属性、共同操作性质的对象的集合。类就像是一个模板,是对象的抽象。对象是由类创建的,是类的一个示例。类定义了对象的属性、事件和方法,从而决定了对象的属性和它的行为。例如:汽车是一个类,它有颜色、车轮、车门、发动机等特征,而具体到某辆汽车就是一个对象了,例如:车牌子为粤A123456的黑色红旗轿车
对象的组成要素
对象有属性、事件和方法三个要素组成
1.对象的属性
对象的属性用于描述对象的特征。例如,一个文本框的名称、颜色、字体、是否可见等属性,决定了该对象展现给用户的外观及功能。
对象的属性设置可以通过属性窗口设置,即在设计阶段设置属性,也可以在程序中通过代码来实现,即在运行期间设置属性,其格式如下:
1 | 对象名.属性=属性值 |
例如:将标签L1的Caption属性复制为字符串“欢迎您”,其在程序代码中的书写形式为:
1 | L1.Caption="欢迎您" |
2.对象的事件
VBA是采用时间驱动编程机制的语言。开发的程序以时间驱动方式运行,整个应用程序是由彼此独立的时间过程构成的。每个对象都能响应多个不同的事件,这些时间可以是用户对鼠标和键盘的操作,也可以由系统内部通过时钟计时产生,甚至由程序运行或窗口操作触发产生,因此,他们产生的次序是无法事先预测的。
(1)事件。事件是指发生在某一对象的事情。例如,在命令按钮这一对象可能发生鼠标单击(Click),鼠标移动(Mouse Move)、鼠标按下(Mouse Down)等鼠标事件,也可能发生键盘按下(Key Down)等键盘事件
(2)事件过程。当在对象上发生了事件后,应用程序就要处理这个事件,而处理的步骤就是事件过程。VBA的主要工作就是为对象编写事件过程中的程序代码。一个事件过程的代码结构一般如下:
1 | Sub 对象名_事件名称() |
一个对象的事件过程将对象的实际名称(在Name属性中规定的)、下划线(_)和事件名组合起来。例如,如果希望单击名为Cm1的命令按钮,会执行一些操作,也要使用Cm1_Click事件过程
3.对象的方法
对象的方法是指对象的行为方式,即对象能执行的操作,对象的方法调用格式如下:
1 | 对象.方法[参数列表] |
其中,要调用的方法不具有参数时,参数列表可以省略。
例如,将光标置于文本框Text0中:
1 | Text0.Setfocus |
VBA编程基础
VBA应用程序包括两个主要部分,用户界面和程序代码。其中,用户界面由窗体和控件组成,而程序代码由基本的程序元素组成,包括数据类型、常量、变量、函数、运算符和表达式等。
数据类型
在数据库中创建表对象时,已经使用过了字段类型。Access表中的字段使用的数据(OLE对象、附件等除外)在VBA中都有对应的类型。由VBA系统定义的基本数据类型共有11种,每一种数据类型所使用的的关键字、占用的存储空间和数值范围是各不相同的。如下
数据类型 | 关键字 | 说明符 | 存储空间 | 取值范围 |
---|---|---|---|---|
字节型 | Byte | 无 | 1 | 0~255 |
整型 | Integer | % | 2 | -32768~32767 |
长整型 | Long | & | 4 | -2147483648~2147483647 |
单精度型 | Single | ! | 4 | 正值范围:1.401298E-45 负值范围:-3.402823E38 |
双精度型 | Double | # | 8 | 正值范围:4.9406564581247E-324 负值范围:-1.79769313486232E308 |
货币型 | Currency | @ | 8 | -922337203685477.5808~922337203685477.5807 |
字符型 | String | $ | 与字符串长度有关 | 0~65535个字符 |
逻辑型(布尔型) | Boolean | 无 | 2 | True与False |
日期型 | Date | 无 | 8 | 100年1月1日~9999年12月31日 |
对象型 | Object | 无 | 4 | 任何引用对象 |
实体型 | Variant | 无 | 数据定义 |
除了上述系统提供的基本数据类型外,VBA还支持用户自定义数据类型。自定义数据类型实质上是由基本数据类型构造而成的一种数据类型,可以根据需要来定义一个或多个自定义数据类型
常量
常量是指在程序运行的过程中,其值不能被改变的量。在Access中,VBA的常量包括直接常量、符号常量、固有常量和系统定义常量4种
1、直接常量
直接常量通常指的是数值或字符串常量。数值常量由数字组成,表示具体的数值,如23876.字符串常量由定界符(引号)将字符括起来,如“abc”。
2、符号常量
对于一个具有特定意义的数字或字符串,或在程序中需要反复使用的相同值,可以用符号常量来代表。一般用Const语句来说明符号常量
例如:
1 | Const cPI=3.14159 |
定义符号常量cPI,其值为3.14159,在以后的程序中,可以使用cPI来代替常用的π值参加运算
3、固有常量
固有常量是Access或VBA的一部分,是在Access或VBA的类库中定义的。
Access或VBA包含了许多预定义的固有常量。固有常量使用两个字母的前缀,表示该常量所在的对象库。来自Access库的常量以ac开头,来自ADO库的常量以ad开头,来自Visual Basic库的常量则以vb开头,如acForm、adAddNew、vbCurrency。
所有的固有常量都包含在类库中,只有在模块中引用了常量,被引用的常量才能装到内存中。要查看这些常量可以使用Access中的对象浏览器
4、系统定义常量
系统定义常量由3个:True、False和Null,系统定义常量可以在所有应用程序中说明
变量
计算机在处理数据时,必须要讲其存储在内存中。在高级语言如VB中,可将存放数据的内存单元命名,通过内存单元的标识名来访问其中的数据,一个有名称的内存单元就是变量。与常量不同,变量的值在程序运行过程中是可以改变的。
每个变量都有一个名称和相对于的数据类型,通过名称来引用一个变量,数据类型决定了该变量的存储方式
1、变量的命名规则
变量代表在程序执行过程中其值可以改变的存储单元,这个存储单元的名称成为变量名。VBA变量名的命名规则如下:
(1)以字母或汉字开头,后可跟字母、数字或下划线,长度不能超过255个字符
(2)不能使用VBA中的关键字,不能包含空格、@、$、&、*、!等字符
(3)VBA语言中不区分变量名的大小写,如abc,aBC,ABC等指的是同一个变量名
为了增加程序的可读性,可在变量名前加一个数据类型缩写的前缀来表明该变量的数据类型。如strAbc(字符型变量)、iCount(整型变量)、dblx(双精度型变量)等
2、变量的声明
任何变量都属于一定的数据类型,包括基本数据类型和用户自定义的数据类型。声明变量就是用一个语句来定义变量的类型。声明变量的语句并不把值分配给变量,而是告知变量将存放在什么类型的数据,以便系统为它分配存储单元。在VBA中,声明变量分为隐式声明和显示声明两种。
(1)隐式声明:隐式声明变量是指不经过特别声明就直接使用变量,这时变量类型被默认为Variant型(变体型)。隐式声明虽然方便,但它可能会在程序代码中导致严重的错误,而且Variant型比其他数据类型所占的内存要多。
(2)显式声明:显示声明变量是指使用变量前先进行声明。可以使用Dim语句声明变量,其格式如下:
1 | Dim 变量名 [As 数据类型] |
如果不使用”As 数据类型“选项,默认定义的变量是Variant型。也可在变量名后加类型符来代替”As 数据类型“,此时变量名与类型符之间不能有空格。如下面的两个声明语句是等价的:
1 | Dim x As Integer |
一条Dim语句可以同时定义多个变量,但每个变量必须有自己的类型声明,类型声明不能共用。例如:
1 | Dim y1 As Integer,y2 As Integer,y3 As Single |
前一条语句分别创建了整型变量y1、y2和单精度型变量y3,而后一条语句则创建了Variant型变量y1和整型变量y2.
对于字符串类型变量,根据其存放的字符串长度是否固定,可定义为定长型或变长型。若定义定长型字符串变量,存放的最多字符数有*号后面的数据决定,多余部分截去。例如:
1 | Dim s1 As String |
前一条语句声明变长型字符串变量s1,后一条语句声明可存放50个字符的定长型字符串变量s2。
如果要求在使用变量前必须先声明该变量,则应在模块的通用声明位置包含语句:
1 | Option Explicit |
运算符与表达式
程序中对数据的操作,其本质是指对数据的各种运算。描述各种不同运算的符号成为运算符。被运算的对象,如常量、变量、函数等成为操作数。VBA中的运算符可分为算术运算符、字符串运算符、关系运算符和逻辑运算符。用运算符将常量、变量或函数连接起来的有意义的式子成为表达式,表达式按其所含运算符和运算对象的不同,可分为算数表达式、关系表达式、字符串表达式和逻辑表达式等。
1、算术表达式
算术运算符用来对数值型数据进行算术运算。VBA提供的算术运算符如下表所示
运算符 | 含义 | 优先级 | 表达式举例 | 运算结果 | 说明 |
---|---|---|---|---|---|
^ | 乘方 | 1 | y^3 | 27 | y^3是y的三次方 |
- | 负号 | 2 | -y | -3 | |
* | 乘 | 3 | y* y * 2 | 18 | |
/ | 除 | 3 | 10/y | 3.333333 | 标准除法运算,其结果为浮点数 |
\ | 整除 | 4 | 10\y | 3 | 结果取商的整数部分 |
Mod | 取模 | 5 | 10 mod y | 1 | 结果是两个数相处得到的余数 |
+ | 加 | 6 | 10+y | 13 | |
- | 减 | 6 | 10-3 | 7 |
举例说明:
(1)算术运算符两边的操作数要求是数值型,若是数字字符或逻辑型,则自动转换成数值型后再做响应的运算。例如:
1 | 10-True //运算结果为11,逻辑值True转换为数值-1,False转换为0 |
(2)整除运算符“\“和取模运算符Mod一般要求操作数为整数,当操作数中带有小数时,Visual Basic会自动将操作数四舍五入为整数后再进行运算。例如:
1 | 5^2 Mod 5^2\6.45 //运算结果为1 |
2、字符串运算符
字符串运算符有两个:&和+,它们的作用是将两个字符串连接起来。两者 的主要区别如下:
+:运算符两边的操作数都是字符型时,则进行字符串连接运算;同为数值型时,则进行算术加法运算;如果有一个为非数字字符而另一个为数值型,则计算结果出错。
&:运算符两边的操作数无论是什么类型都要先转换为字符型,然后进行连接运算。
如下表列出了&和+运算符的表达式举例,当操作数数据类型不同时,表达式的结果也不相同
操作数a | 操作数b | a+b的结果 | a&b的结果 |
---|---|---|---|
“100” | “200” | “100200” | “100200” |
100 | 200 | 300 | “100200” |
“100” | 200 | 300 | “100200” |
“abc” | “200” | “abc200” | “abc200” |
“abc” | 200 | 出错 | ”abc200“ |
3、关系运算符
关系运算符都是双目运算,是用来比较两个操作数的大小的。关系表达式的运算结果为逻辑值。若关系成立,结果为True;若关系不成立,结果为False。下方表列出了VBA中的关系运算符。
运算符 | 含义 | 表达式举例 | 运算结果 |
---|---|---|---|
= | 等于 | “abc”=“abd” | False |
> | 大于 | “abc”>”abd” | False |
>= | 大于等于 | “abc”>=“计算机” | False |
< | 小于 | 6<(3+4) | False |
<= | 小于等于 | “123”<=”abc” | True |
<> | 不等于 | “abc”<>”abd” | True |
Like | 字符串匹配 | “abc” Like “* abc *“ | True |
关系运算符在比较时遵循如下规则:
(1)如果两个操作数都是数值型,则按数值大小进行比较。
(2)如果两个操作数都是字符型,则字符的ASCII码值从左往右诸一进行比较,知道出现不同的字符为止,ASCII码值打的那个操作数大。例如:“ABCDE”>”ABRA”,结果为False。
1 | 常见字符的ASCII码值如下:空格的ASCII码值为32;数字0到9的ASCII码值分别为48到57;大写字母“A”到“Z”的ASCII码值分别为65到90;小写字母“a”到“z”的ASCII码值分别为97到到122。 |
(3)汉字字符大于西文字符。
(4)Like关系运算符可以与通配符结合使用,用于实现模糊查询
(5)所有关系运算符的优先级相同
4、逻辑运算符
逻辑运算符的作用是对操作数进行逻辑运算,操作数可以是逻辑值True或False,也可以是关系表达式,运算结果是True或False。逻辑运算符除了Not是单目运算符外,其余都是双目运算符。VBA中的逻辑运算符有6种,如下表所示:
运算符 | 含义 | 优先级 | 表达式举例 | 运算结果 | 说明 |
---|---|---|---|---|---|
Not | 取反 | 1 | Not(“a”>“b“) | True | 当操作数为假时,结果为真;当操作数为真时,结果为假 |
And | 与 | 2 | (5>=3) And (9>5) | True | 两个操作数都为真时,结果才为真 |
Or | 或 | 3 | (4=5)Or(4<>5) | True | 两个操作数中有一个为真时,结果为真。两个操作数都为假时,结果才为假 |
Xor | 异或 | 4 | (8=7)Xor(10>7) | True | 两个操作数一真一假时,结果才为真,否则为假 |
Eqv | 等价 | 5 | (12>8)Eqv(“c“>”d”) | False | 两个操作数的值相同,结果才为真 |
Imp | 蕴涵 | 6 | (10=10)Imp(12>22) | False | 第1个操作数为真,第2个操作数为假时,结果才为假,否则为真 |
5、表达式
表达式是指由常量、变量、函数、运算符及圆括号按一定的规则组成的式子。表达式通过运算后返回一个结果,运算结果的类型由操作数和运算符共同决定。
书写表达式必须遵循一定的规则,否则系统将无法识别
(1)表达式的书写规则如下:
一、运算符不能相邻。例如,a+*b是错误的
二、在一个表达式中出现的括号应全部是圆括号,且必须配对使用
三、表达式从左往右在同一基准并排书写,不能出现上、下标,如x的2次方应该写成x^2
(2)运算符优先级。当一个表达式中出现了多种不同类型的运算符时候,到底先做哪个后做哪个,这在VBA中是有规定的。在一个表达式中,运算的先后顺序取决于运算符的优先级,即优先级高的先做,优先级低的后做,如果两个运算符的优先级一样,则按照从左到右的顺序进行。各种运算符的优先级在VBA中规定如下:
一、优先级由高到低的顺序:算术运算符>字符串运算符>关系运算符>逻辑运算符
二、圆括号的优先级最高,因此允许用添加圆括号的方法来改变运算符的执行顺序,且能使优先级和表达式更清晰
常用的内置函数
在程序设计语言中,函数是具有特定运算、能完成特定功能的模块。例如,求一个数的平方根、正弦值等。在程序中要使用一个函数时,只要给出函数名及参数,就能得到它的函数值。VBA提供了大量的内置函数(也称标准函数)供用户在编程时调用。内置函数按其功能可分为数学函数、转换函数、字符串函数、日期函数和输入输出函数等。
1、数学函数
数学函数与数学中的定义一样,用于完成一些基本的数学运算,包括三角函数、求平方根、绝对值及对数、指数函数等。其中一些函数的名称和数学中的相应函数的名称相同。如下方表中列出了常用的数学函数,其中参数N、N1和N2为有效的数值表达式
函数名 | 含义 | 实例 | 结果 |
---|---|---|---|
Abs(N) | 取绝对值 | Abs(-3.5) | 3.5 |
Sin(N) | 正弦函数 | Sin(0) | 0 |
Cos(N) | 余弦函数 | Cos(0) | 1 |
Tan(N) | 正切函数 | Tan(0) | 0 |
Atn(N) | 返回用弧度表示的反正切值 | Atn(1) | 0.785398163397448 |
Exp(N) | 以e为底的指数函数,即e的N次方 | Exp(3) | 20.0855369231877 |
Log(N) | 以e为底N的自然对数 | Log(10) | 2.30258509299405 |
Rnd[(N)] | 产生大于等于0小于1的随机数 | Rnd | 0~1之间的随机数 |
Sgn(N) | 符号函数 | Sgn(-3.5) | -1 |
Sqr(N) | 平方根 | Sqr(9) | 3 |
Fix(N) | 取整 | Fix(-3.5) | -3 |
Int(N) | 取小于或等于N的最大整数 | Int(-3.5) Int(3.5) |
-4 3 |
Round(N1[,N2] | 四舍五入(若省略N2则取整) | Round(88.48,1) Round(88.43) |
88.5 88 |
说明:
(1)在三角函数中,参数均以弧度值为单位,而不是以度为单位,因此在已知度数求某个三角函数值的时候,需要首先将度数转换为弧度然后再计算。
(2)Rnd(N)函数用于产生一个位于区间[0,1]内的随机双精度数,这里的参数N称为随机数种子,它的值决定了Rnd生成随机数的方式。在Rnd函数中如果省略参数N,默认参数是大于0的。
一、N<0:每次都以N作为随机数的种子,得到相同的结果
二、N>0:每次产生一个新的随机数
三、N=0:产生与最近随机数相同的数,且生成的随机数序列相同
假设A和B是两个正整数,同时A<=B,要产生[A,B]之间的随机整数,可以使用以下公式:
1 | Int(Rnd * (B-A+1))+A |
例如,产生位于[100,300]之间的随机整数的表达式如下:
1 | Int(Rnd * 201)+100 |
(3)在使用随机数生产函数Rnd之前,需要对随机数发生器进行初始化,以便产生不同的随机数,在VBA中使用Randomize语句来初始化,以便产生不同的随机数,在VBA中使用Randomize语句来初始化,该语句的使用格式如下:
Randomize[数值表达式]
例如:
1 | Randomize Timer //通过Timer函数返回的秒数来充当随机数种子 |
2、字符串函数
字符串函数用来完成对字符串的一些基本操作和处理,如:求字符串的长度、截取字符串的子串、去掉字符串的空格等,VBA提供了大量的字符串函数,具有很强的字符处理能力,下面表中列出了常用的字符串函数。其中参数N、N1和N2为有效的数值表达式,C、C1和C2为字符表达式
函数名 | 含义 | 实例 | 结果 |
---|---|---|---|
Ltrim(C) | 去掉字符串左边的空格 | LTrim(“ ABCD”) | “ABCD” |
Rtrim(C) | 去掉字符串右边的空格 | RTrim(“ABCD ”) | “ABCD” |
Trim(C) | 去掉字符串两边的空格 | Trim(“ ABCD ”) | “ABCD” |
Left(C,N) | 取字符串左边开始N个字符 | Left(“ssssaaaa”,4) | ”ssss“ |
Right(C,N) | 取字符串右边开始N个字符 | Right(“ssssaaaa”,4) | “aaaa“ |
Mid(C,N1[,N2]) | 返回从起始位置N1开始的N2个字符 | Mid(”ABCD“,2,3) | ”BCD“ |
Len(C) | 返回字符串的长度 | Len(”水电出版社“) | 5 |
LenB(C) | 返回字符串所占的字节数 | Len(”水电出版社“) | 10 |
Space(N) | 返回N个空格的字符串 | Space(5) | ” “ |
InStr(C1,C2) | 返回字符串C2在C1中首次出现的位置,不存在则为0 | InStr(”ABCDEFG“,”EF“) | 5 |
String(N,C) | 返回由C中N个首字符组成的字符串 | String(5,”abc“) | “aaaaa” |
Lcase(C) | 大写字母转换为小写字母 | Lcase(“Abc”) | “abc” |
Ucase | 小写字母转换为大些字母 | Ucase(“Abc”) | “ABC” |
3、转换函数
在VBA编程中,经常要进行数据类型的转换,如将十进制转换为十六进制、将字符型转换为对应的ASCII码。常用的转换函数如下表。其中参数N为数值表达式,C为字符表达式
函数名 | 含义 | 实例 | 结果 |
---|---|---|---|
Asc(C) | 返回第一个字符的ASCII值 | Asc(“ab) | 97 |
Chr(N) | ASCII值转换为字符 | Chr(65) | ”A“ |
Val(C) | 数字字符串转换为数值 | Val(”23.56“) | 23.56 |
Str(N) | 数值转换为字符串 | Str(34.56) | ”34.56“ |
Hex(N) | 十进制转换为十六进制 | Hex(100) | 64 |
Oct(N) | 十进制转换成八进制 | Oct(100) | 144 |
4、日期函数
日期函数可以显示日期和时间,如求当前的系统时间,某一天是星期几等。常用的日期函数如下表所示,其中参数D、D1、D2均为日期表达式
函数名 | 含义 | 实例 | 结果 |
---|---|---|---|
Date( ) | 返回系统日期 | Date( ) | 现在的日期 |
Now( ) | 返回系统日期和时间 | Now( ) | 现在的日期和时间 |
Time( ) | 返回系统时间 | Time( ) | 现在的时间 |
Day( ) | 返回日期表达式的日期 | Day(#2021/12/25#) | 15 |
Month( ) | 返回日期表达式的月份 | Month(#2021/12/25#) | 12 |
Year( ) | 返回日期表达式的年份 | Year(#2021/12/25#) | 2021 |
Weekday( D) | 返回星期代号(1~7),星期日为1,星期一为2 | Weekday(#2021/12/25#) | 7 |
Hour(D) | 返回时间表达式的小时数 | Hour(#4:35:17PM#) | 16 |
Minute(D) | 返回时间表达式的分钟数 | Minute(#4:35:17PM#) | 35 |
Second(D) | 返回日期表达式的秒数 | Second(#4:35:17PM#) | 17 |
DateAdd(间隔目标,间隔值,D) | 对日期表达式按间隔目标加上指定的时间间隔数 | DateAdd(“yyyy”,5,#2021/12/25#) | 2026 |
DateDiff(间隔目标,D1,D2) | 按间隔时间计算D1和D2之间的时间间隔 | DateDiff(“d”,#2016/12/30#,#2017/01/01#) | 2 |
说明:函数DateAdd()和DateDiff()中的参数“间隔目标”有很多设定值,常用的有:yyyy为年、q为季度、m为月、d为日、ww为周、h为小时、n为分、s为秒
5、输入输出函数
在VBA中,除使用上述函数处理数据外,还可以使用用户交互函数显示信息及接收用户输入。用于显示输出信息的函数是MsgBox,接收用户输入数据的函数是InputBox。
(1)MsgBox函数
格式:
1 | MsgBox(提示[,按钮样式][,标题]) |
说明:
一、“提示”是必需的字符串表达式,其内容作为提示信息显示在对话框汇总,不输入提示语会报错
二、MsgBox可以作为一个语句使用,但要去掉函数名后面的括号
例如:
1 | MsgBox "欢迎您的光临" |
三、“按钮样式是可选整型表达式,用于指定显示按钮的数目和类型,及出现在消息框上的不挑,如果省略,则默认是为0
按钮样式为0:只显示1个“确定”按钮
1 | MsgBox "显示内容" |
按钮样式为1:显示2个按钮,”确定“和”取消“
1 | MsgBox "显示内容",1 |
按钮样式为2:显示3个按钮,“中止”,“重试”和“忽略”
1 | MsgBox "显示内容",2 |
按钮样式为3:显示3个按钮,“是”,“否”和“取消”
1 | MsgBox "显示内容",3 |
按钮样式为4:显示两个按钮,”是“和”否“
1 | MsgBox "显示内容",4 |
按钮样式为5:显示两个按钮,“重试”和“取消”
1 | MsgBox "显示内容",5 |
四、“标题“指定消息框中要显示的字符串,如果省略,则为应用程序名
格式:
1 | MsgBox "显示内容",3,"标题" |
(2)InputBox函数
格式:
1 | InputBox(提示[,标题][,默认值][,x坐标位置][,y坐标位置]) |
说明:
一、“提示”是必须的字符串表达式,其内容作为提示信息显示在对话框中。如果需要分多行显示,可以将回车符(Chr(13)或换行符(Ch(10))连接到提示字符串中。
1 | InputBox "请输入你的账号:" & Chr(13) & "我我我" |
二、“标题”是可选字符串表达式,其内容显示在对话框的标题处,省略时显示应用程序名。
1 | InputBox "请输入你的账号", "标题" |
三、“默认值”是可选字符串表达式。弹出对话框后,如果用户未输入而直接单击“确定”按钮或按Enter键,则函数返回指定的默认值。省略默认值时,返回空串
四、“x坐标位置,y坐标位置“是成对出现的,是可选的数值表达式。”x坐标位置“制定了对话框左边距屏幕左边的水平位置;”y坐标位置“指定了对话框上边距屏幕上边的距离
例如:
1 | Private Sub Form_Click() |
当单击窗体时,弹出下面的对话框,对话框的位置根据定义的坐标(500,720)出现
程序语句
程序是由语句组成的,语句是执行具体操作的指令,语句的组合决定了程序结构。VBA与其他计算机语言一样,也具有结构化程序设计的3种基本控制结构,即顺序结构、选择结构和循环结构。
程序语句的书写格式
程序语句是能够完成某项操作的一条完整命令,是构成程序的基本单元。程序是由大量的程序语句构成的,程序语句可以包含关键字、常量、变量、函数、运算符以及表达式。
同任何程序设计语言一样,VBA程序语句也有一定的书写规则,规定如下:
(1)不区分字母的大小写
在VBA程序语句中,不区分字母的大小写,但要求标点符号和括号等要用西文字符格式。
(2)语句书写规定
在同一行上可以书写多条语句,语句间用冒号“:”分割。一行允许多达255个字符,输入一行语句并按Enter键,VBA会自动进行语法检查,如果语句存在错误,该行代码以红色提示(或伴有错误信息提示)
(3)使用注释语句
通常,一个好的程序一般都有注释语句,这对程序的维护以及代码的共享都有重要意义。在VBA程序中,注释可以通过使用Rem语句或用单引号’实现,其中注释语句在程序执行过程中不会执行
1、使用Rem语句。Rem语句在程序中单独作为一行语句,Rem语句多用于注释其后的一段程序
1 | Rem 注释内容 |
2、使用西文单引号’。可使用单引号注释内容,用单引号注释可以直接出现在一行语句的后面
1 | '注释内容 |
结合使用,例如:定义变量并赋值
1 | Rem 定义两个变量 |
顺序结构
1、顺序结构
顺序结构是一种线性结构,也是程序设计中最简单、最常用的基本结构,主要用来实现赋值、计算和输入输出。其执行特征为:按照语句出现的先后顺序,依次执行。顺序结构的执行流程如图:
2、赋值语句
赋值语句是程序设计中最基本、最常用的语句,它的格式及功能如下。
格式一:Let是赋值运算语句,可以用赋值运算符”=”给变量或者属性赋值.(通常可以省略关键字).
1 | [Let] 变量名=表达式 |
格式二:
1 | [对象名.]属性名=表达式 |
功能:先计算赋值号“=”右边表达式的值,然后将计算出来的结果赋给赋值号左边的变量或属性。
说明:
(1)在赋值语句中,“=”是赋值号,在VBA中系统会根据“=”所处的位置自动地判断是赋值号还是等号
(2)赋值号左边只能是变量名或对象的属性名,不能是常量、符号常量或表达式。若对象名省略,则默认对象为当前窗体或报表
(3)变量名或对象属性名的类型应与表达式的类型相同,所谓相同也就是指赋值号左右两边的数据类型一致,或者右边表达式的值能够自动转换为左边变量或对象属性的类型。例如当表达式是数字字符串,变量为数字,系统自动转换为数值类型再复制,如果表达式含有非数字或空字符串时候,赋值出错
(4)变量未赋值时,数值型变量的值默认是0,字符串变量的默认值是空串“ “
(5)不能在一个赋值语句中,同时给多个变量赋值
(6)为了给一个对象的多个属性赋值,可以使用With语句,其格式如下:
1 | With 对象名 |
例如,Com1对象的标题为“确定”、字号为14磅、控件可用:
1 | With Com1 |
选择结构
程序中往往需要判断某个表达式,通过判断的结果转向执行不同的语句。选择结构就是根据对给定条件的判断,选择不同执行路径的程序结构。通常根据执行路径的分支数分为单分支选择结构、双分支选择结构和多分支选择结构。
1、If····Then语句(单分支结构)
格式一:
1 | If<表达式>Then |
格式二:
1 | If<表达式>Then <语句> |
功能:首先计算“表达式”的值,如果表达式的值为True,则执行“语句块”或“语句”。如果表达式的值为False,则不执行“语句块”或“语句”。如果表达式的值为False,则不执行“语句块”或“语句”,而是直接执行End If后面的语句,语句的执行流程如图:
说明:
(1)语句中的表达式通常用来表示条件,一般是关系表达式或逻辑表达式。
(2)语句块可以是一条或多条语句。若采用格式二的形式,Then后面薇一条语句,当有多条语句要执行时,语句之间要用冒号分割,并且所有语句必须位于同一行
2、If·····Then·····Else语句(双分支结构)
格式:
1 | If<表达式> Then |
功能:首先计算“表达式”的值,如果表达式的值为True,则执行“语句块1”,如果表达式的值为False,则执行语句块2。
说明:
IIf()函数也可以实现双分支结构,函数格式为如下:
1 | IIf(<条件表达式>,<条件表达式为True时的函数返回值>,<条件表达式为False时的函数返回值>) |
例如,“判断整数变量x的奇偶性”对于的If语句如下:
1 | If(x mod 2=0) Then |
“判断整型变量x的奇偶性”可以用IIF函数写成:
1 | Str=IIf(x mod 2=0,"该数是偶数","该数是奇数") |
3、If·····Then······Elself语句(多分支结构)
格式:
1 | If<表达式1> Then |
功能:首先计算表达式1的值,如果其值为true就执行“语句块1”,否则继续计算“表达式2”的值,如果“表达式2”的值为True,就执行“语句块2”,否则继续判断“表达式3“的值·······以此类推,直到找到值为True的表达式,并执行后面的语句。如果所有表达式的值都为False,有Else子句,则执行Else后面的”语句块n+1“,否则不执行在任何语句块。
说明:
(1)关键字ElseIf中不能有空格
(2)当有多个表达式同时为真时,直执行第一个与之匹配的语句块。因此,应注意多分支结构中表达式的次序。
例如,“判断某字符是大写字母、小写字母、数字还是其他符号”的代码如下:
1 | Rem ch 存放被判断的字符,chtype 存放判断的结构 |
4、If语句的嵌套
If语句的嵌套是指一个If语句的语句块中又完整地包含另一个If语句,If语句的嵌套形式可以有多种,其中最典型的嵌套形式如下。
格式:
1 | If<表达式1> Then |
说明:
(1)嵌套If语句应注意书写格式
(2)多个If语句嵌套,End If 从里到外与它最近的If配对
例如,“将三个整数x,y,z按从小到大顺序排列”的嵌套If语句如下:
1 | If score>90 Then |
5、Select Case语句
在VBA语言中要实现多分支,还可以通过专门的分支语言——Select Case语句来实现。Select Case语句的格式与功能如下。
格式:
1 | Select Case <表达式> |
功能:首先计算“表达式”的值,然后用表达式的值逐个与Case语句的“表达式列表”项进行匹配,如果表达式的值与某个“表达式列表”匹配成功,就执行该Case语句下的“语句块”,然后结束Select语句的执行。如果匹配不成功,就执行Case Else语句下的“语句块”,此时若省略了Case Else,则不执行任何语句块,而执行End Select后面的语句。如果有多个表达式匹配,则只执行第一个匹配的Case语句有关的语句块。
说明:
(1)Select Case后面的表达式可以是算术表达式或字符表达式。
(2)“表达式列表“与”表达式“类型必须相同,通常情况下是一个具体值,但也可以是下列三中形式之一。
一、用逗号隔开的枚举数据。例如,Case 2,4,6,8
二、<表达式1> to <表达式2> 例如,Case 10 to 100
三、Is关系运算符表达式。例如,Case Is>=30。
例如,“判断某字符是大写字母、小写字母、数字还是其中符号”的Select Case语句如下:
1 | Select Case Asc(ch) |
循环结构
顺序结构和选择结构中的每条语句,一般只执行一次,而在实际应用中,经常遇到一些操作并不复杂,但是需要反复多次处理的问题,即重复执行某一段程序。例如,计算k=n!,如果用顺序结构来处理十分麻烦,而使用循环结构则可以轻松实现。这种重复执行一组语句的结构成为循环结构。VBA支持两种类型的循环结构:For循环和Do····Loop循环。
1、For循环语句
For循环语句是计数型循环,用于控制循环次数已知的循环结构。
格式:
1 | For <循环变量>=<初值> To <终值> [Step<步长>] |
功能:首先把“初值”赋值”循环变量“,在用”循环变量“的值与”终值“比较,如果”循环变量“没有超过”终值“,则执行一次”循环体“,执行完循环后,将”循环变量+步长“的值赋给”循环变量“,再判断”循环变量“的值是否超过”终值“,如果没有超过”终值“,继续执行循环体······重复上述过程,直到“循环变量”的值超过“终值”才结束循环,然后接着循环Next后面的语句。
说明:
(1)“循环变量”,”初值“,”终值“和”步长“必须是数值型。如果步长为1,Step1可以省略
(2)“循环体”可以是一条或多条语句
(3)终止循环的条件是循环变量的值“超过”终值,而不是等于。所谓“超过”是指在变化方向上越过。若“步长”是正值,则“超过”的含义是大于;若“步长”是负值,则“超过”的含义是小于
(4)循环次数=Int(终值-初值/步长+1)
例如,求“1~100奇数的和”的For循环语句如下:
1 | Dim s As Integer,i As Integer |
2、Do·····Loop循环语句
Do····Loop循环语句是条件型循环,用于控制循环次数事先无法确定的循环结构,即可以实现当型循环,也可以实现直到型循环,是最通用、最灵活的循环结构。Do····Loop循环语句有以下两种语句格式。
格式一:
1 | Do[{While|Until} <条件表达式>] |
格式二:
1 | Do |
功能:格式一先判断条件后执行循环体,有可能一次循环体也不执行;格式二线执行循环体后判断条件,因此循环体至少会执行一次。
说明:
(1)选用关键字While时,为当型循环,当条件为True时就执行循环体,为False时退出循环体;选用关键字Until时,为直到型循环,当条件为False时就执行循环体,为True时退出循环体
(2)当省略While或Until条件子句时,循环结构为Do····Loop,表示无条件循环,此时,在循环体中应加入退出循环的Exit Do语句,否则将成为死循环
例如,“求1~100奇数的和“的两种Do····Loop循环语句如下:
Do While····Loop循环:
1 | s=0:i=1 |
Do···Loop while循环
1 | s=0:i=1 |
在循环体中应有使循环趋向于结束的语句,如i=i+2.否则,循环条件始终不发生改变,循环永远不会结束,成为死循环。
数组
在数据库应用中,经常需要处理同一类型的成批数据。如要统计一个班数据成绩的平均分、将随机生成的100个数从大到小排序等,这种处理成批数据的问题就需要通过数组来解决
数组的定义
数组并不是一种数据类型,而是一组具有相同类型的有序变量的集合。这些变量按照一定的规则排序,在内存中占据了一块连续的存储区域,数组名就是这块控件的名称。使用数组就是通过数组名来引用这一组变量中的数据。这些变量称为数组元素。数组必须先声明后使用。在VBA中不允许隐式声明数组,要用Dim语句来声明数组。数组定义格式如下:
1 | Dim 数组名(下标1[,下标2.....] [As 数据类型] |
说明:
(1)下标。下标的形式为”[下界 To 上界]”,既每个下标都有上界和下界,其中下标下界可以省略,下界省略时则默认下标下界为0,也可以通过在模块的通用声明部分使用Option Base语句来改变下界的默认值,例如,Option Base1 指定数组的默认下标下界为1,下标必须为常量,不可以为表达式或变量。
(2)数组的维数。根据数组的下标个数可分为一维数组、二维数组和多维数组等
(3)数据类型。与其他变量的声明一样,除非指定一个数据类型给数组,否则声明数组中的元素的数据类型为Variant型。为了尽可能使书写的代码简洁明了,应明确声明数组为某一种数据类型而非Variant型
综上看出,Dim语句声明的数组,实际上为系统提供了几种信息:数组名、数组类型、数组的位数和各维的大小。例如:
1 | Dim a(8) as Single '定义有9个元素的一维数组,默认下标下界为0 |
首先声明了一个一维数组a有9个单精度型数组元素,下标的范围为08,元素分别为a(0)、a(1)、······a(8);如在程序中使用a(9),则系统会提示“下标越界”。接着又声明了二维数组d,第一个下标的范围为02,第二个下标的范围为0~3,共有12个整型数组元素,元素分别为:d(0,0)、d(0,1)、d(0,2)、d(0,3)……………..
动态数组
上面提到的数组在定义时都给出了维数大小,此类数组为静态数组,即在程序运行过程中数组元素的个数不能发生变化。但在实际应用中,很多情况下,所需要的数组到底应该定义多大才合适是事先无法确定的,因此希望在运行程序时,根据具体情况改变数组的大小,动态数组就能有效地解决这样的问题。
动态数组是指在程序执行过程中数组元素的个数可以改变的数组。动态数组也称可变大小的数组。使用动态数组更加灵活、方便、并有助于高效管理内存。
动态数组的定义方法是:先使用Dim语句声明数组,但不指定数组下标,即数组元素的个数;以后使用时,再用ReDim语句指定数组元素个数。格式如下:
1 | ReDim[Preserve] 数组名 (下标1[,下标2····]) [As 数据类型] |
说明:
(1)在静态数组声明中的下标只能是常量,在动态数组声明ReDim语句中的下标可以是常量,也可以是有确定值的变量。“As 类型”可以省略,若不省略,必须与Dim声明语句保持一致
(2)Redim语句只能出现在过程中,是一个可执行的语句,在程序运行时执行,可以进行内存动态分配
(3)在过程中可以多次使用ReDim语句来改变数组的大小,也可以改变数组的维数
(4)每执行一次Redim语句,当前数组中的值会全部丢失,VBA将重新初始化数组元素,即将Variant型数组元素值置为0,将字符串型数组元素值置为“ ”(空字符串)。
(5)可以使用关键字Preserve保留数组元素原有的值。使用Preserve时,只能改变最后一维的上界,前面几维上界不能改变,也不能改变维数
例如:
1 | Dim A () As Integer '声明一个动态数组a |
自定义数据类型
发生的发生
创建模块
Function过程的定义及调用
发生的发生
Sub过程的定义及调用
发生的发生
过程参数
发生的发生
保存模块
发生的发生
宏转换为模块
发生的发生
数据库对象与ADO的调用
引用数据库对象
发生的发生
Access对象
发生的发生
ADO对象
发生的发生
使用ADO对象访问数据库的步骤
发生的发生
使用ADO对象访问数据库实例
发生的发生
VBA程序调试
错误类型
发生的发生
“调试工具栏”
发生的发生
调试方法
发生的发生
错误处理
发生的发生