1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

Excel 有多厉害?自动打印、做 GIF、输出 PPT,都能行

本帖由 漂亮的石头2016-03-16 发布。版面名称:知乎日报

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    487,766
    赞:
    47
    Excel 到底有多厉害?

    [​IMG] 何明科,不写程序的数据工程师不是好产品经理

    (在做投行、行研、咨询等金融岗位,有没有什么好用的找数据技巧呢?中重点讲了如何利用爬虫来收集数据和做出炫酷的表格,这篇主要讲讲如果用程序来替代人工,一个顶俩:虽然不如 AlphaGo,但也是机器替代人类的一个小侧面)

    许多高级程序员瞧不上 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 和自动提示,所以贴出来特别纪念一下。实现的功能就是将上述的人肉实现的功能全部自动化。按下一个妞,就慢慢等着打印机按顺序出结果吧。

    [​IMG]

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

    2、制作图表及 GIF 动画

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

    [​IMG]

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

    [​IMG]

    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 保持了最高灵活度和效率。

    [​IMG]

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

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

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

    [​IMG]

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

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

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

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

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

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

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

    6、根据结果倒推假设

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

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

    [​IMG]

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

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

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

    [​IMG]

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

    [​IMG]

    8、结语

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

    一些学习 VBA 的小技巧在这个回答里:Excel VBA 如何快速学习? - 何明科的回答

    最后,这些程序中的一些公共模块,打包给了 BCG Global IT,BCG 给了我一个 Sponsorship 去 Stanford GSB 读书。程序的注释行里面有我几个好朋友、亲人及导师的名字,祝他们一生平安。


    更多精彩文章请看:数据冰山 - 知乎专栏

    阅读原文
     
正在加载...