许多高级程序员瞧不上 VBA。因为程序员是有鄙视链的:汇编 > C > C > Python > Java 及 C# 及 PHP(这三者相互撕) > VB > HTML。在这长长的鄙视链中,甚至都没有 VBA 的位置。

可是,Excel VBA 是图灵完备的(谢谢 @Octolet 的精辟总结),所以被程序员用来耍酷的各类性感语言能实现的大部分功能,Excel VBA 都能实现,而且往往是以更高效更快捷的方式,在这里不谈效率和优雅。而且考虑到大部分普通群众是没有编程环境的(各种依赖各种包,各种 OS 各种编译环境,还有 IDE),然而使用 VBA,只需要打开装机自带的 Office,然后按下 Alt F11 就自动进入编程和执行环境;甚至可以更简单的通过录制宏来解决写程序的问题,只需要在简单的代码基础上修修补补就可以执行。再考虑到 VBA 和 Office 各软件的完美整合,所以在便捷性方面,VBA 是无可比拟的。最后,Office VBA 的分享性和移植性很强,任何测试通过的程序放到别的机器上也可轻易执行;而其他程序,哪怕是一段最简单的“Hello World”,也不一定。

因此本文讨论各种通过 Excel VBA 能实现的各种炫酷功能(也会拓展到 Office VBA),主要是为 Professional Service 以及各行各业不写程序但是又严重依赖于 Office 的职场人士服务的。

曾经有一个朋友和我说,“Excel 根本不需要编程,像我这样的 Excel 大牛靠函数和自定义函数能解决所有的问题。”对于这样的评论,我想起自己小学时的一段经历。因为不能理解虚数 i (i^2 = -1) 的价值,问我爸 i 有卵用?我爸说,“等你长大了,遇到更多的问题,就知道 i 的价值。”

1、自动打印

刚进职场的新人,只要爸爸不是李刚,基本都做过影帝影后(影=印,各种复印打印的体力劳动)。特别是咨询投行服务行业,在某次给客户的大汇报或者大忽悠会议之前,花数小时或者整晚来打印数个文件,并不是天方夜谭。而且这件事情是对着同样一堆不断修改的文件,会经常不断重复发生。

我加入 BCG 的第一个项目,就是帮助某大型企业从上到下设计 KPI 体系并实施。从上到下涉及到几十个部门,大概有 100 多张的 KPI 表格需要完成,这些 KPI 表格分布在各个 Excel 文件里。我们 4 个咨询顾问的任务:

  • 设定好 KPI 的基本格式,然后每个顾问负责几个部门,在 Excel 里不断修改 KPI 表格,打印出来后去各个当事人及其领导那里讨论并修改
  • 每周把所有的 Excel 文件中的 KPI 表格归集在一起,按顺序分部门打印出来,并需要多份,找负责该项目的 HR 头儿汇报进度和情况

这里面有个费时费力的环节,每周需要在多个 Excel 文件中找出目标 Worksheet,然后选定合适的区域作为输出的表格,按照一定的格式和一定的顺序,打印出这 100 多张表格。之前我们全是凭借人力,每周由一个 Analyst 把所有最新的 Excel 文件收集在一起,然后挨个打开文件选中合适的 Worksheet,选中区域设置好格式进行打印。每进行一次,几乎耗费一两个小时,还不能保证不出错。

于是写下了我的第一个 VBA 程序,而且基本上是宏录制之后来改的,没有使用参考书及搜索引擎,全靠 F1 和自动提示,所以贴出来特别纪念一下。实现的功能就是将上述的人肉实现的功能全部自动化。按下一个妞,就慢慢等着打印机按顺序出结果吧。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

后来这个程序的升级版是:调度多台打印机,进一步提高效率,以及将打印机卡纸造成队列错误的概率降到极小的范围内。

2、制作图表及 GIF 动画

图表制作是每个 Office 一族的必备任务,制得一手好表格,绝对是升职加薪和偷懒放风的利器。在回答(黄焖鸡米饭是怎么火起来的? – 何明科的回答),就利用 Excel VBA 做出数张炫酷的信息地图,利用 VBA 为每个省的图形涂色。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

同时,为了进一步增强炫酷结果,还利用 VBA 将这些连续变化的图表做成了 GIF 动画,可惜知乎不支持 GIF 的显示。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

3、制作复杂的分析图表

下图是研究各个车型之间的用户相互转换关系,因为要将一维的转化率向量,变成两维的矩阵,所以使用了如下的复杂公式。

=IF(ISERROR(OFFSET($C$2,MATCH(CONCATENATE(ROW(A4),"-",COLUMN(A4)),$D$3:$D$600,FALSE),0)/OFFSET($C$2,MATCH(CONCATENATE(ROW(A4),"-",ROW(A4)),$D$3:$D$600,FALSE),0)),"",OFFSET($C$2,MATCH(CONCATENATE(ROW(A4),"-",COLUMN(A4)),$D$3:$D$600,FALSE),0)/OFFSET($C$2,MATCH(CONCATENATE(ROW(A4),"-",ROW(A4)),$D$3:$D$600,FALSE),0))

同时为了用颜色的深浅来表示转化率的大小关系而便于比较,使用了 VBA 对下面的矩阵进行着色。当然有人肯定会说可以使用条件化格式,但是使用 VBA 保持了最高灵活度和效率。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

4、根据格式化信息,生成标准的 Word 文件

这是帮朋友实现的一个项目,他们实验室是研究某类事故并对重大事故进行鉴定,最后发布 Word 版的正式报告。之前的工作流程是在专业的软件中完成计算和仿真,最后按照正式报告八股文的行文,把各种关键信息填进去,最后写成 Word 文件。写报告的过程枯燥而没有技术含量,但却要反复进行。

通过下图的 Word VBA,完成主要的交互界面并连接计算软件。在通过简单的交互获取主要信息后,在后台完成计算并将主要信息填写入八股文的 Word 模版,最终完成报告,同时将结构化的信息存入 Access 数据库。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

希望有机会和 @Raymond Wang 和 @金有元 等大律师合作,将 Termsheet 的书写及 Termsheet 到 SPA 及 M&A 等的法律文件书写工作彻底自动化。

5、通过 Excel 管理分布的任务流,并将 Excel 表格输出到 PowerPoint

这是协助某国际大型汽车制造厂完成新品牌及其新款车型上市,面临车型即将断档的窘境,该新车型的上市非常关键,不能错失时间节点。然而,新车型上市涉及到无数分支:制造、产品、市场、渠道、营销、公关、财务等等,同时还要协调欧洲的两个总部以及中国的两个分部。

这次咨询的核心任务就是项目管理,总控整个大项目的进度,并每周向中国区的 CEO 汇报进度并发掘出易出现问题的关键节点以调配资源。我们 4 个咨询顾问分配下去各自负责几个部门或者项目分支,和团队一起规划流程、画甘特图、确认里程碑及时间点、安排负责人等等。当每天回到办公室大家将进度汇总在一起的时候发现了挑战及难点,每条任务线并不是独立发展的,而是各条任务线交织在一起并互相影响。

  • 某些核心人员在多个任务线出现。比如:负责预算的财务人员,几乎要出现在各条线中负责相关预算的审批环节
  • 某些任务线的里程碑是其他任务线里程碑的必要条件而相互关联。比如:新车的下线时间影响发布会的时间,相关法规测试的通过又影响车辆的下线时间等等

当任务线增多以及任务线之间的交叉越发频繁的时候,汇总的任务将会几何级数增加,这就是我们在项目过程中遇到的问题。于是我利用 Excel VBA 完成了这个工作的自动化。主要实现的功能:

  • 自动将 4 个顾问手中分散的 Excel 文件汇集在一起形成一个大的总表,如下图
  • 各顾问手中的表格是按照部门维度来划分的,汇总后需要按照不同的维度来输出不同类型的表格,比如:按任务线输出表格、按责任人输出表格、所有延误任务的表格、所有需要资源重点投入任务的表格等等

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

在此基础之上,还要将上面提到的各种维度下的所有表格(大概有 200 多张),按要求格式粘贴到 PPT 中,每周提交给中国区的总部进行汇报和评估。密密麻麻的表格如下图。于是,我又写了一个程序将 Excel 中的表格输出到 Powerpoint 中,将一个秘书每次需要数小时才能完成的工作,简化成了一键发布,并可以在 Excel 中完成对 PPT 的更新。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

这个项目的程序量不小,近似于写了一个迷你版的 Microsoft Project 来进行项目管理。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

最后,下图中密密麻麻的 PPT 每周需要更新一次,每次都是快 100 张的工作量,然而基本上都是靠 Excel 来自动完成更新的。因为 PPT 的模版每次变化不大,我将这些模版记录下来,每周更新的时候只要根据 Excel 中最新的数据更改 PPT 中的数据即可。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

6、根据结果倒推假设

一般的 Financial Model 都是根据重重假设计算最终结果。而在为某顶级手机品牌服务的过程中,我们却遭遇了逆向的尴尬。本来是根据地面销售人员的一定服务水平,计算所需要的销售人员数量;结果在项目过程中,总部已经确定好了销售人数的 Head Count,转而要求我们根据 HC 确定服务水平。然而,服务水平不是一个单变量,是由零售店的覆盖率、销售拜访频率、拜访中的服务深度等多重因素来决定的,同时还可以根据一线至无线城市来变化。

于是只好再次寄出 Excel VBA 法宝。先根据常规思路建立好 Financial Model,得出 HC 的初步结果。然后写 VBA 程序,根据不同的情景、不同的优先级以及不同的权重来调节零售店的覆盖率、销售拜访频率、拜访中的服务深度等多因素,同时设定这几大因素的可接受范围,逐步逼近 HC 的预设值。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

如果没有程序,以前基本是靠人工手动调节来凑结果,而且因为各种情景的不同,还需要多次调节。而通过程序,基本是自动完成,还可智能得设置优先级及权重,无需人工参与。

7、海量下载 Bloomberg 数据并完成分析

通过 Bloomberg 的 VBA API,海量下载数百只目标股票的 tick data 以及 order book。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

并根据实现构建好的数学模型,在后台完成计算,将上述的实时数据转化成每只股票实时的 trading cost,实时展现在交易员最常用的 Excel 界面中,方便交易员评估当下的交易成本以便于优化交易策略。

Excel自动打印、Excel做GIF、Excel输出PPT……万能的EXCEL

8、结语

计算了一下,我在 BCG 做了三年咨询顾问,大概写了几万行 VBA 程序(都是自己手工输入的,没有复制拷贝和系统自动生成),每个项目一千至几千行程序不等。最后将 Excel 用成了中控界面,类似 EMACS,在 Excel 可以随意操控全公司的打印机、Word、Powerpoint 等等,自动完成各种任务以及数据更新和抓取。因为 Excel 的数据更结构化,所以将其作为中控平台,比 Word 和 Powerpoint 更有优势。


常州厂房信息:
常州厂房出租论坛
常州厂房出租微信
常州厂房出租QQ群!
常州新北三井薛家工业园区盛鹏工业园厂房出租!

   常州厂房出租,三井厂房出租,常州仓库出租,常州厂房,厂房出租,薛家厂房出租    常州厂房仓库出租①-QQ群:13122303
   常州厂房出租,三井厂房出租,常州仓库出租,常州厂房,厂房出租,薛家厂房出租    常州厂房仓库出租②-QQ群:373112055
   常州厂房出租,三井厂房出租,常州仓库出租,常州厂房,厂房出租,薛家厂房出租    常州厂房仓库办公室出租A-QQ群:17900800
   常州厂房出租,三井厂房出租,常州仓库出租,常州厂房,厂房出租,薛家厂房出租    常州厂房仓库办公室出租B-QQ群:121315538