VBA(Visual Basic for Applications,Visual Basic应用程序设计语言)是Visual Basic和许多可编程软件应用程序(特别是Microsoft Office套件)所采用的语言。VBA文档资料遵循80/20法则:提供大多数情况下你需要用到的语言语句的基础;而缺少高效地使用它或者把它投入到一些特殊应用当中去的其他20%的内容。但是对于一个专业的开发人员而言,这20%也是不容错失的,浪费它简直是一种奢侈。当然,本书将提供这20%的内容。
本书还对VB/VBA语言进行了一个简短的概述,涵括了基本的编程概念、错误处理以及面向对象编程等内容。
尽管你可能对VBA编程已有相当丰富的经验,本书仍然会为你节省许多时间。你既可以把它作为一本标准的参考指南,也可以把它当成一种故障和编程问题诊断助工具。毋庸质疑,本书正是Visual Basic和VBA开发人员的一本权威参考书。
第一部分 基础知识
第一章 概述
什么是VBA?
VBA发展简史
VBA可用来做什么?
对象模型:VBA的编程能力
第二章 程序结构
运行VB程序
VB程序的结构
结束VB程序
第三章 VBA变量和数据类型
Visual Basic数据类型
类型转换
Variant数据类型
声明变量和常数
数组变量
UDT
变量作用域和生存期
Object变量和绑定
传递参数
内部常数
第四章 类模块
属性
枚举常数
类模块事件
实现自定义类方法
创建ActiveX组件
在工程内使用ActiveX组件
第五章 自动化
创建对象模型引用
读取对象模型
使用对象模型
Collection对象
俘获自动化服务器的事件
自动化实例
自动化性能优化技巧
第六章 错误处理
创建一个强壮的应用程序
过程中的错误处理
ActiveX服务器中的错误处理
报告错误
第二部分 参考
第七章 语言参考
第三部分 附录
附录一 语言元素分类
附录二 语言常数
附录三 运算符
附录四 VB6中的新内容
在深入讨论之前, 让我们先明确一个基本的出发点.VBA(Visual Basic for Applications, Visual Basic应用程序设计语言)是用于在VB(Visual Basic)中编程的语言.VB本身只是一个开发环境, 这个环境的语言就是VBA.同样, Microsoft Office系列套件中除outlook之外的应用程序都是用VBA语言编写的, 其中也包括一大堆的第三方应用程序.无论是在VB环境中编程还是在如Word.Excel等VBA宿主环境中创建应用程序, VBA语言(仅有极少数例外)几乎是完全相同的.除非特别声明, 本书中描述的语言元素在VB的零售版本和VBA的宿主环境中的用法完全是一样的, 因而, 在整本书中, 我们经常互换VB和VBA这两个术语.
本书是VB和VBA宿主环境所共享的一些语言元素的参考, 这一点非常重要, 但是还应该强调的是, 它不包括以下内容:
VB控件及其属性.事件和方法的参考指南.这些都是属于VB编程环境的, 根本不是VBA的组成部分.但是, 这些内容在即将出版的《Visual Basic Controls in a Nutshell》一书中有详细说明, 该书由Evan S.Dictor编著, O'Reilly公司出版.
UserForms及其控件的参考指南.所有UserForms及其控件都是由各种版本的Microsoft Forms Library定义的, 它们和VB控件非常相似, 都属于VBA宿主语言的IDE(集成开发环境), 而不属于语言本身.
Office系列套件各种对象模型的参考指南.通过访问其宿主应用程序的对象模型, VBA可以使应用程序自动执行.但是, 无论是从概念上还是从实用性上来讲, VBA代码和对象模型代码都是截然不同的.在O'Reilly公司出版的"Programmingthe…Object Model"系列丛书中介绍了一些对象模型.这套丛书包括《Programmingthe Acces s/DAO Object Models》(Helen Feddema编著)和《Progfammingthe Word Object Model》 (Julianne Sharer和Arthur Einhorn编著).
为什么要再写一本VB书?
对所有想学习和精通语言的程序员而言, VBA都是一种极为重要的语言.许多人都是从VB和VBA开始学习编程的, 而且, 越来越多的VB程序员也渴望深化知识和提高编程技巧, 这一点可以从已出版的VB书籍的巨大数量上得到证实.但是市场对于详细.专业的VBA语言的参考书仍存在极大的需求.书店的书架上成排摆放着的关于如何利用VB编程, 或如何利用VBA使Office应用程序自动化的书籍, 差不多有成百上千种--表面上每本书都宣称自己能快速教会你比其他书更多的东西.但假如你是VB新手, 你不可能在一夜之间或者几个星期之内学会它, VBA是一种庞大.精细的语言, 它包括几百种不同的因数.语句和语言元素.而且, 由于Basic语言的发展已经经历了相当长的时间(其中某些部分甚至源于Basic和QBasic), 每个新的版本部不得不兼容以前用旧版本编写的代码, 这样你就会发现相同的任务可以用很多不同的方法完成.其中可能有很早的函数.较早的函数以及最新的函数, 所有这些都可以得到相似的结果.但是哪一个函数是早期的, 哪一个是新的?应该使用哪一种?新的就一定比早的好很多吗?对这些问题理解的深刻与否取决于多年使用不同版本的VB和VBA的经验.而这些经验正是我希望通过本书传达的.
在线帮助有问题吗?
总地来说, 在线帮助没有任何问题.VB和VBA的在线帮助是不可缺少的资源, 绝大多数程序员都得依靠它.本书的作用是填补帮助部分的空白, 给程序员一个完整的参考.本书包含的都是专业VB程序员在长期应用VBA语言(无论是在VB环境下还是作为Office应用程序的宿主语言)创建复杂的面向任务的应用程序中积累的经验.正是这些经验会使你受益匪浅.不管你是刚接触VB还是已使用VB多年, 总是有新的技巧需要学习, 通常寻找这些能使你受益的宝藏是非常重要的.在很大程度上, VB和BBA文档的绝大部分内容都不算差, 只是在你需要时, 它没有你想要的深度信息.我们中的绝大多数人都可以日复一日地获得这些信息而不需打开帮助部分.而当你需要打开帮助部分时, 往往是因为你碰到了一个意外的问题或者想知道用某个特殊方法编写某个特殊过程代码的结果.但是, 帮助部分只能告诉你函数应该怎样用在代码中.这是可以理解的, 毕竟, 任何语言的帮助部分本来都是在该语言广泛应用之前创建的, 但是只有在实际环境中广泛.大量应用才能够知道如何最好地使用一门语言并了解其问题和缺陷.因而在线帮助的内容定位为:语法结构以及如何实现某个具体函数或者语句.
关于VB6帮助部分的简短说明:Microsoft已经决定把帮助部分移入MSDN中并把它从WinHelp格式转换成HTML格式.在预发行阶段, 新的用户界面招致了大量的批评, 如速度慢.占用过多内存及视觉效果不好等(这还是含蓄的说法).因而我希望读者能熟读新的VB6语言特性, 然后把本书放在手边.
谁应该读本书?
本书是面向专业软件开发者的.VBA语言是世界上应用最为广泛的RAD(rapid application development, 快速应用程序开发)语言.除了上百万正在使用VBA的开发者外, 越来越多开发者正从其他语言(如C十十)转到VB上来.他们主要不是想改变编程技巧, 而是为了扩充个人的编程工具并以此扩大他们的就业机遇.
本书实质上是一本参考书而不是自学材料.所以, 我不想解释像For…Next循环语句这样的概念, 因为作为一个专业程序员, 你已经知道这个概念, 所以我不想侮辱你的才智.但是我将详细解释For…Nex亡循环在VB中是如何工作的.在实际中又是如何工作的.它可以用什么来替代.如何充分利用它以及它的缺陷和克服这些缺陷的方法.
同时我也希望本书能成为那些已升级到VB6的资深VB程序员的主要参考工具.我花了好几个月的时间研究VB6, 其目的是为了熟悉新的语言元素的完整文档和其中所包含的对象模型.这里再一次说明, 假如你是一个升级到VB6的VB程序员, 就不必像新手那样被那些新增的函数和对象模型牵着鼻子走, 应该明白, 由于对VBA语言很熟悉, 所以你可以很快熟悉VB6的新组件.你只需要知道这些内容在实际编程中如何使用就行了, 然后就可以离开去做别的事情了.
专业VB程序开发的重点由于VBA语言对于开发关键性任务的应用程序的重要性日益增加, 本书侧重于如何在多用户环境中正确使用语言元素, 并在编写面向多层应用模型或应用于诸如DCOM和Microsoft Transaction Server环境的组件时, 加以特殊的详细注解.同样, 我也对这些语言元素在NT和Windows 95操作系统中使用时所发现的所有差异进行了注释.
另一件比较麻烦的事情是VB代码的可读性和可维护性.大多数由软件公司开发的VB应用程序现在都是由开发小组编写而不是单个程序员编写的.因而, 确保小组的每个成员在维护程序代码时能够快速读懂是很重要的, 当然还要保证你能够理解几个月前编写代码时你想要实现的是什么.考虑到达一点, 在所有必要的地方我也给出了一些用于提高VB代码可读性和自描述性的技巧.
怎么样使用本书
到这里显然你已经跨过了第一个障碍, 那就是翻开本书.现在你需要做的就是继续阅读下去.
如果你是VB新手
如果你是第一次使用VBA语言, 那么本书假定VBA是你的第二门或备用语言.本书的前半部分将引导你遍历有关VB和VBA编程风格的所有重要领域.它们简单易学, 这一点与其他多数语言大不相同.因此建议读者依次阅读这些章节而在必要的时候参阅第七章.
如果你是VB或VBA程序员
作为一个有经验的程序员, 你可以从本书中挖掘你感兴趣的深层次的语言元素.附录一详细地分类列出了所有函数.语句和对象模型, 使你更加容易在第七章找到相应的内容.
如果你是刚接触VB6的VB或VBA程序员
最好从附录四开始阅读本书, 附录四中列举了VB6中新的.修正过的语言功能以及和语言有关的对象模型.在使用这个列表时, 可以参阅第七章中相关的章节.由于VB6没有大的跳跃性的变化, 而VB4.VB5却有, 所以你会发现一些强大的附加功能, 它们将加快你开发应用程序的速度并提高程序的质量.注意, 本书完全是针对这门语言的, 所以新的VB6非语言功能(例如动态添加控件)并没有引入本书.
语言参考的格式
第七章出现的所有函数和语句都采用如下格式:
语法
本部分使用标准的惯例(在下一部分有详细说明)给出语言项所采用的语法概要, 同时也列出参数和可替换的项目, 指明是否为可选参数, 列出数据类型并给出简洁的描述.
返回值
本部分在适当的地方提供函数或属性返回值及数据类型的简洁描述.
捞述
一个简短的描述.用以描述语言元素的功能以及何时.为何使用它.
简要规则
本部分描述该函数的用法要点.同时以项目符号列表的形式说明函数的可用与不可用的地方, 从而使你能够快速地浏览整个规则表.在大多数情况下, 本部分的
内容比VB文档中能找到的基本细节要有用.
实例
文档编制得很好而实例很糟糕的情况十分常见.我们经常可以见到像下面这样的
代码段:
解释如何从Integer转换为Long!
Dim iVarl As Integer
Dim lVar2 as Long
iVarl = 3
lVar2 = CLng(iVarl)
Msgbox "The value of lVar2 is:"&lVar2
而在本书中你不会看到无缘无故使用实例的情况.我认为引入一两行代码片段仅仅只是对语法部分的重复而已, 所以毫无价值.有鉴于此, 我只是写进这样一些实例, 它们能够加深读者对某语言元素的理解或者示范文档中较少提及的语言元素的特点和用法.
编程方法和技巧
这是第七章中最有价值的部分, 主要来自作者在多种不同环境下使用VBA语言的经验.这里包含的知识能帮你在思考和试验时节省许多时间.最重要的是, 这里的内容都是Microsoft的产品没有告诉你的.
参阅
用于相关或扩充函数互相参考的简单列表.
排版约定
在整本书的英文中, 我们使用以下排版约定:
等宽字体(Constant width)
在正文中使用的等宽字体表明它是一种语言结构, 例如VBA语句(如For或set).内部常数或用户定义常数.用户定义类型或某个表达式(如dElapTime=Timer()-dstartTime).在等宽文本中是不能同时出现代码段和实例的.在语法语句和原型中, 等宽文本表明这种语言元素是函数或者过程名和语法所必需的静态元素.运算符.语句和代码段也是用等宽文本表示的.
等宽斜体(Constant width italic)
正文中的等宽斜体用来表示参数和变量名.在语法语句或原型中, 等宽斜体表示可替换的参数.
斜体(Italic)
正文中的斜体用来表示内部函数或用户定义函数及过程名.很多系统元素(如路径和文件名)也用斜体表示.最后需要说明的是, 第一次提到的术语也用斜体注
建议与评论
本书的内容都经过测试, 尽管我们做了最大的努力, 但错误和疏忽仍然是在所难免的.如果你发现有什么错误, 或者是对将来的版本有什么建议, 请通过下面的地址告诉我们:
美国:
O'Reilly&Associates, Inc.
101 Morris Street
Sebastopol, CA 95472
中国:
100080北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司询问技术问题或对本书的评论, 请发电子邮件到:
info@mail.oreilly.com.cn
bookquestions@oreilly.com
若要加入我们的邮件列表或者索要目录, 请发送电子邮件至:
nuts@oreilly.com
最后, 你可以在WWW上找到我们:
http://www.oreilly.com
http://www.oreilly.com.cn
扩充和修正的需要
我们希望本书如同VB语言一样能够不断完善, 也希望本书被VB和VBA程序员视作VBA语言正式的非官方文档.为了做到这一点, 我们需要你的帮助.如果你发现了错误.我们将非常乐意知道这些信息.如果你想寻找有关VBA语言特性的内容而又不能在本书中找到, 我们也非常乐意知道.最后, 如果你愿意贡献你宝贵的编程技巧和心得, 我们将尽力把它添加到本书的下一个版本中去.你可以在我们的主页上提出你所要求的对这本书的补充.添加和修正:http://www.oreilly.com/catalog/vbanut.