查看原文
其他

这样用Excel,才能让你的效率翻倍!

2017-03-02 果壳网



Excel是一款功能强大,操作灵活的工具,除了自己学习探索外,参考别人的经验和方法也是十分有效的提高途径。一起来看达人是如何用Excel施展魔法的吧~!



以下内容转自何明科在问题“Excel 有哪些可能需要熟练掌握而很多人不会的技能?”下的回答。


在咨询公司、VC/PE/Hedge Fund等基金混迹多年,一直靠着Excel的各种技巧安身立命和升职加薪。可能是因为程序员出身的原因,在学会以上各个答案提到的装逼炫酷图表、快捷键和一些略复杂的函数(VLookup等)之外,总是希望从更深的层次去探索Excel及各类Office软件,直到遇到了数组函数VBA编程。这些技能一旦掌握能将工作效率提高数倍甚至是十倍以上,然而周围却很少有人掌握。



数组函数和VBA编程,简直就是为程序员而生的:

数组函数充满了数据库的思维,而VBA本身就是彻头彻尾的编程,再加之各种接口,能够将Office各套软件以及OS下的各种功能完美结合在一起。因为Excel+VBA是图灵完备的,最后辅以Excel简单高效的数据呈现界面。


在我的心目中,Excel+数组函数+VBA,简直就是网页前端+客户端+后台程序+数据库。感觉学会了这些,某种意义上就是成为了Full Stack Developer (全栈工程师),各互联网公司梦寐以求想招到的人。




数组函数


数组函数往往会和Index、Indirect及Address等地址相关和数据块相关的函数搭配使用,如果不考虑效率的话,基本可以替代各种SQL语句了。


数组函数之案例1:计算某类产品的总价值


计算AA产品的总价值,替代select sum(产品数量x产品单价) from ... where 产品编号=‘AA’
{=SUM(IF(($B$4:$B$8="AA"),($C$4:$C$8)*($D$4:$D$8),0))}



如果没有数组函数,使用sumif等函数也会很复杂。



数组函数之案例2:挑选不重复的值并计算总和


左边的白色区域是原始数据,右边的彩色区域使用了数组函数的输出区域。数组函数实现了两大功能:


· 黄色区域:将不重复的name+month筛选出来。

· 蓝色区域:替代了select sum(tot) from ... group by name, month,将name+month对应的tot进行加总。



如果没有数组函数,只能使用Pivot Table等复杂方式,不仅程序开销很大,而且还不够灵活。



数组函数之案例3:


这是一个帮助某国际家用电器厂商预测中国各家电品类市场潜力及规模的项目,从2005-2024年。一般的Excel函数只能解决两维的问题,而这次客户提出了这个变态的n维需求,需要精确到年份、电器品类、渠道类型、用户高中低端以及城市级别共5个维度来查看市场规模及潜力。简单说就是利用下面这个表格随时查看指定维度下的某年份的市场潜力及规模。


通过使用数组函数建模轻松实现如下功能,只要在指定的区域内选择相关值,就能计算值所需的市场规模及潜力,等于使用了SQL语句:select * from table where 条件1=A1 and 条件2=A2 and 条件3=A3……(共5个条件)



复杂的数组函数编码如下

=SUM(((Summary_Market!$S$71:$S$308=$A7)+(Summary_Market!$S$71:$S$308=$V7)+(Summary_Market!$S$71:$S$308=$AA7)+($A7="")>0)*((Summary_Market!$T$71:$T$308=$B7)+(Summary_Market!$T$71:$T$308=$W7)+(Summary_Market!$T$71:$T$308=$AB7)+($B7="")>0)*((Summary_Market!$U$71:$U$308=$C7)+(Summary_Market!$U$71:$U$308=$X7)+(Summary_Market!$U$71:$U$308=$AC7)+($C7="")>0)*((Summary_Market!$V$71:$V$308=$D7)+(Summary_Market!$V$71:$V$308=$Y7)+(Summary_Market!$V$71:$V$308=$AD7)+($D7="")>0)*(Summary_Market!BB$71:BB$308))


整个模型的界面及复杂的数组函数如下图,左边部分的界面其实就是图形化的SQL语句。这个模型被该客户及我们咨询公司使用了不下5年,部分依赖于其超强的灵活性。





VBA编程


首先不要被“编程”二字吓跑,因为VBA不会编程也可以进行,通过录制宏的方式就可以搞定。录制宏的诀窍见下图:



如果真要升级成为VBA编程达人,还是需要自己学习和自己编写VBA程序。下面列举若干自己亲手编写的若干Excel+VBA项目。



VBA编程之案例1:自动打印


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



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


①设定好KPI的基本格式,然后每个顾问负责几个部门,在Excel里不断修改KPI表格,打印出来后去各个当事人及其领导那里讨论并修改;

②每周把所有的Excel文件中的KPI表格归集在一起,按顺序分部门打印出来,并需要多份,找负责该项目的HR头儿汇报进度和情况。


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

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


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



VBA编程之案例2:制作复杂的矩阵式分析图表


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

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




VBA编程之案例3:管理分布的任务流,并将Excel表格输出到Powerpoint


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


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


某些核心人员在多个任务线出现。比如:负责预算的财务人员,几乎要出现在各条线中负责相关预算的审批环节;

某些任务线的里程碑是其他任务线里程碑的必要条件而相互关联。比如:新车的下线时间影响发布会的时间,相关法规测试的通过又影响车辆的下线时间等等。


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

各顾问手中的表格是按照部门维度来划分的,汇总后需要按照不同的维度来输出不同类型的表格,比如:按任务线输出表格、按责任人输出表格、所有延误任务的表格、所有需要资源重点投入任务的表格等等。


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


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



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




VBA编程之案例4:构建Financial Model并根据结果倒推假设


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

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



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



VBA编程之案例5:海量下载Bloomberg数据并完成分析


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



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





数组函数+VBA


在项目中对Excel的要求很综合。首先通过数组函数,对每年对RIO酒购买时刻的提及率按省进行统计。



其次,利用VBA程序,将上表中H列和I列的数据,按省份涂色到下图中的地图中。


(涂色部分来自于网上的一段程序,制作GIF动画的是自己完成的)


最后,再次利用VBA编程以及调用外部程序(GIFSICLE),将一幅幅图表合成在一起生成GIF动画。






最后的彩蛋,还可以用VBA来画油画,零基础成为用美术作品把妹撩汉的艺术青年,下图把女神用Excel画成油画送给她。





作者:何明科

写过书翻译过书,《体验宝马Driven》、《感悟福特》等;做过投资做过互联网产品;目前专注于数据和互联网产品中。










“天呐这玩意儿实在太难啦!还没入门就想放弃啊!”


别怕!MOOC自习室为大家量身打造了入门款Excel教程,每天30分钟,用30天掌握足以应对日常工作的Excel技能!还能加微信群和大家一起学,你的疑问都有群里大神为你解答,进群还可以获得专属学习资源包~


扫码来学!教程每日更新哟!



▼戳阅读原文也能学


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存