VBA
一,概述
VBA(Visual Basic For Applications)是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。VBA是Visual Basic的一个子集,VBA不同于VB,原因是VBA要求有一个宿主应用程序才能远行,而且不能用于创建独立应用程序。而VB可用于创建独立的应用程序。VBA可使常用的过程或者进程自动化,可以创建自定义的解决方案,最适用于来定制已有的桌面应用程序。
通常意义上的VBA就是在Office中包含着的一种加强Office功能的Basic语言。经过发展,在Office中,Word、Excel、Access、PowerPoint四个软件都有了自己的程序设计语言,分别称为WordBasic、ExcelBasic、AccessBasic、PowerPointBasic(在Outlook中的开发语言为Visual Basic Scripting Edition)。通常统一称为VBA(VB for Application)。
二, 宏
宏是能够自动完成某个任务的一组指令,这些指令放在一起就如同一个命令一样。宏与Dos中的批处理文件一样。批处理文件用于自动化用户完成的一组任务。VBA把需要重复进行的任务创建宏,并编写其它涉及决策的任务的代码以完成任务自动化,最后可以把这个过程保存成文件并发布。
录制宏比从头开始编写代码要快得多。在实际开发中,为节省时间可以先录制尽可能多的宏,用它来建立应用程序的基础,然后再对录制下来的代码进行修改。
1,录制宏:在VBA中,可以采用宏录制器或编程的方式自动处理任务。不必了解宏录制器使用的编程语言,便可以在VBE编辑宏。通过记录完成任务的步骤,或者在VBA中编程,都可以创建宏。Office应用程序,例如word、Excel、PowerPoint、Access和Outlook都支持宏。Office应用程序提供的创建宏的工具是Macro Recorder(宏录制器)和VB编辑器。宏录制器用于自动化重复的任务,而VB编辑器自动化那些涉及决策的任务。可以给宏指定符号(工具栏上的图标)、键(键盘上的键)或名字,用于表示一列命令、活动或击键。
录制宏有两种方式,一是双击状态栏中的”录制”命令,或者鼠标单击工具\宏\录制新宏命
令,WORD等将记录下您的操作并转换为VBA语言。
www.deepcast.net_deepcast_userfiles_2006-7_5_20067513259758.jpg
2,修改宏:
A, 指定快捷键:
B, 指定宏的保存位置:Excel可保存宏到个人宏工作簿中
C, Excel可将宏指定给按钮(视图|工具栏|窗体|点选按钮到页面|指定宏)/图片(插入|图片|右击图片|指定宏)/工具栏按钮(工具|自定义|命令|宏|自定义…|拖动自定义按钮到工具栏|右击按钮可编辑图标和指定宏|关闭自定义…)
三,使用控件设计用户界面
首先要进行需求分析:应用程序的客户是谁,使用的数据的来源,数据保存在哪,对数据怎么操作,输出结果是什么?然后根据用户需求来添加控件(标签,按钮,复选框,选项按钮,列表框,组合框,滚动条控件,微调控件。)使用工作表还是用户窗体完全取决于个人的爱好和应用程序的用户。熟练Excel用户适合以工作表的形式工作。初级用户适合使用用户窗体。
1, 向工作表添加控件: 视图|工具栏|窗体|点选控件到工作表|右击工作表上的控件选设置控件格式。通过使用控件、设置格式和公式,可以执行一些简单的自动化任务(至少对你的用户来说是这样)。
2, 向用户窗体添加控件:
(1)添加用户窗体: 打开一个新的工作簿|工具|宏|VBE|VBE的工具栏上的“插入用户窗体”按钮(或者选择“插入|用户窗体”,显示出新添加的用户窗体)
(2)设置用户窗体的Name(一般前缀推荐取frm),Caption等属性
(3)添加控件到用户窗体上:只要从工具箱中选择想要使用的控件,然后使用鼠标把控件拖到窗体上就可以了。
(4)设置控件的Name,Caption和其它相关属性:控件Name命名前缀规范:复选框chk,组合框cbo,命令按钮cmd或者btn,分组框grp或者fra,图像img,标签lbl,列表框lst,多页(MultiPage)mul,选项按钮opt,引用编辑(RefEdit)ref,滚动条hsb或者vsb(取决于是水平的还是垂直的),微调项spn,选项卡条(TabStrip)tab,文本框txt,切换按钮tog
A, 命令按钮Default属性:一个窗体上只有一个命令按钮的Default属性可以设置为True。把Save(保存)/Cancel(取消)按钮的Default属性设置为True。在窗体上当按下回车键时,窗体将执行保存/取消操作。
B,控件的尺寸调整为一致并对齐:同时选中两个控件|点工具栏上“宽度相同”按钮旁边的向下箭头|选'两者都相同'|点“对齐”工具栏按钮旁边的向下箭头|选'左对齐',
C,禁用控件:把Enabled(启用)属性设置为False就可以禁用控件。
D,为控件分配Tab键切换顺序:设置TabIndex属性值,可以从第一个控件起设置其TabIndex为0,1,2..,也可以从最后一个控件起逆序设置每个TabIndex为0(原理:当把某个控件的TabIndex属性值设置为0时,其他所有控件的TabIndex属性值都会加1)
E,为控件分配加速键(键盘访问键):在控件的标题字母中找出一个作为该控件的加速键,把该字母赋值给控件的Accelerator属性,当设置完成以后,控件标题中该字母下会有下划线
(5)运行用户窗体: 按F5键
四,使用VB编辑器
VBE(Microsoft Visual Basic Editor,Visual Basic 编辑器,VB编辑器)就是我们设计\调试VBA代码的编辑器,它是捆绑在Application(如WORD)应用程序中的一个程序。进入VBE的方式:ALT+F11;工具/宏/Visual Basic 编辑器命令;工具/宏/宏对话框,创建或者编辑命令,也可以进入Visual Basic 编辑器
www.deepcast.net_deepcast_userfiles_2006-7_4_200674215440623.jpg
1, 使用工具栏
2, 浏览代码功能:编辑|查找或替换;书签标注需要查错,添加代码,更新或升级的代码区域。
3, 使用在线帮助:帮助|Microsoft Visual Basic帮助
4, 使用对象浏览器:单击标准工具栏上的“对象浏览器”按钮。/选视图|对象浏览器/按F2键。
5, 设置编辑器选项:工具|选项|编辑器选项卡|自动显示快速信息,自动语法检测等
五,VBA语法基础
六,VBA对象模型
七,模块
作为一个单元保存在一起的定义、过程、函数和事件处理程序的集合称为模块。每个应用程序都是模块的集合。模块充当了项目的基本构件。它们是存储代码的容器。如果统筹安排模块内的代码,将有利于维护、调试和重复使用代码。如下共有三种类型的模块:
1,用户窗体: 是用于为应用程序提供用户界面,采用.frm扩展名存储的用户窗体。窗体模块包含窗体中的所有控件及其属性。也可以为窗体和控件指定常量和变量声明、过程以及事件过程。窗体模块中的所有声明都默认是Private(私有),不能在窗体外访问。
2,标准模块: 是用于存储通用过程,以便其他模块中的过程可以调用,采用.bas扩展名存储的代码模块。它们包含常量、类型、变量、过程和函数的声明。标准模块中所有声明都默认是Public(公共的),可以在模块外全局访问。当录制宏时,如果不存在该模块,Excel会自动为你创建。如果愿意,也可以添加附加的模块。Excel和VBA并不关心过程位于哪个模块中,只要过程位于打开的工作簿中即可。
3,类模块: 类模块的使用方式与窗体模块相似。两者之间惟一差别是类模块中不包含可见组件。
使用类模块可以创建自己的对象。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。要为每个类编写代码,必须使用类模块。窗体是类模块的示例。窗体是指包含属性(如字体、名称和标题)、方法(如单击)、预定义行为的对象。当创建窗体时,它会成为代码的独立模块。同样,所有控件,例如命令按钮和文本框,都是它们各自类的对象。
变量命名前缀规范:
数据类型 |
短前缀 |
长前缀 |
Array |
a |
ary |
Boolean |
f |
bin |
Byte |
b |
bit |
Currency |
c |
cur |
Date/Time |
dt |
dtm/dat |
Double |
d |
dbl |
Integer |
I |
int |
Long |
l |
lng |
Object |
o |
obj |
Single |
- |
sng |
String |
s |
str |
Variant |
v |
var |
八,测试与错误处理
1,测试:
(1)测试代码,检查它是否正确。为确保代码能够正常作用,必须在指定时间周期内采用不同的样本数据运行它。
(2)如果代码没有按照预想方式正常作用,就需要调试它。可以用VBA提供的调试工具调试代码。
(3)尽力模拟代码运行的不同环境,并检查其正确性。重点是检查代码的可移植性。
(4)在成功地测试了代码之后,可以对观察到的现象进行存档,例如代码末正常运行的
环境。
2,错误类型:Error(错误,可捕获并用代码处理)并非Bug(程序错误,无法捕获)
A, 语法错误(如输入时关键字或标点符号拼写错误)
B, 编译错误(如使用对象的方法时,该对象并不支持这个方法)
C, 运行期间错误(如除0、打开或关闭并不存在的文档、关闭未打开的文档)
D, 逻辑错误(逻辑锗误是最难查找的错误类型,它们是由程序中使用的逻辑引起的。它们并不显示任何错误消息,所以不能提供错误线索及发生的位置。然而,有时,它们会产生运行期间错误,以便确定已经产生锗误的语句。如果编写了模块代码,而且该代码包含很多函数,而且一个函数调用另一个函数,那么不得不调查所有过程,以识别错误位置。)
3,调试工具:要确保代码中的变量和表达式按照预想的方式运行,可以使用VBA中的各种调试工具跟踪它们。VBE有如下不同的调试工具。
(1) 中断模式:
A, 进入中断模式方法:在过程的开始位置按下F8键。/使用断点(F9键或者单击当前空白指示器栏)。/使用Stop语句。/当过程运行时,按下Ctrl+Break键。/使用运行期间错误MsgBox对话框 。
B, 退出中断模式方法:从Run(运行)菜单中选择”Run Sub|Userform”〔运行子过程/用户窗体);或者按下F5键,或者单击Debug工具栏上的”Run Sub|Userform”按钮。/从Run菜单中选择Reset(重新设置)选项,或者单击Debug工具栏上的Reset按钮
(2) 单步执行过程:
A, 单步执行过程:从Debug菜申中选择StepInto(逐语句)选项/单击Debug工具栏上的StepInto按钮
按下F8键
B, 跳过过程(跳过已测试无误的过程节省时间):从Debug菜单中选择Step 0ver选项/按下Shint+F8键/单击Debug工具栏上的Step Over按钮
C, 跳出过程(跳过程剩余部份):从Debug菜单中选择stepOut选项/按下Ctrl十shift十F8键/单击Debug工具栏上的StepOut按钮
D, 运行到光标处(跳过一组语句):从Debug菜单中选择RugToCursor选项/按下Ctrl+F8键
E, 设置下一条语句为光标所指语句(要警惕会忽略不执行中间的语句):从Debug菜单中选择Set Next Statement/或者按下Ctrl十F9键。
F, Sbow Next Statement选项指明下一个将要执行的语句是什么。当需要在Code窗口中监视很多过程、却丢失了跟踪时,这个特征就显得非常有用。
(3) 监视过程。
A, Locals(本地)窗口(显示当前过程中使用所有变量及其值,还会显示当前加载窗体和控件的属性。):从V1ew (视图)菜单中选LocalsWindow选项/单击Debug工具栏上的localswindow按钮
B, CallStack对话框(查看所有活动的过程调用):从View菜单中选CallStack选项/按下Ctrl+L键/
单击Debug工具栏上的CallStack按钮
C, Immediate(立即)窗口(可查询并设置变量值,创建或撤销对象,执行单行命令如Debug.print [outputlist]):从View菜单中选择ImmediateWindow选项/按下Ctrl+G键/单击Debug工具栏上的ImmediateWindow按钮
D, Watches窗口(是一个调试工具,在中断模式下可使用它更改变量和表达式的值,以查看不同的值如何影响代码):从View菜单中选择WatchWindow选项/单击Debug工具栏上的WatchWindow按钮
参考:
E, Auto Data Tips(自动显示数据提示)工具:Too1s(工具)菜单中选择Options(选项)Editor(编辑器)选项卡中的Auto Data Tips选项。就可以激活变量值自动显示(即在中断模式期间,只需把光标放在code窗口中的变量之上,该变量的值会自动以提示的方式显示出来。)
4,预防错误
A, 使用注释
B, 缩进代码:Tab键或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Auto Indent(自动缩进)
C, 使代码模块化
D, 显式声明变量:使用Option Explicit语句,或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Require variable Declaration(需声明变量)复选框。
E, 避免使用变体Variant(当某变量可能包含NULL值时就只能惟一指定Variant类型了)
F,打开语法检查:启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中Auto Syntax Check(自动语法检测)
G,谨防Dim陷阱:Dim mystr1, mystr2 As String '并未声明mystr1变量
5, 错误处理:调试只能够发现可以预测的错误,要处理不可预测的和不可避免的错误时,就必须使用错误处理。通过启用错误处理,捕获并提示错误处理,可以使程序更健壮。就可以使应用程序更稳定、更健壮。如果应用程序中包含了好几个过程,那么可以考虑采用集中式错误处理程序。
(1) 捕获错误:On Error Goto line (On Error Goto 0会在当前过程禁用错误处理程序)
在这个语法中,line指定了发生运行期间错误时控制将跳转到的代码行
Private sub calcuLate() 0n error goto validate_error iresult = inuml/inum2 Print iresult Exit Sub validate_error: Msgbox "Runtime error - division by zero" End Sub
(2) 编写错误处理程序:给用户显示错误信息;提示补救方法;允许继续或取消操作。使用Err对象:
属性 |
说明 |
Number |
存储最后一个错误的数字ID。这是默认属性 |
Description |
存储说明错误的有关信息 |
Source |
包含发生了错误的对象名或应用程序名 |
HelpFile |
包含帮助文件的名字 |
HelpContextID |
包含错误号对应的帮助上下文ID |
LastDLLError |
包含最后一次调用DLL的系统错误代码 |
Raise方法可以让用户自定义错误处理信息,还可把错误处理信息传回调用过程:
Err.Raise number[, source, description, helpFile, helpContext]
Clear方法清除Err对象的所有属性值:Err.Clear (当调用On Error, Exit Sub, Exit Function, Exit Property, Resume 等语句时,会自动调用Err.Clear方法。)
(3) 退出错误处理程序:
A, 0n error Resume:当错误处理程序已经修复错误后,可以用它来返回控制给引起错误的语句。但注意如果错误还在的话,会引起无限循环。
B, 0n error Resume Next:忽略错误语句,继续下一句
C, Resume [LineLabel]: 把控制传递给行标号(必须和Resume语句处在同一个过程中)所在点的语句
D,也可使用Exit Sub或者Exit Function甚至End语句退出已产生错误的过程,但这些语句应放在错误处理程序之前,这样当未产生错误时就不会执行错误处理程序。
(4), 创建集中式错误处理函数程序:只需创建一次,就可反复使用
'添加一个模块创建一个函数,命名为HandleErrors Function HandleErrors(iErrNum) As Integer Select Case iAction Case 5 'Invalid procedure call MsgBox Error(iErrNum) & " Contact Help Desk." iAction = 2 Case 7 'Out of memory MsBox "Close all unnecessary applications. " iAction = 1 Case 11 'Division by zero MsgBox "Zero is not a valid value. " iAction = 1 Case 48, 49,51 'Error in loading DLL MsgBox iErrNum & "Contact Help Desk. " iAction = 5 Case 57 'Device I/O error MsgBox "Insert Disk in Drive A." iAction = 1 Case Else MsgBox "Unrecoverable Error. " iAction = 5 End Select ErrorHandler = iAction End Function
'在另一模块的ErrorExample过程中使用HandleErrors函数 Private Sub ErrorExample () Dim sngValue As Single, sngDivideBy As Single, sngAnswer As Single Dim iResponse As Integer On Error GoTo ErrorZone s n g Value = InputBox("Enter the number you wish to divide: ") sngDivideBy = InputBox("Enter the number you wish to divide by: ") sngAnswer = sngValue / sngDivideBy MsgBox "The answer is " & sngAnswer Exit Sub E r r o r Z o n e : 'This Select statement uses the value returned 'from the HandleErrors function for its condition. Select Case HandleErrors(Err) '对应于五种处理方法:Resume/Resume Next/Resume “行”/退出该过程/结束整个应用程序。 Case 1 Resume Case 2 Resume Next 'This procedure doesn't need case 3 which is resuming to a line. Case 4 Exit Sub Case 5 End End Select End Sub
九,VBA的安全性和保护工具
1, 数字签名:保护在VBA中编写的宏、过程、窗件或代码。也可以把它应用于文档、模板和内插附件。把数字签名添加到宏项目中的步骤如下:打开VBE–>Tools菜单上的Digital Signture(数字签名)命令–>单击Choose(选择)指定数字证书。
www.deepcast.net_deepcast_userfiles_2006-7_5_200675223231365.jpg2, 指定安全级别:Tools工具–>Macro宏–>Security安全性。可以指定Security LeveI(安全级别)和Trusted Source(信任源)
3, 代码的密码保护:打开VBE–>Tools–>Project 属性,写人密码锁定代码查看
www.deepcast.net_deepcast_userfiles_2006-7_5_20067522413404.jpg
十,VBA程序的部署
不管是加载宏程序还是一般的电子表格程序,其部署都很简单,我们可以直接拷贝这个文件到目标机,对于加载宏,需要在Excel 中将其加载,对于后者,可以直接双击使用Excel打开运行。
而对于应用VSTO 开发的Office 应用,其程序的存储位置位于独立的文件和DLL。另外,如前文所述,我们也可以将一些算法、代码通过COM 对象封装在独立的DLL 内,在Excel 内通过VBA 调用。对于此类代码,需要在部署前安装和注册相应的(COM)对象。
如果在VBA 代码里使用了其他文件中的资源,如数据、配置信息等,在发布和部署时需要一起发布,对于这些文件资源的位置,可以通过Application 对象获取当前文件或加载宏的所在目录,然后通过目录的相对路径来调用。
例如,当前文件的路径为:Application.ActiveWorkbook.Path;加载宏的路径则通过以下方法来获取:Application.AddIns.Item([加载宏名称]).Path
对于有多个文件的程序包,可以使用安装工具制作安装包,也可以通过直接Copy 的方式来部署。
十一,VBA高级应用
* VBA病毒:VBA是众多臭名昭着的宏病毒和基于Outlook的邮件病毒的主要技术!宏病毒是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,宏病毒就会被激活。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,病毒又会转移到他的计算机上。
十二,VBA第三方软件工具
1998年流行的MIS和MIS生成工具有CAPMS、BMIS、CMRP2、JWMRP-2、雅奇MIS工具、 DBPRO、VISUAE MIS、QUICKMAIS及QUICKPRO等 王特MIS(1995大连王特公司Foxpro写的MIS系统生成器),但只能解决一点简单的问题,稍多弄一点就会出各种各样的问题,不能真正达到应用水平。参见:软件开发工具的现状和发展|
雅奇 MIS|从DOS走到Foxpro,2009尚存但前途不明
参见
AccessHome Access之家| 超市管理2000|
Error after importing forms from backup copy of project|:Access VBA窗体与其代码是独立的,不会关联删除更新,所以在导入或者复制窗体后,需要进行手动关联,可以把当面全CUT,然后再设计视图下PASTE,再测试看看。
ACCESS_VBA编程.doc 1240k
ACCESS开发平台101.rar 1239k
Access 2000 帮助.CHM 3563k
Access2000VBA一册通.pdf 5978k
Access中文版实例与疑难解答.zip 591k
Access教材和范例.zip 103k
Access数据库通用管理系统.rar 5141k
AdvancedVBAPasswordRecovery.zip 983k
Excel与VBA程序设计.pdf 1077k
Excel与VBA程序设计_new.pdf 1077k
VBA For Access 2000 资料.CHM 1634k
VBA For Excel 2000 资料.CHM 1625k
VBA For Excel 2002 资料.CHM 1831k
VBA For Outlook 2000 资料.CHM 778k
VBA For Outlook 2002 资料.CHM 601k
VBA For Word 2000 资料.CHM 2065k
VBA For Word 2002 资料.CHM 2413k
VBA一册通Access2000.pdf 5978k
VBA一册通Excel2000_PDF.rar 6631k
VBA一册通Word2000.pdf 4303k
VBA语言基础.doc 65k
Word VBA学习.rar 665k
守柔wordvba讲座.rar 2250k
新宝的ACCESS培训教程 .zip 142k