当前位置: 首页 > 新闻 > 信息荟萃
编号:6092
深入浅出Excel VBA.pdf
http://www.100md.com 2020年11月27日
第1页
第8页
第11页
第22页
第49页
第328页

    参见附件(49894KB,444页)。

     深入浅出Excel VBA力求做到体系严谨、语言风趣,用轻松、生动的语言引导读者领会 Excel VBA 编程的精髓与关键,进而一窥计算机科学世界的神奇与美妙。同时,本书精心设计了60 个改编自真实场景的原创案例,使每个环节的学习都能映射到实际生活中的需求,为初学者提供一条独特、实用的VBA 学习路径

    编辑推荐

    适读人群:适合初学Excel VBA程序设计的读者,以及非计算机专业、无实际编程经验的各行业人士学习使用,也可以作为大专院校学生的辅助教材或自学参考书。

    ①前同济大学副教授用轻松幽默的语言带您领会Excel VBA编程的精髓。

    ②精心设计60个源自真实场景的原创案例,案例实用,贴近实际需求。

    ③讲解VBA程序设计的知识与技巧,同时注重编程思维和基本功的培养。

    ④附赠大量教学视频和扩展内容。

    内容简介

    本书基于作者在高校课堂和网络教育中多年积累的教学经验,由浅入深地讲解了Excel VBA 程序设计的知识与技巧,涵盖数据处理、格式排版、文件管理、窗体设计,以及集合、字典、正则表达式、Web 信息提取等各方面常用技能。本书力求做到体系严谨、语言风趣,用轻松、生动的语言引导读者领会 Excel VBA 编程的精髓与关键,进而一窥计算机科学世界的神奇与美妙。同时,本书精心设计了60 个改编自真实场景的原创案例,使每个环节的学习都能映射到实际生活中的需求,为初学者提供一条独特、实用的VBA 学习路径。此外,本书的主体内容与作者在网易云课堂开设的《全民一起VBA》系列视频课程相互匹配并互有补充。该系列课程以生动幽默的动画形式展现了Excel VBA 编程的全貌,读者可以参照学习,加深理解。

    作者简介

    东北财经大学会计学硕士、加拿大约克大学计算机科学硕士、上海同济大学信息管理博士。

    杨氏在线教育创始人,前同济大学副教授,长期在东北财经大学、同济大学等高校任教,并曾从事计算机科学博士后研究工作,在计算机教学领域、特别是面向人文经管学科的信息技术教育方面具有丰富的经验。此外还曾供职于加拿大TD银行等大型企业机构,对行业发展和企业需求具有深入的理解。

    目前制作推出的《全民一起VBA》系列视频课程在网易云课堂(study.163.com)广受好评,已经成为深受欢迎的VBA在线课程。

    怎样才能学好VBA

    整体来说,VBA的学习过程主要包括以下四个阶段。

    (1)培养編程思维

    VBA是一门程序设计语言,而程序设计则是一种思维方式,即按照计算机的运作机制去思考问题,然后把自己的想法用计算机的方式加以表述。所以,学习程序语言最重要的并不是牢记各种关键字和语法,而是领会到它所蕴含的思维方式。笔者见过许多学习过多门计算机课程,甚至毕业于计算机专业,却仍然不会编程解决简单问题的人。究其原因,就是没有培养出编程思维。

    因此,对初学VBA的读者来说,首要任务就是真正理解程序语言的逻辑和计算机的工作方式,能够将自己日常工作的流程用VBA语言要素精确地表达出来。一旦具备了这种思维方式和表述能力,后面的学习就会事半功倍 ......

    内 容 简 介

    本书基于作者在高校课堂和网络教育中多年积累的教学经验,由浅入深地讲解了 Excel VBA 程序

    设计的知识与技巧,涵盖数据处理、格式排版、文件管理、窗体设计,以及集合、字典、正则表达式、Web信息提取等各方面常用技能。

    本书力求做到体系严谨、语言风趣,用轻松、生动的语言引导读者领会 Excel VBA 编程的精髓与

    关键,进而一窥计算机科学世界的神奇与美妙。同时,本书精心设计了60个改编自真实场景的原创案

    例,使每个环节的学习都能映射到实际生活中的需求,为初学者提供一条独特、实用的VBA学习路径。

    此外,本书的主体内容与作者在网易云课堂(http:study.163.com)开设的“全民一起 VBA”系列视频

    课程相互匹配并互有补充。该系列课程以生动幽默的动画形式展现了 Excel VBA 编程的全貌,读者可

    以参照学习,加深理解。

    本书适合初学 Excel VBA 程序设计的读者,以及非计算机专业、无实际编程经验的各行业人士学

    习使用,也可以作为大专院校学生的辅助教材或自学参考书。

    未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

    版权所有,侵权必究。

    图书在版编目(CIP)数据

    深入浅出Excel VBA 杨洋著. —北京:电子工业出版社,2019.2

    ISBN 978-7-121-35464-9

    Ⅰ. ①深… Ⅱ. ①杨… Ⅲ. ①表处理软件 Ⅳ. ①TP391.13

    中国版本图书馆CIP数据核字(2018)第254596号

    策划编辑:李利健

    责任编辑:牛 勇 特约编辑:赵树刚

    印 刷:三河市君旺印务有限公司

    装 订:三河市君旺印务有限公司

    出版发行:电子工业出版社

    北京市海淀区万寿路173信箱 邮编:100036

    开 本:787×1092 116 印张:27.5 字数:748千字

    版 次:2019年2月第1版

    印 次:2019年2月第1次印刷

    定 价:89.00元

    凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联

    系,联系及邮购电话:(010)88254888,88258888。

    质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件到dbqq@phei. com.cn。

    本书咨询联系方式:010-51260888-819,faq@phei.com.cn。

    写在前面

    学习一个“小”技术,解决一个大问题

    在写本书之前,笔者制作的视频课程“全民一起 VBA”已在网易云课堂获得六万余名学员的

    关注和好评。而本书写作的初衷也正是应他们的要求,希望有一本内容翔实、语言风格轻松易读

    的 VBA 图书。但笔者深知,要想写好一本真正能够传道解惑的技术书,其难度并不亚于撰写任

    何一本学术专著。

    据说杨振宁先生曾经开过一个玩笑,大意是“现代数学教材可以分为两种:让人读了一页就

    读不下去的,以及让人读了一行就读不下去的” 。其用意是希望数学书不要写得抽象乏味,使人摸

    不着头脑,因为“数学毕竟要让更多的人来欣赏,才会产生更大的效果”①。其实在计算机教学领

    域也是一样,怎样让更多的人领略到计算机科学的魅力,感受到亲自编写代码操控电脑所带来的

    成就感,也应被我们这些教育工作者视作重要的目标。

    VBA 就是非常符合这一目标的教学题材,尤其适合于没有编程基础,但又可以通过学习编程

    来大幅提高工作效率的人士。不过很多 VBA 图书似乎忘记了读者“零基础”“非专业”的特点,把讲解重点放在了各种功能的实现上,忽视了初学者编程思维和基本功的培养。以笔者多年的教

    学经验来看,这种内容安排对大部分初学者来说并不合适,假如没有辅以专业教师的讲解,很难

    让读者真正掌握构思和编写程序的能力。因此,笔者在本书中重点着笔于程序结构、思路启发以

    及应用技巧上,同时精心设计了很多简短而有代表性的案例,希望为有意学习 VBA 的人士提供

    一个深入理解程序设计,进而一窥软件开发全貌的路径。

    如果读者看到这里决定多读一页,那么可以在接下来的内容中看到:为什么要学习 VBA、怎

    样学习 VBA,以及怎样使用本书。

    1. 电脑将要抢走我的工作,该怎么办

    最近几年,身边各行各业的朋友都突然关注起 AI(人工智能)的发展,而诸如“未来会计师

    岗位将全部被电脑取代”“XX 投行将全面采用计算机替代交易员”“AI 普及对律师就业市场造成

    巨大冲击”等极富冲击力的新闻标题,也屡屡见诸报纸和网站的头条。这股浪潮影响之大,以至于

    在笔者居住的城市,过去一年就有几万名金融业白领在下班后选择去夜校从头学习计算机技术。

    电脑真的会抢走我们的工作吗?每当在课堂上被问到这类问题时,笔者总会提醒同学:耸人

    ① 见上海华东师范大学张奠宙教授的文章《和杨振宁教授漫谈:数学和物理的关系》。 >> 深入浅出Excel VBA

    IV

    听闻与掩耳不闻一样,都无助于理性思考。从长远看,人工智能的发展当然会逐渐替代大量的日

    常工作,但是按照目前的算法理论和技术水平,再考虑到社会经济各方面的制约,这个替代过程

    恐怕要经历一个相当长的时间。然而在这个漫长的阶段里,直接抢走你工作的恐怕不是电脑,而

    是那些“能够指挥电脑的人” 。

    举一个真实的例子,下面是某位网友在知乎(www.zhihu.com)上贴出的一段亲身经历

    (https:www.zhihu.comquestion64821272answer224650964):

    对于这样的任务,公司领导当然希望能够拥有一台超级 AI,就像科幻电影中那样,只要对着

    它说“找到电脑中所有的 Office 文件,然后给每一页都打上两个红框” ,连“请”字都不用提,就

    能瞬间得到结果。不过遗憾(幸运)的是,至少在本书写作时,像这样能够一听就懂并迅速想出

    正确方案的 AI 还没有出现;或者即使出现,其建造和训练的成本也高不可攀。于是,领导们还是

    不得不屈尊雇佣我们这些白领来完成工作。

    我们这些接到任务的白领又能怎样完成它呢?相信绝大多数 Office 用户都与上面这位提问者

    一样,只能亲自打开每一个文件夹下的每一个 Office 文件,手工执行插入文本框操作后再逐一保

    存。如果每台电脑中有上千个文件,恐怕搞定一台电脑就需要一两天时间。而面对帖子中提到的

    几百台电脑,即使昼夜加班也很难在截止日期之前全部完成。

    但是对于懂 VBA 的 Office 用户来说,这个任务就会简单许多:只要新建一个 Excel 文件并写

    入一小段 VBA 代码(在知乎该问题中可以见到笔者的示例回答),就能够为同一文件夹下的所有

    Excel 文件都插入一个显示存档日期的文本框。而这段代码只要稍微修改一下,就能扫描硬盘上所

    有的文件夹及其子文件夹,并扩展到 Word 和 PPT 文件,从而让计算机自动完成全部任务,无须

    人工操作。对于一个具有 VBA 基础的人来说,做好这个程序大概只需要半天,而后面的事情就

    是把它复制到每一台电脑上运行一遍,最后检查处理一些异常情况即可。

    那么,当这家公司准备缩编裁员时,面对一个能写出上面代码的候选人和一个只会熟练排版

    或使用公式的候选人,如果其他条件相同,哪一位能保住自己的工作呢?答案不言自明。所以,写在前面

    V

    回到开头的问题,笔者想表达的意思就是:对大多数办公室白领来说,真正需要担心的不是电脑

    智能有多么强大,而是我们指挥电脑的能力有多么弱小。当办公室里的大部分工作还无法由计算

    机完全独立解决时,谁能够更高效地使用计算机,谁就是最后一个在遥远的未来被某个超级 AI

    替换掉的人。

    “指挥电脑”的能力又是什么呢?点鼠标、按快捷键、记住各种触控手势等当然都在此列。然

    而真正万能的指挥棒则是编写程序代码,使用计算机自己的语言去告诉它你想执行的操作。请相

    信:只要掌握了一个编程工具,并从自己的工作中最熟悉的任务开始实践,就会迅速发掘出电脑

    这一超级武器的真正威力,从而用一两小时就完成以前几天几夜才能完成的事情。而让每个曾经

    只会按鼠标的人都能感受到编程的价值和乐趣,正是笔者写作本书的动力所在。

    2. 为什么要学 VBA,而不是其他工具

    理解了学习编程的意义后,接下来的问题自然就是“我应该学习哪一种语言” 。世界上曾经出

    现过的程序语言多达数千种,目前仍有人经常使用的也有近百种。显然,作为非计算机专业人士,我们只能在其中选择最适合自己的一种。笔者的建议是:如果你平时最常接触的桌面软件是 Excel

    等 Office 应用,那么 VBA 就是最适合的初学语言。

    VBA 的全称为“Visual Basic for Application” ,是微软公司专门针对 Word、Excel、Access 等

    Office 应用软件而设计的基于 Visual Basic 语言的二次开发工具,从 1994 年开始就整合在 Office

    系列中。之所以说 VBA 是最适合 Office 用户学习编程的入门语言,主要原因在于以下几点。

    (1)简单易学、快速上手

    如果不考虑 Scratch 等针对低龄儿童所设计的编程工具,VBA 可以说是最简单易学的编程工

    具之一,因为它是从 BASIC 这门经典语言演化而来的。而 BASIC 的全称就是“Beginner's

    All-purpose Symbolic Instruction Code” ,意即“初学者通用符号指令码” ,其第一设计原则就是“让

    初学者容易使用” 。因此可以说, “简单易学、轻松上手”是根植于 BASIC 系列语言(包括 VBA)

    基因中的核心特征。

    与此同时,程序设计作为一种思维方式,其实在各种主流语言中都存在着很多共性特征和相

    通之处,一旦能够熟练掌握一种语言(比如 VBA),再学习其他程序设计工具也会事半功倍。所

    以,对于 Office 用户来说,从最简单的 BASIC 系列语言学起,应用到最熟悉的 Excel 日常处理中,确实是打开编程世界大门的最短路径。

    (2)学以致用,立竿见影

    笔者曾经在同济大学、东北财经大学等高校开设过十几年的计算机相关课程。教学经历中让

    我印象深刻的一点是:之所以很多人没能学会某门课程,仅仅是因为他们不知道这门课程有什么

    用处,也从来未曾把它应用到自己的日常工作和生活中。这也正是为什么现代教育理论中,格外

    强调“目标导向”学习的原因。

    具体到编程语言方面,尽管目前高校大多数院系专业都开设了基本的程序设计课程,比如 C、Java、Python、C++等,但这些语言的设计宗旨是为了让使用者能够独立开发一个完整的软件,所

    以学生只有在认真学习过一两个学期,陆续学完语法基础、用户界面、数据存储等多个模块的知

    识后,才能逐渐用它们编写一些小工具来解决一些实际问题。而在此之前的漫长学习过程中,大多>> 深入浅出Excel VBA

    VI

    数学生只能用它们做一些书后练习中的编程作业,其枯燥乏味让很多人中途放弃。

    VBA 则与之不同,其宗旨在于通过简单几行代码来调用 Office 中的已有功能,从而实现自动

    化办公。可以说,只需要掌握最基本的 VBA 语法,就可以尝试控制 Office 软件自动完成各种操

    作,解决实际问题。

    (3)功能强大,随处可用

    VBA 是为 Office 而设计的,因此,我们在使用 Office 软件时的绝大部分人工操作都可以通过

    编写 VBA 程序自动完成。下面列出的就是一些常见的 VBA 应用场景。

    ★ 数据处理。虽然使用 Excel 的公式和数据透视表等工具可以应付很多数据处理任务,但是

    总有一些独特的需求难以用这些通用工具快速实现,比如怎样对含有合并单元格的表格进

    行排序、怎样按照“先进先出法”计算库存等。而 VBA 则允许我们根据实际需求,完全

    按照自己的想法定制解决方案,并且能一次性处理成百上千个文档中的所有数据。

    ★ 格式操作。前面“批量添加文本框”的问题就是一个典型的格式操作任务。而若想大量修

    改 Office 文件(无论 Excel 工作簿还是 Word 文档)的格式,只需通过“录制宏”等手段

    得到与格式有关的 VBA 代码,然后增加几行循环或判断的语句,就可以轻松实现。

    ★ 文本分析。在日常办公中,文字处理与数字计算同样常见,比如,在几百个 Word文章中

    找出所有的电话号码,并单独保存到一个 Excel 表格中。但是 Office 中的文字处理工具却

    远不如数字处理工具(公式、透视表等)丰富,因为文字处理需求复杂,很难找到统一的

    模式。而 VBA 不仅提供了大量文本函数,同时又支持正则表达式这个强大的文本分析工

    具。所以只要掌握了它们的用法,就可以针对自己的需求,编出各种自动化文本处理程序。

    ★ 创建模型。对于很多财金企业,最宝贵的资产之一就是各种分析模型。现实中,很多这种

    模型都保存在 Excel 中,以便业务人员快速得到数据分析结果。在这种情况下,使用 VBA

    程序来编写模型具有很多优势,比如,可以一键运行,从而简化操作、提供图形用户界面、自动生成批量的复杂报表、随机模拟仿真等。此外,将模型写成代码还可以设置一定的 “抄

    袭门槛” ,从而不会像公式那样让任何人都可以轻易读懂。

    ★ 自动办公。也许 VBA 最无可替代的优势就是其“自动化办公”能力。如前所述,Office

    软件中的各种操作都可以通过 VBA 代码“复现” ,而日常工作大多都是机械重复,所以

    完全可以让 VBA 自动处理这些琐事。比如自动生成并群发邮件、自动在多个文档中找到

    指定的数据并定时打印、自动对几百个文件进行分类并另存到不同的文件夹中等。

    ★ 其他方面。VBA 的能力并不局限于 Office 软件中,而是可以扩展到 Windows 操作系统、数据库管理系统甚至互联网等环境中。比如,可以在 VBA 程序中自动运行其他 Windows

    程序,还可以用 VBA 读写各种数据库、自动下载外部网站的网页内容等,而所有这些操

    作又都能够与 Office 软件结合起来。

    3. 怎样才能学好 VBA

    整体来说,VBA 的学习过程主要包括以下四个阶段。

    (1)培养编程思维

    VBA 是一门程序设计语言,而程序设计则是一种思维方式,即按照计算机的运作机制去思考写在前面

    VII

    问题,然后把自己的想法用计算机的方式加以表述。所以,学习程序语言最重要的并不是牢记各

    种关键字和语法,而是领会到它所蕴含的思维方式。笔者见过许多学习过多门计算机课程,甚至

    毕业于计算机专业,却仍然不会编程解决简单问题的人。究其原因,就是没有培养出编程思维。

    因此,对初学 VBA 的读者来说,首要任务就是真正理解程序语言的逻辑和计算机的工作方

    式,能够将自己日常工作的流程用 VBA 语言要素精确地表达出来。一旦具备了这种思维方式和

    表述能力,后面的学习就会事半功倍。

    (2)熟悉 Office 对象

    在理解了 VBA 的思维方式,熟悉了各种程序结构后,接下来的任务就是用这种语言发出命

    令,以操作 Office 软件。而将 VBA 程序与 Office 软件连接起来的桥梁就是 VBA 中的对象体系。

    Office 软件的每一个组件、每一种功能在 VBA 看来都是一个对象或一个属性方法。所以,只要

    知道了这些对象或属性方法的名字与格式,就能够在 VBA 程序中随意控制 Office 软件。

    (3)提高实践能力

    学习编程离不开大量的实践与练习。很多人在学习程序设计时都会感到:书上的内容看起来

    很好理解,可是一旦亲自编写程序就无从下手,写出的代码也总有莫名其妙的错误。这种情形持

    续一段时间后,学习者就会丧失信心与兴趣。

    若想摆脱这种困境,唯一的办法就是充分练习、积极实践。读者每学到本书的一个知识点,都应将书中的示例抄写在自己的电脑中,亲自运行并思考结果。在思考清楚后,凭借自己的理解

    和记忆将这个程序再“盲打”一遍并运行。只有完成这两个步骤,才算是完成了基本的练习,从

    而为下一个知识点的学习做好准备。

    而在完成练习之后,更重要的一环就是将学到的技术尽可能应用到日常工作中。比如,经常

    思考“刚才的操作是否可以用 VBA 搞定?” ,如果可以,就大胆尝试。如此不仅能巩固学到的知

    识,还会逐渐总结出自己的经验与方法,让使用 VBA 成为像走路、开车一样自然而然的习惯。

    (4)自学更多技能

    在实践中,读者总会遇到很多书中没有细讲的问题,这种现象十分正常,因为 VBA 的类库

    和系统函数成百上千,还会随着 Office 软件的升级而不断完善。同时随着技能和经验的提高,读

    者也会开始尝试编写更加复杂的程序,因而需要了解更多算法、网络和系统功能等方面的知识。

    显然,没有任何图书可以把以上所有的内容都涵盖在内,因而只有善于查阅资料并自学提高的人

    才能在掌握入门知识之后,进一步提高自身的水平。

    4. 这本书能提供什么帮助

    写本书之前,笔者曾经多年为高校经管专业的学生开设相关课程,并在网易云课堂

    (study.163.com)推出了广受好评的系列网络课程“全民一起 VBA” 。在这些教学活动中积累的经

    验与案例(特别是同学们对课程的反馈信息)为本书的内容编排提供了重要的指引。整体来说,本书并没有像传统教科书那样按照知识点的类别从下向上进行罗列,而是尽可能遵循初学者的认

    知过程,以实际应用为线索循序渐进。这样可以确保读者在每一部分只接触一个知识点,而且能

    够马上理解并将其应用到实际工作中。具体地说,本书的内容结构如下:

    第 1 章介绍 VBA 的编程环境与基本格式,特别是怎样用 VBA 代码读写 Excel 单元格。通过>> 深入浅出Excel VBA

    VIII

    对本章的学习,读者马上就可以开始编写简单的 VBA 程序,为后面的学习和练习奠定基础。

    第 2 章至第 7 章讲解了程序设计的基本元素与语法,包括变量、循环、判断、字符串、程序

    调试等内容。这一部分是培养编程思维的关键,所以请没有深入接触过程序设计的读者格外重视。

    而对于已经学习过其他语言的读者来说,VBA 也有很多独特的细节语法值得注意,本书对此均有

    详细说明。此外,与其他章节一样,笔者特别列出了初学者最容易犯的各种错误,并详细分析了

    每种错误所体现出的认识误区和解决办法。

    第 8 章至第 11 章重点介绍 VBA 的对象体系,以及过程、函数等结构化程序设计元素。学习

    了这些章节后,读者就可以用 VBA 代码全面控制 Excel 的基本功能与外观。

    前面 11 章内容相当于是 VBA 学习的“第一个循环” ,使读者全面了解 VBA 的体系并能够编

    程解决基本问题。在此基础上,本书第 12 章至第 18 章的内容构成了“第二个循环” ,使读者深入

    了解更多的 VBA 语法知识、编程技巧及对象功能,具体包括 VBA 的各种数据类型、数组的应用、文件系统的管理、函数与过程的高级知识、Range 对象的高级操作、Excel 事件与窗体编程等。在

    掌握这部分内容之后,读者将会对 VBA 编程有一个更加深刻的认识,从而能够理解和应对各种

    常见错误,开发出更加高效、强大和美观的程序。学习完这些章节后,读者可以算是真正具备了

    基本的 VBA 开发能力。

    第 19 章和第 20 章进一步扩展 VBA 的功能,介绍了怎样使用字典和正则表达式等高级工具,怎样读写数据库或 Word 等其他 Office 文档,怎样从互联网上下载网页数据,并且简要介绍了算

    法、类模块,以及管理信息系统和高级 Office 功能等知识。因篇幅所限,本书部分内容以数字形

    式发布于网站(http:www.broadview.com.cn35464)上。

    总之,本书的写作宗旨就是为广大初学编程的人提供一个既易学又深刻的、系统性的学习路

    线,语言风格也力求做到轻松活泼。此外,特别感谢大连医科大学艺术学院刘立伟副教授为本书

    各章首页绘制的精彩插图,希望读者能够借此加深对每章核心思想的印象。

    如果读者希望在学习过程中进一步加深理解,还可以与 “全民一起 VBA” 系列课程对照学习。

    所有购买本书的读者,均可以到电子工业出版社网站(http:www.broadview.com.cn35464)浏览

    该系列课程的“基础篇”内容,而全系列完整内容(包括“提高篇”和“实战篇” )则可以到网易

    云课堂(https:study.163.comseries1001373002.htm) 观看。这些视频课程中提供了丰富的动画和

    案例演示,可以帮助读者获得更好的学习效果,而且其中使用的案例与本书并不相同,可以互为

    补充。不过本书的章节结构与视频课程并不完全一致,对于某些知识点的取舍和深度也略有不同。

    因此,本书在每一章开头的摘要中都会指明本章内容所对应的视频课程章节,有兴趣的读者可留

    意对照。

    附赠内容标题(下载网址:http:www.broadview.com.cn35464)

    第 21章 平台的扩展——用 VBA 处理数据库和其他 Office文件

    第 22章 触角的延伸——获取网页数据

    目 录

    第 1章 奇境的入口——从 VBE 走进 VBA 编程世界...................................................1

    1.1 在哪里写代码——VBE 与模块...............................................................................................2

    1.1.1 找到 VBA 编辑器 ........................................................................................................2

    1.1.2 在正确的位置编写代码...............................................................................................4

    1.2 见微知著——从一个简单例子观察 VBA程序的结构..........................................................7

    1.2.1 Sub End Sub——程序的起始与结束.........................................................................8

    1.2.2 词汇与语句——程序语言的基本要素........................................................................9

    1.3 Cells 与运算符——用 VBA 控制 Excel 单元格...................................................................10

    1.3.1 Cells——代码与表格之间的第一个桥梁.................................................................. 11

    1.3.2 赋值操作——等号的主要用途..................................................................................12

    1.3.3 加、减、乘、除——基本的算术运算符..................................................................12

    1.4 VBA 程序的运行与保存——按钮、XLSM文件及宏安全性.............................................13

    1.4.1 宏与宏安全性.............................................................................................................14

    1.4.2 运行 VBA 程序的常用方法.......................................................................................14

    1.4.3 XLSM文件——VBA 程序的藏身之所....................................................................17

    本章小结..........................................................................................................................................18

    第 2章 程序的记忆——变量与常量..........................................................................19

    2.1 变量的作用与含义.................................................................................................................19

    2.1.1 为什么需要使用变量.................................................................................................19

    2.1.2 什么是变量.................................................................................................................21

    2.1.3 再问一次:什么是变量.............................................................................................22

    2.1.4 前后对比——使用变量的好处..................................................................................23

    2.2 没有规矩不成方圆——有关变量的最佳实践......................................................................24

    2.2.1 变量的命名.................................................................................................................24

    2.2.2 强制声明.....................................................................................................................28

    2.2.3 把重复数据都抽取为变量.........................................................................................31

    2.3 常量——那些重复却不变的内容..........................................................................................32

    本章小结..........................................................................................................................................35 >> 深入浅出Excel VBA

    X

    第 3章 力量的源泉——循环结构..............................................................................36

    3.1 循环结构概述.........................................................................................................................37

    3.2 For…Next 循环语句...............................................................................................................38

    3.2.1 For…Next 循环语句的基本语法...............................................................................38

    3.2.2 For…Next 循环的典型用法.......................................................................................40

    3.2.3 Step 子句.....................................................................................................................42

    3.2.4 For…Next 循环的“初学者陷阱”...........................................................................45

    3.3 用循环实现汇总——累加器与计数器..................................................................................48

    3.4 缩进与注释——提高代码的可读性......................................................................................50

    3.4.1 代码缩进.....................................................................................................................50

    3.4.2 代码注释.....................................................................................................................52

    本章小结..........................................................................................................................................53

    第 4章 智能的产生——判断结构..............................................................................54

    4.1 If 语句与关系运算.................................................................................................................55

    4.1.1 用 If 语句实现判断结构............................................................................................55

    4.1.2 用关系运算比较大小.................................................................................................57

    4.1.3 用 Else和 ElseIf 实现多分支判断.............................................................................57

    4.2 嵌套结构——多层 If 语句的使用.........................................................................................67

    4.3 逻辑表达式——怎样表示“与”“或”“非”......................................................................71

    4.3.1 逻辑表达式.................................................................................................................71

    4.3.2 常见逻辑运算符的使用方法.....................................................................................71

    4.4 Select…Case结构 ..................................................................................................................79

    4.4.1 Select…Case 结构的基本用法...................................................................................79

    4.4.2 在 Case语句中表示复杂条件...................................................................................80

    本章小结..........................................................................................................................................81

    第 5章 文字的表述——字符串基础..........................................................................83

    5.1 字符串的基本概念与格式.....................................................................................................84

    5.1.1 什么是字符串.............................................................................................................84

    5.1.2 区分字符串与变量.....................................................................................................86

    5.1.3 在字符串中表示特殊符号.........................................................................................86

    5.2 字符串的理解要点.................................................................................................................89

    5.2.1 空字符串.....................................................................................................................89

    5.2.2 非打印字符(空白字符).........................................................................................90

    5.2.3 区分大小写字符.........................................................................................................91

    5.2.4 区分数字与字符串.....................................................................................................91 目录

    XI

    5.3 字符串连接操作.....................................................................................................................92

    5.3.1 字符串连接符——“+”与“”............................................................................92

    5.3.2 灵活构造字符串.........................................................................................................93

    本章小结..........................................................................................................................................96

    第 6章 诊断的技巧——程序调试..............................................................................97

    6.1 程序错误的类型与排查.........................................................................................................97

    6.1.1 编译错误.....................................................................................................................98

    6.1.2 运行时错误.................................................................................................................99

    6.1.3 逻辑错误...................................................................................................................100

    6.2 使用断点与监视...................................................................................................................101

    6.2.1 “望闻”之术——设置断点......................................................................................101

    6.2.2 “问”的技巧——添加监视......................................................................................102

    6.2.3 “切”脉秘籍——让程序单步执行..........................................................................104

    6.3 代码“无间道”——Debug.Print 与立即窗口....................................................................109

    本章小结........................................................................................................................................ 110

    第 7章 维度的拓展——再谈循环结构..................................................................... 111

    7.1 多重循环............................................................................................................................... 112

    7.1.1 双重循环的概念....................................................................................................... 112

    7.1.2 初学者常见错误....................................................................................................... 114

    7.1.3 更多层次的嵌套循环............................................................................................... 119

    7.2 While 循环............................................................................................................................120

    7.2.1 Do While 循环的基本用法.......................................................................................120

    7.2.2 While循环结构的初学者陷阱................................................................................123

    7.2.3 Do While 循环的典型应用.......................................................................................125

    7.2.4 While循环的各种形式............................................................................................129

    7.3 Exit 语句与 Goto 语句.........................................................................................................131

    7.3.1 跳出当前结构——Exit 语句的使用........................................................................131

    7.3.2 随心所欲难免逾矩——Goto 语句及其利弊...........................................................133

    7.3.3 异常处理——On Error Goto 语句...........................................................................134

    本章小结........................................................................................................................................137

    第 8章 名字的魔力——面向对象与录制宏..............................................................138

    8.1 面向对象——程序员的世界观............................................................................................139

    8.1.1 面向过程与面向对象简述.......................................................................................139

    8.1.2 类、对象、属性、方法...........................................................................................141

    8.2 从 Range 看 VBA 对象的使用方法.....................................................................................143 >> 深入浅出Excel VBA

    XII

    8.2.1 Range 对象概述........................................................................................................143

    8.2.2 Range 对象的基本用法与技巧................................................................................144

    8.2.3 设置单元格格式—— 字体、颜色及 With 结构....................................................150

    8.2.4 智能提示——使用 As 关键字声明对象类型.........................................................156

    8.3 Excel 对象体系.....................................................................................................................157

    8.3.1 了解所有对象——对象浏览器与 MSDN ...............................................................157

    8.3.2 最常用的 Excel 对象................................................................................................159

    8.4 打开黑箱看代码——录制宏................................................................................................160

    8.4.1 宏的录制过程...........................................................................................................160

    8.4.2 宏代码的解读与运用...............................................................................................162

    8.4.3 对录制宏代码的初步优化.......................................................................................164

    本章小结........................................................................................................................................165

    第 9章 能力的释放——批量处理工作表与工作簿...................................................166

    9.1 个体与集合——再谈 Excel 常用对象间的关系.................................................................167

    9.2 工作表对象...........................................................................................................................168

    9.2.1 为 Range对象指定所属工作表...............................................................................168

    9.2.2 技巧与陷阱——With与 Range................................................................................170

    9.2.3 最佳实践——按名引用工作表................................................................................172

    9.2.4 遍历所有工作表.......................................................................................................172

    9.2.5 多个工作表汇总的常用技巧...................................................................................175

    9.2.6 工作表的其他常用操作...........................................................................................180

    9.3 工作簿对象...........................................................................................................................183

    9.3.1 工作簿文件的打开、保存与关闭...........................................................................183

    9.3.2 常用技巧——工作簿的拆分与汇总........................................................................187

    本章小结........................................................................................................................................191

    第 10章 结构的艺术——过程、函数与字符串处理.................................................193

    10.1 子过程与“结构化程序设计”.........................................................................................194

    10.1.1 子过程基本概念与调用方法.................................................................................194

    10.1.2 变量的作用域.........................................................................................................198

    10.1.3 参数的概念.............................................................................................................199

    10.1.4 子过程与参数的更多细节.....................................................................................202

    10.2 函数与自定义公式.............................................................................................................204

    10.2.1 函数的格式与功能.................................................................................................204

    10.2.2 将函数作为表格公式.............................................................................................209

    10.2.3 系统函数................................................................................................................. 211

    10.2.4 Msgbox 函数...........................................................................................................212 目录

    XIII

    10.3 字符串函数.........................................................................................................................214

    10.3.1 计算字符串长度.....................................................................................................214

    10.3.2 将字符串规范化.....................................................................................................215

    10.3.3 替换文本.................................................................................................................217

    10.3.4 子串操作.................................................................................................................218

    10.3.5 字符串函数的应用.................................................................................................222

    本章小结........................................................................................................................................223

    第 11章 万物的源头——Application 对象...............................................................225

    11.1 隐藏的Application 对象....................................................................................................226

    11.1.1 Cells 的真实来历....................................................................................................226

    11.1.2 与 Cells类似的情况...............................................................................................227

    11.2 通过WorksheetFunction 属性调用公式............................................................................229

    11.3 Application 的其他属性与方法..........................................................................................232

    11.3.1 常用属性.................................................................................................................232

    11.3.2 常用方法.................................................................................................................235

    本章小结........................................................................................................................................236

    第 12章 细分的好处——VBA 数据类型..................................................................238

    12.1 VBA 数据类型概述............................................................................................................239

    12.1.1 为什么要划分数据类型.........................................................................................239

    12.1.2 变体类型的功与过.................................................................................................240

    12.1.3 VBA 中的数据类型概览........................................................................................243

    12.2 数字类型.............................................................................................................................244

    12.2.1 常用类型:Integer、Long 和 Double(符号问题)............................................244

    12.2.2 其他类型:Byte、Single、Currency 和 Decimal .................................................246

    12.2.3 简写符号.................................................................................................................248

    12.2.4 初学者陷阱:常数有时也要声明类型.................................................................248

    12.2.5 自动类型转换与强制类型转换.............................................................................250

    12.3 字符串类型.........................................................................................................................253

    12.3.1 字符的本质.............................................................................................................253

    12.3.2 像数字一样处理字符串.........................................................................................255

    12.4 日期类型.............................................................................................................................258

    12.4.1 日期和时间的一般表示.........................................................................................259

    12.4.2 常用日期函数.........................................................................................................259

    12.4.3 日期类型的本质.....................................................................................................265

    12.5 逻辑类型.............................................................................................................................266

    12.5.1 逻辑值与逻辑运算.................................................................................................266 >> 深入浅出Excel VBA

    XIV

    12.5.2 逻辑类型的应用.....................................................................................................269

    12.6 对象类型.............................................................................................................................272

    12.7 数据类型的检测.................................................................................................................273

    12.8 “无”的各种表示方法——Nothing、Null 与 Empty .......................................................275

    本章小结........................................................................................................................................275

    第 13章 集体的名义——VBA 中的数组..................................................................277

    13.1 数组的基本概念.................................................................................................................278

    13.1.1 什么是数组.............................................................................................................278

    13.1.2 数组声明中的细节问题.........................................................................................279

    13.1.3 数组的用途与技巧.................................................................................................281

    13.2 动态数组.............................................................................................................................285

    13.2.1 动态数组与 ReDim 语句........................................................................................285

    13.2.2 使用 Split 拆分字符串............................................................................................287

    13.3 多维数组与表格读写.........................................................................................................289

    13.3.1 什么是二维数组.....................................................................................................289

    13.3.2 二维数组与 Range 对象.........................................................................................291

    13.3.3 多维数组的概念.....................................................................................................293

    本章小结........................................................................................................................................294

    第 14章 信息的整合——文件与文件夹操作............................................................295

    14.1 读写文本文件.....................................................................................................................296

    14.1.1 什么是文本文件.....................................................................................................296

    14.1.2 文本文件的打开与读取.........................................................................................296

    14.1.3 将数据写入文本文件.............................................................................................300

    14.2 打开文件夹中的所有文件.................................................................................................302

    14.2.1 Dir 函数的基本用法...............................................................................................302

    14.2.2 Dir 函数的更多技巧...............................................................................................303

    14.3 其他文件操作简介.............................................................................................................305

    本章小结........................................................................................................................................306

    第 15章 选择的自由——自定义参数及其他函数技巧.............................................307

    15.1 可选参数.............................................................................................................................308

    15.1.1 Optional 与默认值..................................................................................................308

    15.1.2 可选参数的省略与按名传递.................................................................................309

    15.1.3 判断可选参数是否被使用..................................................................................... 311

    15.2 引用传递与值传递.............................................................................................................312

    15.3 随机数函数的使用.............................................................................................................314 目录

    XV

    15.3.1 Rnd 函数的基本用法.............................................................................................314

    15.3.2 深入了解: “伪”随机数与“种子”...................................................................316

    本章小结........................................................................................................................................318

    第 16章 区域的管理——深入了解 Range对象.......................................................320

    16.1 遍历 Range内部单元格.....................................................................................................321

    16.1.1 Cells 属性................................................................................................................321

    16.1.2 自定义公式.............................................................................................................322

    16.1.3 Rows 与 Columns 属性...........................................................................................323

    16.2 获取 Range对象的描述信息.............................................................................................324

    16.2.1 位置信息.................................................................................................................324

    16.2.2 公式信息.................................................................................................................325

    16.2.3 合并单元格信息.....................................................................................................326

    16.3 重新定位 Range 对象.........................................................................................................329

    16.3.1 Offset、Resize 与 CurrentRegion 属性..................................................................329

    16.3.2 Worksheet 对象的 Cells 与 UsedRange 属性.........................................................333

    16.3.3 Application 对象的 Union 与 Intersection 方法.....................................................334

    16.4 Find 与Sort 方法简介........................................................................................................334

    16.4.1 Range.Find 方法.....................................................................................................334

    16.4.2 Range.Sort 方法......................................................................................................336

    本章小结........................................................................................................................................337

    第 17章 “神经”的连通——编写事件处理程序.....................................................339

    17.1 事件编程基本概念与过程.................................................................................................340

    17.1.1 事件与事件响应.....................................................................................................340

    17.1.2 事件编程的基本步骤.............................................................................................340

    17.2 Excel 常用事件...................................................................................................................343

    17.2.1 工作表事件.............................................................................................................343

    17.2.2 工作簿常用事件.....................................................................................................347

    17.3 事件级联.............................................................................................................................348

    17.4 访问修饰符与静态变量.....................................................................................................350

    17.4.1 访问修饰符.............................................................................................................350

    17.4.2 静态变量.................................................................................................................352

    17.4.3 静态变量在事件处理中的应用.............................................................................353

    本章小结........................................................................................................................................355

    第 18章 界面的革新——设计用户窗体...................................................................356

    18.1 窗体程序开发过程.............................................................................................................357

    18.1.1 窗体与控件.............................................................................................................357 >> 深入浅出Excel VBA

    XVI

    18.1.2 窗体模块与设计器.................................................................................................357

    18.1.3 指定属性和外观.....................................................................................................359

    18.1.4 为窗体事件编写代码.............................................................................................361

    18.1.5 窗体的显示与退出.................................................................................................363

    18.2 窗体与常用控件的属性、事件和方法.............................................................................365

    18.2.1 窗体对象.................................................................................................................365

    18.2.2 标签与文本框.........................................................................................................367

    18.2.3 列表框与组合框.....................................................................................................369

    18.2.4 单选按钮、复选框及框架.....................................................................................372

    18.2.5 窗体控件综合案例——将数据录入工作表..........................................................375

    18.3 其他常用控件及附加控件.................................................................................................378

    18.3.1 其他常用控件简介.................................................................................................378

    18.3.2 附加控件的使用.....................................................................................................379

    18.4 关于窗体与控件的其他要点.............................................................................................383

    18.4.1 多窗体协同.............................................................................................................383

    18.4.2 多个控件的对齐.....................................................................................................383

    18.4.3 工作表中的 ActiveX 控件......................................................................................384

    本章小结........................................................................................................................................385

    第 19章 工具的升级——集合、字典及正则表达式.................................................386

    19.1 集合对象.............................................................................................................................387

    19.2 字典对象.............................................................................................................................388

    19.2.1 使用 CreateObject 创建外部对象..........................................................................388

    19.2.2 字典的概念与应用.................................................................................................390

    19.2.3 字典的其他常用属性与方法.................................................................................393

    19.3 正则表达式入门.................................................................................................................394

    19.3.1 什么是正则表达式.................................................................................................395

    19.3.2 正则表达式的基本语法.........................................................................................396

    19.3.3 在 VBA 中使用正则表达式...................................................................................410

    本章小结........................................................................................................................................415

    第 20章 天地的无穷——那些未及细说的主题........................................................416

    20.1 类模块与自定义类.............................................................................................................417

    20.2 开发小型管理信息系统.....................................................................................................418

    20.3 深入操作 Office 软件与Windows 系统............................................................................421

    20.4 算法的价值.........................................................................................................................421

    结语 VBA的未来....................................................................................................423

    第1 章

    奇境的入口——

    从V B E 走进V B A 编程世界

    在大多数用户眼里,Excel 等 Office 软件的形象总是简单易用、人畜无害,从未想过它的内部

    居然隐藏着一个完全由程序代码支配运转的奇妙世界,更没想过我们自己也可以进入和主宰这个

    世界,并通过 VBA 唤醒 Office 的巨大魔力。所以作为全书学习的开始,本章首先介绍怎样找到

    这个开发和运行 VBA 程序的地方,也就是 VBE(VBA 编辑器)。

    接下来,我们将会介绍 VBA 程序开发的完整过程。人们常说,把大象放到冰箱里只需要三

    个步骤:打开冰箱门→把大象放进去→关好门让冰箱工作。编写 VBA 程序也无非如此:打开

    VBE→把正确的代码写进去→保存并让程序运行。针对这三个步骤,本章将会引导读者亲手编写

    一个简单的 VBA 程序并逐条领会,同时也让读者感受从零开始编写第一个 VBA 程序的乐趣。

    具体来说,通过本章的学习,大家将能够理解和回答以下问题:

    ★ 怎样进入 VBA 编辑器?在哪里编写 VBA 程序?

    ★ VBA 程序一般是什么样子的?

    ★ 怎样使用 VBA 程序读取和计算 Excel 表格中的内容?

    ★ 怎样运行 VBA 程序?如果 Excel 禁止运行 VBA 程序怎么办?

    ★ 怎样正确保存 VBA 程序?

    本章内容可以与视频课程“全民一起VBA——基础篇”的第一回“生平不识VBE,便想编程也枉

    然”和第二回“宏代码初现真面目,Cells 遥指单元格”配合学习,通过动画演示和课堂讲解,更加深

    入地理解相关知识点。

    >> 深入浅出Excel VBA

    1.1 在哪里写代码——VBE 与模块

    1.1.1 找到VBA编辑器

    在所有允许编写VBA①的Office软件(如Word、Excel、PowerPoint……)中,都提供了一个专

    门用于开发VBA程序的工具,称为VBA编辑器,简称为VBE(Visual Basic Editor),如图 1.1 所示

    如无特别说明,本书全部截图均来自Office 2016 版本)。 (

    图1.1 VBA 编辑器外观(截图自Excel 2016中文版)

    在默认情况下,Office 将 VBE 设置为隐藏状态,无法被用户看到,所以需要手动将其设置为

    可见状态。由于不同操作系统或不同版本 Office 的设置方法各有差别,所以下面以 Excel 的不同

    版本为例分别进行描述。

    (1)对于在Windows系统中使用Excel 2010 及之后版本的用户,在Excel中选择 “文件” → “选

    项”命令,可以弹出“Excel选项”对话框。先在该对话框左侧选择“自定义功能区” ,然后在右

    侧栏目中选中“开发工具” ,再单击“确定”按钮,就可以在工具栏中看到“开发工具”选项卡②。

    该选项卡中包含了编写VBA程序时可能用到的各种功能,其左边第一个按钮就是VBE,如图 1.2

    所示。

    (2)Excel 2007 的设置方法与上述过程类似,只是菜单的名称位置略有不同:首先单击 Excel

    左上角带有 Office 标志的“Office”按钮,然后单击右下角的“Excel 选项”按钮,此时在“常用”

    菜单界面的右侧可以看到“开发工具”选项卡,将其选中就可以找到“VBE”按钮。而对于 Excel

    2003 及之前版本,可以先在 Excel 的“工具”菜单中找到子菜单“宏” ,然后单击右边的三角形按

    钮展开子菜单,再选中“Visual Basic 编辑器” ,就可以直接进入 VBE 界面。

    ① 并非全部 Office 软件都支持用户开发 VBA 程序。比如在写作本书时,OneNote 2016 就没有提供 VBA 开发功

    能。同样,在某些运行于苹果电脑的早期版本 Office for Mac OS 中,也可能不支持 VBA 功能。

    ② 找到“开发工具”选项卡的另一种方法:直接在 Excel 工具栏的空白处单击鼠标右键,在弹出的菜单中就可

    以看到“自定义功能区”菜单项。

    2 第 1章 奇境的入口——从VBE走进VBA编程世界

    图1.2 在Excel 2010及更新版本中显示“VBE”按钮的步骤

    关于在 Excel 2007 及其他各版本中找到 VBE 的方法, “全民一起 VBA——基础篇”第一回 4:30

    处有详细视频讲解。

    需要说明的是,在早期版本的 Office 中,VBA 开发工具不属于 Office 软件的默认安装项目,如果用户在安装 Office 时没有特别指定安装 VBA,就无法在 Office 中找到该功能。在这种情况下,我们需要单独为其安装 VBA。

    (3)对于使用 Office for Mac OS 系统的苹果电脑用户,找到 VBE 的方法与使用 Windows 系

    统的用户类似,一般要先在 Excel 的“偏好设置(Preference) ”菜单中找到“功能区和工具栏”选

    项,然后可以看到“自定义功能区”选项,再选中“开发工具”就可以看到该选项卡。

    经过以上步骤,我们终于看到了 VBE 的真面目。不过对于没有学习过程序设计的读者,第一

    次看到 VBE 的界面可能会觉得眼花缭乱,让人望而生畏。其实大可不必担心,因为我们只需用到

    其中的三个部分——工程窗口、代码窗口和运行按钮——就足以开发基本的 VBA 程序,最重要的

    是怎样在“工程窗口”中找到编写代码的正确位置,如图 1.3 所示。至于 VBE 的其他功能,本书

    会随着学习的深入适时讲解。

    图1.3 VBA 编辑器的主要功能区

    3 >> 深入浅出Excel VBA

    1.1.2 在正确的位置编写代码

    1. 工程与模块

    在实际工作中,我们经常会在一个 Office 文件中写多个 VBA 程序,分别完成不同的任务。

    比如,在一个存放工资表的 Excel 工作簿文件中,就可能需要编写“计算所得税”“生成统计表”

    “打印工资条” 等不同用途的程序。随着时间的变化,我们会在这个工作簿中不断编写更多的 VBA

    程序,逐渐使所有工资管理工作都做到自动化处理。这样一个文件中保存的 VBA 程序可能多达

    几十个甚至上百个,翻阅起来将十分吃力。

    怎样能够把这些程序保存得井井有条,便于查阅和修改呢?VBA 引入了“工程(Project) ”

    和“模块(Module) ”两个概念来对不同类型和用途的代码进行系统化管理。一个 VBA 工程,就

    是针对某个 Office 文件编写,并且保存在这个 Office 文件中的所有 VBA 程序。为了让这些程序

    被保管得有序,每个工程会被进一步划分为多个“模块” ,分别存放不同类型或功能的 VBA 程序。

    这个结构与 Windows 系统的文件管理模式十分相似:一个工程就像一个硬盘分区(如“D:” ),一个模块则是该分区下的一个文件夹(如“D:\Print\” ),每个 VBA 程序则如同一个文件,需要根

    据其特点存放到某个文件夹中。VBE 的“工程”窗口,就像Windows 系统的“我的电脑”窗口专

    门用来查看和管理“文件”与“文件夹” ,也就是模块和 VBA 程序。VBA 工程结构与 Windows

    系统文件结构的对比如图 1.4 所示。

    图1.4 VBA 工程结构与Windows系统文件结构的对比

    根据语法特点与运行方式,VBA 程序可以分为四种类型。相应地,VBA 工程中也包含四种

    类型的模块,分别存放每种类型的程序。

    2. 事件程序与 Office 对象模块

    事件程序是一种能够在用户执行某个 Office 操作时自动运行的程序。当用户在表示“年龄”

    的单元格中输入一个数字时,就可以自动运行一个事件程序,判断该数字是否在规定范围内。

    在 Excel 中,用户的日常操作主要针对“工作表”和“工作簿”两种对象,比如在工作表中

    选中一个单元格,或者将工作簿保存并关闭等。所以,Excel 的 VBA 工程为每个工作表和工作簿

    都安排了一个单独的模块,用于存放针对该工作表或工作簿的事件程序。假如一个 Excel 文件中

    包含两张工作表,那么我们就能够在 VBE 的工程窗口中看到两个工作表模块和一个工作簿模块。

    4 第 1章 奇境的入口——从VBE走进VBA编程世界

    用鼠标在工程窗口中双击上述任何一个模块,就可以在右侧代码窗口中看到这个模块中的所有程

    序,并且可以添加新的程序。Excel 对象模块(事件程序)示例如图 1.5 所示。

    当用户在 Sheet2 工作表中双击

    某个单元格时自动执行

    这个事件程序的触发条件:

    图1.5 Excel对象模块(事件程序)示例

    如果是在 Word 或 PowerPoint 等 Office 软件中编写 VBA 程序,那么可以在它们的 VBE 中看

    到对象模块,只不过它们被统称为“Word对象”“PowerPoint 对象”等,里面的具体模块则是“文

    档”“幻灯片”等对应元素。关于事件程序的具体内容和开发方法,本书后面将会详细介绍。

    3. 标准程序与标准模块

    事件程序必须与某个特定的对象(如第二张工作表)和某种特定的操作(如单击单元格)捆

    绑在一起,只有当用户在该对象中执行这个操作时才会运行。而我们在实际工作中编写的大多数

    VBA 程序,却是希望用户可以随时随地运行,不需要和任何特定对象或操作发生关联。这种“更

    为常见”的程序,就称为“标准程序” ,相应的代码需要保存在“标准模块”中。

    与事件模块不同,VBA 工程中没有事先准备好标准模块,需要我们在工程窗口手工创建。在

    工程窗口的任意空白位置单击鼠标右键,在弹出的菜单中选择“插入”→“模块”命令,就可以

    向这个工作簿的工程中添加一个标准模块,如图 1.6 所示。请注意,由于标准模块非常常用,在

    工程窗口中直接将“标准模块”简称为“模块” ,所以读者在阅读本章时不要将其与广义的“模块”

    一词(涵盖事件模块、标准模块、窗体、类定义等)混淆。

    我们可以反复执行上面的“插入”操作,在一个 VBA 工程中添加多个标准模块,把将要

    编写的众多 VBA 程序按照业务功能等方式分别保存到不同的模块中,便于查阅和管理。在工

    程窗口中双击任何一个模块,右侧的代码窗口都会切换到该模块,显示这个模块中的所有 VBA

    代码。

    日常编写的 VBA 程序大多属于标准程序,所以标准模块的使用也将贯穿本书始终。

    5 >> 深入浅出Excel VBA

    在工程窗口单击鼠标右

    键,即可插入模块

    图1.6 在VBA工程中插入标准模块

    4. 图形界面程序与窗体模块

    为了让程序更加友好,方便用户操作,我们还会经常编写一些具有图形用户界面(GUI)的

    程序。因为开发这些程序时不仅需要编写代码,而且需要使用 VBE 提供的专门绘制窗体、按钮

    等元素的绘图工具,所以这些 VBA 程序也被单独分为一类,需要保存到窗体类型的模块中。

    与标准模块一样,VBA 工程事先也没有提供任何窗体模块。我们可以在工程窗口的空白处单

    击鼠标右键,在弹出的菜单中选择“插入”→“用户窗体”命令,就可以在当前工程中插入一个

    窗体模块。当界面要求比较复杂,需要设计多个不同的窗体时,可以反复执行“插入”操作,创

    建多个窗体模块,每个模块能且只能保存一个窗体。双击一个窗体模块,就可以在右侧代码窗口

    中看到“窗体设计器” ,也就是绘制图形界面的工具。双击正在其中绘制的用户窗体,代码窗口就

    切换为代码模式,用于显示和编辑这个窗体对应的程序代码。窗体模块与窗体设计器示例如图 1.7

    所示。

    对于用户窗体和图形界面设计的详细内容,本书后面有专门章节进行讲述。

    图1.7 窗体模块与窗体设计器示例

    6 第 1章 奇境的入口——从VBE走进VBA编程世界

    5. 类定义程序与类模块

    VBA 的高级用户有时还会用到定义“类”的程序。 “类”是“面向对象”这种程序设计思想

    中的一个基础概念,按照这种思想编写的代码,只需稍加修改就能够重新用于其他系统中,从而

    使开发者在设计新系统时不必重写功能相似的代码,减轻了工作压力。

    与标准模块相似,开发类定义程序必须先在工程窗口中弹出“插入”菜单,然后插入一个类

    模块,双击类模块就可以在代码窗口中显示和编辑类定义程序。

    对于 VBA 的初学者来说,类定义并不常用,所以本书将相关内容放在最后介绍。

    以上就是 VBA 程序的四种类型,以及对应的四种存储模块。其中最常用的就是标准程序与

    标准模块,所以本书后面将主要基于这类程序讲解 VBA 语法知识。

    需要特别说明的是,当一个工作簿中包含的 VBA 程序较多时,为使工程结构更加清晰,我

    们不仅会建立多个模块保存不同用途的程序,还会为这些模块重新命名,使其内容一目了然。为

    模块命名的方式很简单,只要在 VBE 中按“F4”键,或者在 VBE 的“视图”菜单中选中“属性

    窗口”选项,就可以在“工程”窗口的下方看到“属性”窗口。在“工程”窗口中选中一个模块,就可以在“属性”窗口中修改该模块的名称,如图 1.8 所示。注意,此操作仅适用于标准模块、窗体模块和类模块,Office 对象模块的模块名称不允许被修改。

    图1.8 修改模块的名称

    1.2 见微知著——从一个简单例子观察VBA 程序

    的结构

    如前所述,标准程序是最常用到的 VBA 程序类型,所以就以它为例,了解一下 VBA 程序代

    码的基本结构。

    7 >> 深入浅出Excel VBA

    首先,在 VBE 的“工程”窗口中插入一个模块,然后双击该模块,便可以在“代码”窗口中

    编写标准程序。下面就是我们的第一个 VBA 小程序,大家只要一字不差地输入代码,并单击工

    具栏上的“运行”按钮 ,就可以看到这段程序的运行结果——让当前工作表 C2 单元格中的内

    容变成 5、C3 单元格中的内容变成 6,如图 1.9 所示。

    图1.9 编写并运行第一个VBA程序的步骤

    1.2.1 Sub End Sub——程序的起始与结束

    观察图 1.9 中的代码可以看到,这个 VBA 程序是以“Sub”开始、以“End Sub”结束的若干

    行字符。而 Sub 后面的文字“Demo”就是我们为这个 VBA 程序指定的名称(读者可以根据自己

    的喜好把它改为其他字母或汉字)。当用户要求运行某个程序时,计算机就先找到含有该程序名称

    的 Sub 语句,然后开始运行它下面的每一行代码,直到遇见“End Sub”为止。

    我们可以把“Sub”和“End Sub”理解为一个 VBA 程序的“国境线” :凡是写在一对“Sub”

    和“End Sub”之间的代码,都属于这个 VBA 程序。这样,当一个模块中存放了多个程序时,每

    个程序的“势力范围”都可以划分清楚且互不干扰(为了让程序之间的分界看起来更加清楚,VBE

    的代码窗口还会自动在每个 VBA 程序之间添加一条直线),如图 1.10 所示。

    此外需要注意的是,在程序名 Demo 的后面必须加一个圆括号(如果忘记书写,VBE 会自动

    将其添加到代码中)。Sub 语句中的圆括号用于过程间的参数传递,对此本书后面会有专门章节进

    行介绍。

    8 第 1章 奇境的入口——从VBE走进VBA编程世界

    图1.10 VBA 程序的基本结构与边界

    1.2.2 词汇与语句——程序语言的基本要素

    我们日常使用的语言是以“语句”为基本单位的,下面这段话就包括三个语句,分别用句号

    和问号隔开。

    “我明天去上海。上海的天气怎么样?是否需要带一把雨伞?”

    我们在理解上面这段话时,会先把它分解成三个语句,然后分析每个语句的含义。而对于其

    中的每一个语句,比如“我明天去上海” ,还要进一步将它分解为“我”“明天”“去”和“上海”

    四个词汇,再对应到大脑中已有的概念和印象,才能得出这句话的正确含义。

    同样的,VBA 等程序语言也需要按照“语句”和“词汇”的模式进行表达,即一个程序由一

    条或多条语句构成,每条语句由一个或多个词汇构成。

    1. VBA 语句及其分隔符

    与人类语言不同的是,VBA程序中的语句不是通过句号、问号等标点符号隔开的,而是通过

    “换行”来分隔的。也就是说, “代码”窗口中的每行代码代表一条语句,即每条程序语句必须写

    在同一行中①。

    所以在图 1.9 所示的 VBA 程序示例中, “代码”窗口内一共有四条语句(四行代码)。第一条

    语句“Sub Demo”和最后一条语句“End Sub”标识了程序的开始位置和结束位置,其内部的第

    二条和第三条语句则用来实现该程序的主要功能。

    不过有的时候需要书写很长的语句,如果强行把它写在一行代码中,会严重影响美观和阅读

    效率。在这种情况下,我们可以使用空格与下画线将一条语句进行拆分,如图 1.11 所示。

    ① VBA 程序中使用的 VB 语言只是常用程序语言中的一种,其他程序语言对语句的格式可能会有不同的规定。

    比如 C 语言中使用分号作为语句结束标志,因此一个语句完全可以拆写到多行中,只要最后有一个分号使其

    与下一行代码分开即可。

    9 >> 深入浅出Excel VBA

    图1.11 使用空格和下画线将代码拆写成两行

    同时,VBA 也允许我们使用冒号“:”将多个短语句合并到一行代码中,从而节省空间,增

    强代码的可读性。具体用法如图 1.12 所示。

    图1.12 使用冒号将多行代码合并

    初学者需要特别注意的是:这里提到的所有符号,包括空格、冒号、下画线、圆括号等,必须

    使用英文半角格式,不能使用全角格式。虽然它们的外观十分相似,但完全是不一样的字符,不能

    混淆使用!这一点对于后面的章节同样适用,请格外注意。

    2. VBA 词汇及其分隔符

    每一条VBA语句都是由一个或多个词汇构成的。比如Demo程序内部的第一条语句“Cells(2,3)

    = 5” ,可以初步分解为“Cells(2,3)”“=”“5”三个词汇①。在这三个词汇中, “=”也起到了分隔符

    的作用,使VBA能够正确地分隔辨识出每个词汇。

    较常见的词汇分隔符是空格。比如在第一条语句的“Sub”和“Demo”之间及最后一条语句

    的“End”和“Sub”之间,都有一个空格作为分隔符。这种使用空格来区分不同单词的习惯,来

    自英语等表音文字。

    如果在代码中不小心忘记了书写空格,最后一行语句就会变成“EndSub” 。在这种情况下,计算机认为该语句只包含一个叫作“EndSub”的单词,而不会把它解读为“End”和“Sub”两个

    单词,因而无法将这一语句理解为“程序结束标志” ,导致程序运行出错。

    1.3 Cells与运算符——用VBA控制Excel单元格

    理解了VBA程序的基本结构,我们接下来就仔细研究一下这个示例程序中的代码 “Cells(2,3)=5”

    到底是什么意思。

    ① 之所以将其称为“初步分解” ,是因为 VBA 解释器会将 Cells(2,3) 进一步拆解为属性名称与参数列表,以便

    分析。不过对于初学者来说,只需了解到词汇的基本含义即可。

    10 第 1章 奇境的入口——从VBE走进VBA编程世界

    1.3.1 Cells——代码与表格之间的第一个桥梁 1.3.1 Cells——代码与表格之间的第一个桥梁

    想在VBA程序中读取或修改单元格的内容,就必须知道怎样使用VBA代码表示一个单元格。

    熟悉 Excel 公式的读者都知道,在表格公式中我们可以直接用单元格的地址(如 C2)代表一个单

    元格的内容。但是 VBA 程序并不支持这种表示方法,而是提供了若干种方法在代码中表示 Excel

    单元格,Cells 属性就是其中之一(关于“属性”的概念,本书后面讲解 Excel 对象体系时会详细

    介绍)。

    想在VBA程序中读取或修改单元格的内容,就必须知道怎样使用VBA代码表示一个单元格。

    熟悉 Excel 公式的读者都知道,在表格公式中我们可以直接用单元格的地址(如 C2)代表一个单

    元格的内容。但是 VBA 程序并不支持这种表示方法,而是提供了若干种方法在代码中表示 Excel

    单元格,Cells 属性就是其中之一(关于“属性”的概念,本书后面讲解 Excel 对象体系时会详细

    介绍)。

    Cells 属性的写法很容易理解:用两个数字分别表示该单元格所在的行号和列号,对应关系如

    图 1.13 所示。需要特别注意的是:这两个数字必须使用逗号(如前所述,必须使用半角符号,下

    同)隔开,并用一对圆括号将它们括起来,紧随在“Cells”的后面。

    Cells 属性的写法很容易理解:用两个数字分别表示该单元格所在的行号和列号,对应关系如

    图 1.13 所示。需要特别注意的是:这两个数字必须使用逗号(如前所述,必须使用半角符号,下

    同)隔开,并用一对圆括号将它们括起来,紧随在“Cells”的后面。

    第 2行 第 3列

    图1.13 使用Cells属性表示单元格

    这种用括号把若干个数值包含起来的写法,在 VBA 程序中十分常见。一般情况下,括号中

    用逗号隔开的每个数值称作一个“参数” 。在上面的例子中,我们可以说“Cells 属性需要指定两

    个参数,第一个参数代表行号,第二个参数代表列号” 。关于参数的更多知识,在讲解子过程与函

    数时会深入介绍。

    熟悉表格公式的读者,可能对这种完全使用数字表示单元格的方式有些不习惯。其实Cells的第二

    个参数也可以使用字母表示,比如上例也可以写成 Cells (2 , “C” ) = 5,同样能够将C2 单元格的内容设

    置为 5(注意字母两边必须有双引号)。不过在实际开发中,使用数字定位单元格会更便利,因为数字

    通过简单的计算就可以得到,便于批量处理或快速定位。读者可以比较一下, “将 C5 单元格右边第 47

    列涂成红色”与“将第 5 行第 3 列单元格右边第 47 列涂成红色” ,哪一个处理起来更加简单。显然,第二种方法只要计算一下“3 + 47” ,就能知道只需将 Cells ( 5 , 50 )设置为红色即可。而使用第一种

    方法,则需要想办法计算出字母 C 后面第 47 列的名称——AX,才能处理这个单元格,过程相对复杂

    许多。

    11 >> 深入浅出Excel VBA

    Cells 属性如同一个连接 VBA 代码与 Excel 表格的桥梁,使我们能够用 VBA 表示任何一个单

    元格,接下来的问题就是怎样修改单元格中的内容。

    1.3.2 赋值操作——等号的主要用途

    所谓修改单元格中的内容,就是让单元格中的内容等于某个数值(或文字等)。因此,VBA

    程序就使用等号“=”来实现这个功能。比如 Cells(2,3)=5 这句代码,翻译为自然语言就是“让第

    2 行第 3 列单元格的内容等于 5” 。

    这种操作在 VBA 语言中被称为“赋值操作” ,也就是将等号右边的值赋予等号左边的元素。

    当计算机执行到赋值操作的语句时,会首先计算等号右边的部分,得到一个确切的结果后再把这

    个结果赋值给等号左边的元素。比如对于 Cells(2,3)= 5 + 3 这个语句,计算机会首先处理等号

    右边的“5 + 3” ,待计算出最终结果“8”后,再将其赋值给等号左边的 Cells 属性,让 C2 单元格

    的内容变成“8” 。

    对于初学程序设计的读者来说,理解“赋值”的含义,以及赋值语句“先右后左”的执行过程十

    分重要。否则,如果将等号误解为“等式”的意思,会很容易对类似下面的代码感到困惑。

    Sub Example

    Cells(2,3) = Cells(2,3) + 1

    End Sub

    如果将等号理解为数学中的“等式”符号,那么“Cells(2,3) = Cells(2,3) + 1”永远无法成立。但是

    在VBA程序中,等号是赋值的标识,所以根据前面的描述,计算机会先计算等号右边表达式的结果,也就是 C2 单元格当前数值与数字 1 的和。假如在运行程序前 C2 单元格的数值是 5,那么等号右边的

    最终计算结果就是 5 + 1,也就是6。接下来,计算机会将等号右边的最终结果赋值给等号左边的元素,也就是将6赋给C2单元格,于是C2单元格的内容变为6,实现了“自动增一”的效果。

    换言之,虽然等号左右两边的“Cells(2,3)”看上去完全相同,但其实计算机用到它们的时间及目

    的都是不同的。等号右边的Cells(2,3) 会先被使用,从该单元格中读取当前数值以便计算最终结果;而

    等号左边的Cells(2,3)则要到最后才被使用,将该单元格内容修改为前述结果。

    读者可以将这段代码输入VBE 中,并运行这个程序(注意:在单击“运行”按钮前,先用鼠标单

    击 Example 内的任意位置),以观察 C2 单元格的变化——每运行一次 Example,C2 单元格的数字就会

    自动增加1。

    1.3.3 加、减、乘、除——基本的算术运算符

    Excel 最常见的用途就是对各种数字进行计算汇总,同样,VBA 程序中最常用到的语句也离

    不开算术运算。

    在 VBA 中编写算术运算语句,与数学中列算式的方法几乎相同,无非就是加、减、乘、除

    各种符号的使用。只不过受电脑键盘设计的限制,有些符号的写法略有不同,如表 1-1 所示。

    12 第 1章 奇境的入口——从VBE走进VBA编程世界

    表1-1 VBA 算术运算符

    VBA算术运算符 含 义 示 例

    + 加法运算 Cells(3,2) = 5 + 12,结果为 17

    - 减法运算 Cells(3,2) = 5 – 12,结果为– 7

    (星号键) 乘法运算 Cells(3,2) = 5 12,结果为 60

    (斜杠) 除法运算 Cells(3,2) = 14 5,结果为 2.8

    \(反斜杠)

    整除运算。舍弃商的小数部分,只保留

    整数部分

    Cells(3,2) = 14 \ 5,结果为 2 (商的小数部分 0.8

    被舍弃)

    ^(脱字符,与数字“6”同键) 幂运算。a^b即 a

    b

    Cells(3,2) = 4^3,结果为 64(43)

    Mod(三个字母) 模运算。求两个数字相除后的余数

    Cells(3,2) = 14 Mod 5,结果为 4。因为 14除以

    5 的结果是 2余4

    关于算术运算,以下几点需要初学者特别注意:

    ★ 所有运算符必须写成英文半角符号,误写为全角符号会导致计算机无法理解。

    ★ 当一个表达式中包含多个运算符时,VBA 程序的计算顺序同样遵循“先乘除后加减”的

    算术运算优先级。比如 3+27 的计算结果是 17(先计算 2 乘以 7,再加上 3),而不是 35

    (先计算 3 加 2,再乘以 7)。

    ★ 可以使用半角圆括号来改变计算优先级。比如 (3+2) 7 的计算结果就是 35,而非 17。

    但是与数学中的算术式不同,VBA 中没有“大括号”“中括号”的概念。如果需要使用多

    层括号来改变优先级,所有括号都要写成半角圆括号,比如 ( 3 + ( 5 – 4 ) 2 ) 7。这一

    点与 Excel 公式的要求是一样的。

    ★ 有一些简单的算术运算语句无法正确执行。比如 Cells (3,2) = 300005,看起来没有任何

    问题,可是单击“运行”按钮后却会报出错误,这是计算机内部对数据类型、数据精度等

    方面的限制所导致的。为降低初学门槛,本书将这部分内容放在后面相关章节中详细讲解。

    ★ 很多读者可能对模运算(Mod)比较陌生。事实上,在很多涉及“周期性变化”的应用

    场景中,使用模运算都能够非常巧妙地解决问题。本书安排了特定章节讲述模运算的使

    用技巧。

    理解了算术运算的写法,读者可以在 Excel 工作簿中写一个小程序作为练习。练习的要求是:

    编写一个名为“Demo2”的 VBA 程序,每当执行它时,就会将 C2 单元格与 C3 单元格中的内容

    相加,并把结果写入 C4 单元格中。请读者先自己思考并编写运行该程序,然后参考图 1.14 所示

    的答案。

    1.4 VBA 程序的运行与保存——按钮、 XLSM 文件

    及宏安全性

    到目前为止,我们已经编写了两三个简单的 VBA 程序,可能有些读者在运行这些程序时遇

    到了麻烦,比如,单击“运行”按钮后程序并没有马上执行,而是弹出一个选择窗口;或者弹出

    警告,禁止运行宏等。所以在这一节中,我们详细了解一下 VBA 程序的正确运行方式、保存方

    式和相关设置。

    13 >> 深入浅出Excel VBA

    1.4.1 宏与宏安全性

    在运行 VBA 程序之前,首先要确认当前的 Excel 是否允许运行任意 VBA 程序。在默认情况

    下,Excel 及其他各种 Office 软件都禁止运行 VBA 代码,原因在于,黑客会利用它编写一些病毒

    或木马等能够自动运行的恶意程序并保存在 Office 文档中。假如各种软件允许运行宏,用户一旦

    打开这些文档就会立马中招。

    当我们需要运行可靠的 VBA 程序,并且确信 Office 文档中没有恶意代码时,可以将 Excel

    设置为“允许运行 VBA” 。在 Office 2007 及以后版本中,可以在“开发工具”选项卡中找到“宏

    安全性” 按钮。使用 Office 2003 及以前版本的用户,可以在“工具”菜单的子菜单“宏”

    中找到该功能。

    单击“宏安全性”按钮后可以看到“宏设置”对话框及多个运行选项。如果想运行自己编写

    的 VBA 程序,一般要先选中“启用所有宏” (在早期版本的 Office 中为“安全级”选项卡里面的

    “中”或“低” ),然后单击“确定”按钮退出即可。

    读者可能会觉得奇怪:为什么用来管理VBA安全性的菜单,要被命名为“宏安全性”呢?所

    谓“宏” ,其实是指用户会经常用到的一系列操作和指令①,比如“①将背景设为红色;②将字号

    设置为 16 号;③将字体颜色设置为蓝色” 。把这些指令保存在一起,并为其指定一个名字,比如

    高亮显示” ,就新建了一个名为“高亮显示”的宏。以后每次需要高亮显示字体时,直接根据名

    字找到这个宏并运行就可以了。

    “

    “

    而在Office中,所有的宏都是以VBA代码的形式保存的。一个宏就是一个以“Sub”开始,以

    End Sub”结束的VBA程序,与我们之前编写的代码完全相同。所以从这个角度看,宏就是普通

    VBA程序②的另一种称呼。

    由于 Excel 等 Office 软件提供了“录制宏”功能,即使用户没有听说过 VBA 程序也能够自己

    录制一些常用操作,所以“宏”的概念比“VBA 程序”更容易被普通用户接受。这就是在 Office

    的选项卡和菜单中,普遍采用宏来代表 VBA 程序的原因。在没有做特别说明的情况下,本书也

    会将二者作为相同的概念使用。

    1.4.2 运行VBA程序的常用方法

    1. 使用 VBE中的“运行”按钮

    在 VBE 的工具栏上可以看到 三个按钮,分别用于 VBA 程序的运行、暂停和终止

    (重置)。后两者一般用于程序调试过程中,本书会在相关章节介绍。使用三角形运行按钮是在 VBE

    中执行 VBA 程序最快捷的方式。

    不过这里有一个问题:既然一个模块中可以包含多个 VBA 程序,那么单击“运行”按钮之

    ① “宏”的英文名称为“Macro” ,是“Macro Instruction”的简写。这个概念应该来自 C 语言等其他程序设计语

    言,用一个简单的文本替代需要重复使用的复杂代码。

    ② 一般来说,Office 中的“宏”指的是用户通过鼠标和键盘实现可以自行录制下来的操作。但是“事件程序”“窗

    体程序”“自定义函数”等类型的 VBA 程序是无法通过录制用户操作实现的。所以这里强调宏是“普通 VBA

    程序”的别名。

    14 第 1章 奇境的入口——从VBE走进VBA编程世界

    后,到底会执行代码窗口中显示的哪一个程序呢?VBE 对此的规定是:光标在哪个程序的代码中

    闪烁,就执行哪个程序;如果光标不在任何程序代码中,则弹出一个对话框,请用户在所有程序

    中选择一个程序运行。

    比如在图 1.14 所示的 VBE 界面中,如果想运行 Demo2 这个子程序,必须先用鼠标单击 Sub

    Demo2与 End Sub 之间的任意位置,确保代码窗口的光标能够在 Demo2 的代码范围内闪烁,再

    单击“运行”按钮,Demo2 这个程序就会立即执行。如果用鼠标单击其他位置(比如 End Sub

    下面的空白行),那么单击“运行”按钮就会弹出对话框,需要先选择“Demo2” ,再单击“运

    行”按钮。

    图1.14 如果光标没有在任何一个VBA程序中,单击“运行”按钮会弹出“宏”对话框

    (本图中的Demo2程序就是1.3节中课堂练习的答案)

    使用 VBE 中的“运行”按钮,优点在于可以在开发代码的过程中随时执行程序及检查结果,一切开发调试工作都可以在 VBE 界面中完成。但是对于使用这个程序完成日常工作的用户来说,这一方法就显得十分麻烦,因为用户必须先调出 VBA 编辑器,然后不断地在工作表和 VBE 两个

    界面中来回切换。所以这种方法只适合开发过程,编写好代码之后,应该使用下面介绍的方式运

    行程序。

    2. 使用 Excel 中的“宏”对话框

    单击Excel“开发工具”选项卡中的“宏”按钮,可以弹出“宏”对话框①。该对话框中列出

    了所有当前可以运行的VBA程序,用户只需选择并单击“运行”按钮,即可执行相应VBA程序。

    通过这种方式,我们可以在不打开VBE界面的情况下,直接在工作表中运行VBA程序。

    在“宏”对话框中还可以直接创建一个新的 VBA 程序。只要在“宏名称”对话框中输入一

    个新的 VBA 程序名称,并单击“创建”按钮,Excel 就可以自动转到 VBE 编程界面,并自动在

    ① 使用 Office 2003 及以前版本的用户,可以在“工具”菜单中找到子菜单“宏” ,选中“宏(M) …”选项即可弹

    出“宏”对话框。

    15 >> 深入浅出Excel VBA

    当前工程中添加一个模块,还可以在该模块中自动写好“Sub”与“End Sub”两行代码。在临时

    开发一些简单程序时,这个工具用起来十分方便。

    使用“宏”对话框虽然不必打开 VBE,但用户仍然需要到选项卡和菜单栏中寻找“宏”按钮,并且还要记住每一个 VBA 程序的名字才能做出选择,因此这种运行方式对用户仍然不够友好。

    好在 Excel 还为我们提供了另外一些更加友好的运行方法,也就是下面介绍的“按钮”等表单控

    件及“形状”等图形元素。

    3.使用“按钮”等表单控件

    单击“开发工具”选项卡的“插入”按钮,可以弹出“表单控件”和“ActiveX 控件”工具

    箱。选中“表单控件”中的第一项“按钮” ,光标将会变成十字花形状“+” ,此时在 Excel

    工作表的任意位置按住鼠标左键,就可以绘制出一个矩形按钮,如图 1.15 所示。

    图1.15 “开发工具”选项卡中的“插入”菜单和表单控件

    绘制结束后松开鼠标,Excel 会自动弹出“指定宏”对话框,询问该按钮与哪个 VBA 程序关

    联(也就是说,用户单击该按钮后应当运行哪个 VBA 程序)。在该对话框中选中一个 VBA 程序

    的名字,并单击“确定”按钮即可将该程序指定给这个按钮。用户也可以在之后的任何时刻,在

    该按钮上单击鼠标右键,并在弹出的菜单中选中“指定宏”选项,重新进入“指定宏”对话框对

    其进行修改。

    按钮的外观尺寸和显示文字也可以随时被修改,以使其更加美观,让用户更加清楚地了解该

    按钮所执行的功能。只要在按钮上单击鼠标右键,使按钮的边框线上出现调整尺寸的八个圆圈(锚

    点),就进入了外部设计模式。此时拖动任意一个锚点都可以修改按钮的形状;而用鼠标左键单击

    按钮上的文字,就可以修改按钮标题。

    事实上, “表单控件”中的任何一个元素(控件)都可以像按钮一样被插入工作表中,并且在

    发生某个特定操作时自动运行指定的 VBA 程序。比如,我们可以先插入一个“复选框 ”控件,然后用鼠标右键单击并在“指定宏”对话框中为其关联宏。这时只要选中或取消复选框,就会自

    动运行这个 VBA 程序。

    “表单控件”下方的“ActiveX 控件”工具箱同样提供了类似的控件,而且这些控件提供了更

    加丰富的功能和属性,可以实现一些复杂的控制功能和效果,本书后面对此有专门介绍。在一

    般情况下,使用“表单控件”中的按钮就可以满足很多日常需求了。

    4. 插入图形元素

    如果读者觉得“表单控件”按钮的外观过于死板,还可以考虑使用“形状” 。比如,可以先在

    16 第 1章 奇境的入口——从VBE走进VBA编程世界

    “插入”菜单中单击“形状” ,然后选择一个圆角矩形插入到工作表中并设置它的各种外观属性,再单击鼠标右键选中“指定宏”选项,就可以将其关联到自己编写的 VBA 程序上。这样每当用

    鼠标单击这个形状时,Excel 都会运行这个程序。

    这种操作几乎适用于所有可以插入工作表中的图形元素,包括“图标”“Smart Art”“图片”

    及“联机图片”等。灵活使用这个操作,可以将 VBA 与用户数据非常漂亮地结合在一起,或者

    编写一些有趣的图形游戏。

    5. 其他运行方式

    严格来说,以上介绍的都是运行 VBA“标准程序”的方法,也就是位于“标准模块”中的代

    码。而其他类型的 VBA 程序都有各自的运行途径,无法通过上述方式调用执行。比如,事件程

    序会在 Excel 发生某种状态变化时自动运行,窗体程序和类定义程序需要在其他 VBA 程序中调用

    执行,而用 VBA 编写的自定义函数则是像普通工作表函数一样由用户在单元格中引用执行等。

    对于这些执行方式,本书会在讲解相应类型 VBA 程序时再做介绍。

    6. VBA 程序还是不能运行怎么办

    由于 VBA 与 Office 软件紧密结合在一起,所以很多 Office 操作和设置都有可能影响 VBA 程

    序的运行。其中最常见的一个原因,就是 Excel 工作表仍然处于编辑状态。假如我们有意或无意

    地双击了 Excel 工作表中的某个单元格,使其处于编辑状态(光标在单元格中闪烁),那么在切换

    到 VBE 界面后,VBA 编辑器不会响应任何操作。此时不论单击“运行”按钮,还是尝试修改 VBA

    代码,都不会成功。对于这种情况,我们必须回到 Excel 表格中,单击其他单元格使工作表脱离

    编辑状态,才能正常运行 VBA。

    1.4.3 XLSM文件——VBA程序的藏身之所

    编写完 VBA 程序之后,必须将它保存到一个文件中。否则一旦关闭 Excel 软件,之前编写的

    代码就会全部丢失,再打开 Excel 软件时将无法找回。

    与用户在工作表中填写的数据一样,VBA 程序代码也要一起保存在这个工作簿文件中。在

    Excel 2003 及之前版本中,工作簿是以“.xls”为扩展名的一个文件,比如“工资表.xls” 。当我们

    在 Excel 界面或 VBE 界面中执行“保存”或“另存为”命令后,程序代码就会和数据保存到同一

    个文件中。当我们希望再次运行该程序时,只要打开这个工作簿文件即可。

    但是从 Excel 2007 开始,微软公司对文件格式进行了调整:在默认情况下,工作簿文件的扩

    展名为“.xlsx” ,只能保存数据,不允许包含 VBA 程序代码。所以在编写完 VBA 程序以后,必

    须在“保存”或“另存为”对话框中将“保存类型”修改为“Excel 启用宏的工作簿(.xlsm)” ,从

    而将其保存到一个扩展名为“.xlsm”的文件中,如图 1.16 所示。如果仍保存为默认的“.xlsx”文

    件,即使提示保存成功,再次打开时也将丢失全部 VBA 代码。

    使用 Excel 2007 或更新版本的读者,也可以选择将含有 VBA 程序的工作簿保存为“Excel

    97-2003 工作簿(.xls)” ,这样就能够在所有版本的 Excel 中打开并运行它。不过新版本的“.xlsm”

    文件在占用内存和效率方面相较于老版本的“.xls”文件有所优化,因此需要读者根据实际情况灵

    活选择。

    17 >> 深入浅出Excel VBA

    18

    图1.16 将工作簿保存为“Excel启用宏的工作簿(.xlsm)”

    事实上,Excel 还提供了“.xlam”“.xltm”等可以保存 VBA 程序的文件类型,这些文件专门

    用于开发“加载项”等特殊 VBA 程序,这里暂不详细介绍。

    本章小结

    本章主要介绍了开发 VBA 程序的一般过程和环境设置。由于 Office 功能庞杂、版本众多,一个细节操作上的疏忽就会影响到程序的运行,所以本章尽可能将重要的细节设置分类列清,相

    应的,内容也可能显得比较烦琐。不过读者只要把握住以下几个关键知识点,就可以顺利进入下

    一章,正式开始程序语言的学习之旅。

    ★ 一个工作簿中的所有 VBA 程序统称为一个“工程” ,每个工程中含有多个“模块” 。不同

    类型、用途的 VBA 程序应该存放在不同的模块中。

    ★ 最常用到的 VBA 程序——标准程序——需要保存在“标准模块”中。

    ★ 一个 VBA 程序的典型结构,是以“Sub 程序名”开始,以“End Sub”作为结束的若

    干行代码。

    ★ 在默认情况下,每行代码被视为一个独立的语句,由若干个词汇构成。可以使用“空格+

    下画线”将一行语句拆写到多行中,也可以使用冒号将多个语句合并到一行中。

    ★ 可以使用 Cells(行号,列号) 代表当前活动工作表中的一个单元格。

    ★ 在赋值语句中,等号代表赋值操作。计算机先处理等号右边的部分,再将结果赋值给等号

    左边的部分。

    ★ 可以使用各种算术运算符实现计算功能,可以使用半角圆括号改变运算优先级,但是不能

    使用花括号、方括号等其他符号改变运算顺序。

    ★ 一个 VBA 程序也可称为一个“宏” 。在默认情况下,Office 软件禁止运行宏,在运行 VBA

    前需要将其设置为“启用宏” 。

    ★ VBA 程序有多种运行方式。含有 VBA 代码的工作簿应当保存为“.xls”或“.xlsm”等文

    件格式。

    第2 章

    程序的记忆——变量与常量

    上一章为大家讲解了“在哪里写程序” ,接下来要搞清楚的自然就是“怎样写程序” 。与其他

    程序语言一样,VBA 程序设计中最基本的概念非“变量”莫属。甚至可以说得更加“玄学”一点:

    计算机程序的本质就是“变量及其变化过程” 。所以我们就从变量入手,正式开始 VBA 基本语法

    的学习。通过本章的学习,读者将会深入理解以下问题:

    ★ 变量是什么?为什么要使用变量?

    ★ 怎样用好变量?或者说,什么时候应该使用变量?

    ★ 为什么需要及怎样为变量起一个好名字?

    ★ 为什么需要对变量进行强制声明?

    ★ 既然有“变量” ,是否还有“不变的量” ,或者说“常量”?

    ★ 怎样用变量或常量表示文本(字符串)?

    本章内容与视频课程“全民一起VBA——基础篇”的第三回“用变量实现灵活机动,记规则以免

    非法命名”和第四回“追根溯源探究变量本色,强制声明避免李戴张冠”相对应,但是讲解的思路和

    视角不相同。强烈建议大家将二者结合起来学习,从多个角度出发,更加深入地理解相关知识。

    2.1 变量的作用与含义

    2.1.1 为什么需要使用变量

    编程序其实就是将人类的思考过程,使用计算机语言描述出来,从而让计算机也能像人类一

    样去思考(计算)。人类大脑最基本的思考模式就是:将问题分解为若干个步骤,并依次计算→每

    >> 深入浅出Excel VBA

    计算完一个步骤,就记住这一步得到的结果→每个步骤都可能用到前面某一步的计算结果,直至

    完成最后一步并得到最终答案。在这个过程中,记住中间结果非常重要。

    比如,当我们计算“22

    + 32”这个算式时,会将它分解为三个主要步骤:

    ① 计算 22。得到 4 这个中间结果并记在大脑内部的某处;

    ② 计算 32。得到 9 这个中间结果,也将它记在大脑某处;

    ③ 把在①和②中记住的两个中间结果都取出来并相加,从而得到最终结果 13。

    程序设计也一样。任何一个复杂的程序,都需要被分解为很多步骤,因此会产生和保存大量

    的中间结果。如果程序中没有保存某个步骤的结果,当需要使用它时,就不得不将该步骤重新计

    算一遍,这样写出来的程序代码就会变得很长,也影响效率。

    案例 2-1:在图2.1所示的工作表中,存有员工张三的时薪和当月工时,二者相乘就是他的当

    月工资。现在,公司需要按照他的本月总工资为其发放岗位津贴、当月奖金和劳保补助,所以需要

    编写一个 VBA 程序,只要单击“计算本月福利”按钮就能把这三个金额计算并显示在单元格中。

    计算规则为:岗位津贴=当月工资×20%,当月奖金=当月工资×10 %,劳保补助=当月工资×5%。

    图2.1 案例2-1工作表示意

    按照前面讲过的 Cells 属性和算术运算等知识,读者可以很轻松地写出下面的程序,并将其关

    联到图中的按钮上,正确计算出各项应发福利。

    Sub Payable

    Cells(4, 5) = Cells(4, 3) Cells(4, 4) 0.2

    Cells(4, 6) = Cells(4, 3) Cells(4, 4) 0.1

    Cells(4, 7) = Cells(4, 3) Cells(4, 4) 0.05

    End Sub

    不过在这个程序中, “Cells(4,3) Cells(4,4)”这段代码多次出现,写起来十分烦琐耗时,也让

    代码显得非常冗长。这段的含义是根据C4单元格的时薪与D4单元格的本月工时计算出当月工资,以便计算各项福利金额,但是当月工资的计算其实并不需要重复出现在所有语句中。如果让大家 ......

您现在查看是摘要介绍页, 详见PDF附件(49894KB,444页)