在写本书之前,笔者制作的视频课程“全民一起VBA”已在网易云课堂获得六万余名学员的关注和好评。而本书写作的初衷也正是应他们的要求,希望有一本内容翔实、语言风格轻松易读的 VBA 图书。但笔者深知,要想写好一本真正能够传道解惑的技术书,其难度并不亚于撰写任何一本学术专著。
据说杨振宁先生曾经开过一个玩笑,大意是“现代数学教材可以分为两种:让人读了一页就读不下去的,以及让人读了一行就读不下去的”。其用意是希望数学书不要写得抽象乏味,使人摸不着头脑,因为“数学毕竟要让更多的人来欣赏,才会产生更大的效果” 。其实在计算机教学领域也是一样,怎样让更多的人领略到计算机科学的魅力,感受到亲自编写代码操控电脑所带来的成就感,也应被我们这些教育工作者视作重要的目标。
VBA就是非常符合这一目标的教学题材,尤其适合于没有编程基础,但又可以通过学习编程来大幅提高工作效率的人士。不过很多VBA图书似乎忘记了读者“零基础”“非专业”的特点,把讲解重点放在了各种功能的实现上,忽视了初学者编程思维和基本功的培养。以笔者多年的教学经验来看,这种内容安排对大部分初学者来说并不合适,假如没有辅以专业教师的讲解,很难让读者真正掌握构思和编写程序的能力。因此,笔者在本书中重点着笔于程序结构、思路启发以及应用技巧上,同时精心设计了很多简短而有代表性的案例,希望为有意学习 VBA 的人士提供一个深入理解程序设计,进而一窥软件开发全貌的路径。
如果读者看到这里决定多读一页,那么可以在接下来的内容中看到:为什么要学习VBA、怎样学习VBA,以及怎样使用本书。
最近几年,身边各行各业的朋友都突然关注起AI(人工智能)的发展,而诸如“未来会计师岗位将全部被电脑取代”“XX投行将全面采用计算机替代交易员”“AI普及对律师就业市场造成巨大冲击”等极富冲击力的新闻标题,也屡屡见诸报纸和网站的头条。这股浪潮影响之大,以至于在笔者居住的城市,过去一年就有几万名金融业白领在下班后选择去夜校从头学习计算机技术。
电脑真的会抢走我们的工作吗?每当在课堂上被问到这类问题时,笔者总会提醒同学:耸人听闻与掩耳不闻一样,都无助于理性思考。从长远看,人工智能的发展当然会逐渐替代大量的日常工作,但是按照目前的算法理论和技术水平,再考虑到社会经济各方面的制约,这个替代过程恐怕要经历一个相当长的时间。然而在这个漫长的阶段里,直接抢走你工作的恐怕不是电脑,而是那些“能够指挥电脑的人”。
举一个真实的例子,下面是某位网友在知乎(www.zhihu.com)上贴出的一段亲身经历(https://www.zhihu.com/question/64821272/answer/224650964):
对于这样的任务,公司领导当然希望能够拥有一台超级AI,就像科幻电影中那样,只要对着它说“找到电脑中所有的Office文件,然后给每一页都打上两个红框”,连“请”字都不用提,就能瞬间得到结果。不过遗憾(幸运)的是,至少在本书写作时,像这样能够一听就懂并迅速想出正确方案的AI还没有出现;或者即使出现,其建造和训练的成本也高不可攀。于是,领导们还是不得不屈尊雇佣我们这些白领来完成工作。
我们这些接到任务的白领又能怎样完成它呢?相信绝大多数Office用户都与上面这位提问者一样,只能亲自打开每一个文件夹下的每一个Office文件,手工执行插入文本框操作后再逐一保存。如果每台电脑中有上千个文件,恐怕搞定一台电脑就需要一两天时间。而面对帖子中提到的几百台电脑,即使昼夜加班也很难在截止日期之前全部完成。
但是对于懂VBA的Office用户来说,这个任务就会简单许多:只要新建一个Excel文件并写入一小段VBA代码(在知乎该问题中可以见到笔者的示例回答),就能够为同一文件夹下的所有Excel文件都插入一个显示存档日期的文本框。而这段代码只要稍微修改一下,就能扫描硬盘上所有的文件夹及其子文件夹,并扩展到Word和PPT文件,从而让计算机自动完成全部任务,无须人工操作。对于一个具有 VBA 基础的人来说,做好这个程序大概只需要半天,而后面的事情就是把它复制到每一台电脑上运行一遍,最后检查处理一些异常情况即可。
那么,当这家公司准备缩编裁员时,面对一个能写出上面代码的候选人和一个只会熟练排版或使用公式的候选人,如果其他条件相同,哪一位能保住自己的工作呢?答案不言自明。所以,回到开头的问题,笔者想表达的意思就是:对大多数办公室白领来说, 真正需要担心的不是电脑智能有多么强大,而是我们指挥电脑的能力有多么弱小 。当办公室里的大部分工作还无法由计算机完全独立解决时,谁能够更高效地使用计算机,谁就是最后一个在遥远的未来被某个超级 AI替换掉的人。
“指挥电脑”的能力又是什么呢?点鼠标、按快捷键、记住各种触控手势等当然都在此列。然而真正万能的指挥棒则是编写程序代码,使用计算机自己的语言去告诉它你想执行的操作。请相信:只要掌握了一个编程工具,并从自己的工作中最熟悉的任务开始实践,就会迅速发掘出电脑这一超级武器的真正威力,从而用一两小时就完成以前几天几夜才能完成的事情。而让每个曾经只会按鼠标的人都能感受到编程的价值和乐趣,正是笔者写作本书的动力所在。
理解了学习编程的意义后,接下来的问题自然就是“我应该学习哪一种语言”。世界上曾经出现过的程序语言多达数千种,目前仍有人经常使用的也有近百种。显然,作为非计算机专业人士,我们只能在其中选择最适合自己的一种。笔者的建议是:如果你平时最常接触的桌面软件是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++等,但这些语言的设计宗旨是为了让使用者能够独立开发一个完整的软件,所以学生只有在认真学习过一两个学期,陆续学完语法基础、用户界面、数据存储等多个模块的知识后,才能逐渐用它们编写一些小工具来解决一些实际问题。而在此之前的漫长学习过程中,大多数学生只能用它们做一些书后练习中的编程作业,其枯燥乏味让很多人中途放弃。
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软件结合起来。
整体来说,VBA的学习过程主要包括以下四个阶段。
(1)培养编程思维
VBA是一门程序设计语言,而程序设计则是一种思维方式,即按照计算机的运作机制去思考问题,然后把自己的想法用计算机的方式加以表述。所以,学习程序语言最重要的并不是牢记各种关键字和语法,而是领会到它所蕴含的思维方式。笔者见过许多学习过多门计算机课程,甚至毕业于计算机专业,却仍然不会编程解决简单问题的人。究其原因,就是没有培养出编程思维。
因此,对初学 VBA 的读者来说,首要任务就是真正理解程序语言的逻辑和计算机的工作方式,能够将自己日常工作的流程用 VBA 语言要素精确地表达出来。一旦具备了这种思维方式和表述能力,后面的学习就会事半功倍。
(2)熟悉Office对象
在理解了 VBA 的思维方式,熟悉了各种程序结构后,接下来的任务就是用这种语言发出命令,以操作Office软件。而将VBA程序与Office软件连接起来的桥梁就是VBA中的对象体系。Office 软件的每一个组件、每一种功能在 VBA 看来都是一个对象或一个属性/方法。所以,只要知道了这些对象或属性/方法的名字与格式,就能够在VBA程序中随意控制Office软件。
(3)提高实践能力
学习编程离不开大量的实践与练习。很多人在学习程序设计时都会感到:书上的内容看起来很好理解,可是一旦亲自编写程序就无从下手,写出的代码也总有莫名其妙的错误。这种情形持续一段时间后,学习者就会丧失信心与兴趣。
若想摆脱这种困境,唯一的办法就是充分练习、积极实践。读者每学到本书的一个知识点,都应将书中的示例抄写在自己的电脑中,亲自运行并思考结果。在思考清楚后,凭借自己的理解和记忆将这个程序再“盲打”一遍并运行。只有完成这两个步骤,才算是完成了基本的练习,从而为下一个知识点的学习做好准备。
而在完成练习之后,更重要的一环就是将学到的技术尽可能应用到日常工作中。比如,经常思考“刚才的操作是否可以用VBA搞定?”,如果可以,就大胆尝试。如此不仅能巩固学到的知识,还会逐渐总结出自己的经验与方法,让使用VBA成为像走路、开车一样自然而然的习惯。
(4)自学更多技能
在实践中,读者总会遇到很多书中没有细讲的问题,这种现象十分正常,因为 VBA 的类库和系统函数成百上千,还会随着Office软件的升级而不断完善。同时随着技能和经验的提高,读者也会开始尝试编写更加复杂的程序,因而需要了解更多算法、网络和系统功能等方面的知识。显然,没有任何图书可以把以上所有的内容都涵盖在内,因而只有善于查阅资料并自学提高的人才能在掌握入门知识之后,进一步提高自身的水平。
写本书之前,笔者曾经多年为高校经管专业的学生开设相关课程,并在网易云课堂(study.163.com)推出了广受好评的系列网络课程“全民一起VBA”。在这些教学活动中积累的经验与案例(特别是同学们对课程的反馈信息)为本书的内容编排提供了重要的指引。整体来说,本书并没有像传统教科书那样按照知识点的类别从下向上进行罗列,而是尽可能遵循初学者的认知过程,以实际应用为线索循序渐进。这样可以确保读者在每一部分只接触一个知识点,而且能够马上理解并将其应用到实际工作中。具体地说,本书的内容结构如下:
第1章介绍VBA的编程环境与基本格式,特别是怎样用VBA代码读写Excel单元格。通过对本章的学习,读者马上就可以开始编写简单的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.cn/35464)上。
总之,本书的写作宗旨就是为广大初学编程的人提供一个既易学又深刻的、系统性的学习路线,语言风格也力求做到轻松活泼。此外,特别感谢大连医科大学艺术学院刘立伟副教授为本书各章首页绘制的精彩插图,希望读者能够借此加深对每章核心思想的印象。
如果读者希望在学习过程中进一步加深理解,还可以与“全民一起VBA”系列课程对照学习。所有购买本书的读者,均可以到电子工业出版社网站(http://www.broadview.com.cn/35464)浏览该系列课程的“基础篇”内容,而全系列完整内容(包括“提高篇”和“实战篇”)则可以到网易云课堂(https://study.163.com/series/1001373002.htm)观看。这些视频课程中提供了丰富的动画和案例演示,可以帮助读者获得更好的学习效果,而且其中使用的案例与本书并不相同,可以互为补充。不过本书的章节结构与视频课程并不完全一致,对于某些知识点的取舍和深度也略有不同。因此,本书在每一章开头的摘要中都会指明本章内容所对应的视频课程章节,有兴趣的读者可留意对照。
附赠内容标题(下载网址:http://www.broadview.com.cn/35464)
第21章 平台的扩展——用VBA处理数据库和其他Office文件
第22章 触角的延伸——获取网页数据