許多高級程序員瞧不上VBA。因為程序員是有鄙視鏈的:匯編 >C >C++ >Python >JAVA及C#及php(這三者相互撕) >VB >html。在這長長的鄙視鏈中,甚至都沒有VBA的位置。
可是,Excel+VBA是圖靈完備的,所以被程序員用來耍酷的各類性感語言能實現(xiàn)的大部分功能,Excel+VBA都能實現(xiàn),而且往往是以更高效更快捷的方式,在這里不談效率和優(yōu)雅。
而且考慮到大部分普通群眾是沒有編程環(huán)境的(各種依賴各種包,各種OS各種編譯環(huán)境,還有IDE),然而使用VBA,只需要打開裝機自帶的office,然后按下Alt+F11就自動進入編程和執(zhí)行環(huán)境;
甚至可以更簡單的通過錄制宏來解決寫程序的問題,只需要在簡單的代碼基礎(chǔ)上修修補補就可以執(zhí)行。
再考慮到VBA和Office各軟件的完美整合,所以在便捷性方面,VBA是無可比擬的。
最后,Office+VBA的分享性和移植性很強,任何測試通過的程序放到別的機器上也可輕易執(zhí)行;而其他程序,哪怕是一段最簡單的“Hello World”,也不一定。
因此本文討論各種通過Excel+VBA能實現(xiàn)的各種炫酷功能(也會拓展到Office+VBA),主要是為Professional Service以及各行各業(yè)不寫程序但是又嚴重依賴于Office的職場人士服務(wù)的。
曾經(jīng)有一個朋友和我說,“Excel根本不需要編程,像我這樣的Excel大牛靠函數(shù)和自定義函數(shù)能解決所有的問題。”
對于這樣的評論,我想起自己小學(xué)時的一段經(jīng)歷。因為不能理解虛數(shù)i(i^2 = -1)的價值,問我爸i有卵用?我爸說,“等你長大了,遇到更多的問題,就知道i的價值。”
本文作者何明科,LinkedIn專欄作家。
1、自動打印
剛進職場的新人,只要爸爸不是李剛,基本都做過影帝影后(影=印,各種復(fù)印打印的體力勞動)。
特別是咨詢投行服務(wù)行業(yè),在某次給客戶的大匯報或者大忽悠會議之前,花數(shù)小時或者整晚來打印數(shù)個文件,并不是天方夜譚。而且這件事情是對著同樣一堆不斷修改的文件,會經(jīng)常不斷重復(fù)發(fā)生。
我加入BCG的第一個項目,就是幫助某大型企業(yè)從上到下設(shè)計KPI體系并實施。從上到下涉及到幾十個部門,大概有100多張的KPI表格需要完成,這些KPI表格分布在各個Excel文件里。
我們4個咨詢顧問的任務(wù):
· 設(shè)定好KPI的基本格式,然后每個顧問負責(zé)幾個部門,在Excel里不斷修改KPI表格,打印出來后去各個當(dāng)事人及其領(lǐng)導(dǎo)那里討論并修改。
· 每周把所有的Excel文件中的KPI表格歸集在一起,按順序分部門打印出來,并需要多份,找負責(zé)該項目的HR頭兒匯報進度和情況。
這里面有個費時費力的環(huán)節(jié),每周需要在多個Excel文件中找出目標Worksheet,然后選定合適的區(qū)域作為輸出的表格,按照一定的格式和一定的順序,打印出這100多張表格。
之前我們?nèi)菓{借人力,每周由一個Analyst把所有最新的Excel文件收集在一起,然后挨個打開文件選中合適的Worksheet,選中區(qū)域設(shè)置好格式進行打印。每進行一次,幾乎耗費一兩個小時,還不能保證不出錯。
于是寫下了我的第一個VBA程序,而且基本上是宏錄制之后來改的,沒有使用參考書及搜索引擎,全靠F1和自動提示,所以貼出來特別紀念一下。實現(xiàn)的功能就是將上述的人肉實現(xiàn)的功能全部自動化。按下一個鈕,就慢慢等著打印機按順序出結(jié)果吧。
后來這個程序的升級版是:調(diào)度多臺打印機,進一步提高效率,以及將打印機卡紙造成隊列錯誤的概率降到極小的范圍內(nèi)。
2、制作圖表及GIF動畫
圖表制作是每個Office一族的必備任務(wù),制得一手好表格,絕對是升職加薪和偷懶放風(fēng)的利器。利用Excel+VBA做出數(shù)張炫酷的信息地圖,利用VBA為每個省的圖形涂色。
(涂色部分來自于網(wǎng)上的一段程序,制作GIF動畫的是自己完成的)
同時,為了進一步增強炫酷結(jié)果,還利用VBA將這些連續(xù)變化的圖表做成了GIF動畫,可惜知乎不支持GIF的顯示。

3、制作復(fù)雜的分析圖表
下圖是研究各個車型之間的用戶相互轉(zhuǎn)換關(guān)系,因為要將一維的轉(zhuǎn)化率向量,變成兩維的矩陣,所以使用了如下的復(fù)雜公式。
=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))
同時為了用顏色的深淺來表示轉(zhuǎn)化率的大小關(guān)系而便于比較,使用了VBA對下面的矩陣進行著色。當(dāng)然有人肯定會說可以使用條件化格式,但是使用VBA保持了最高靈活度和效率。

4、根據(jù)格式化信息,生成標準的word文件
這是幫朋友實現(xiàn)的一個項目,他們實驗室是研究某類事故并對重大事故進行鑒定,最后發(fā)布word版的正式報告。
之前的工作流程是在專業(yè)的軟件中完成計算和仿真,最后按照正式報告八股文的行文,把各種關(guān)鍵信息填進去,最后寫成word文件。
寫報告的過程枯燥而沒有技術(shù)含量,但卻要反復(fù)進行。
通過下圖的Word+VBA,完成主要的交互界面并連接計算軟件。
在通過簡單的交互獲取主要信息后,在后臺完成計算并將主要信息填寫入八股文的word模版,最終完成報告,同時將結(jié)構(gòu)化的信息存入Access數(shù)據(jù)庫。

5、通過Excel管理分布的任務(wù)流,并將Excel表格輸出到Powerpoint
某國際大型汽車制造廠完成新品牌及其新款車型上市,面臨車型即將斷檔的窘境,該新車型的上市非常關(guān)鍵,不能錯失時間節(jié)點。
然而,新車型上市涉及到無數(shù)分支:制造、產(chǎn)品、市場、渠道、營銷、公關(guān)、財務(wù)等等,同時還要協(xié)調(diào)歐洲的兩個總部以及中國的兩個分部。
這次咨詢的核心任務(wù)就是項目管理,總控整個大項目的進度,并每周向中國區(qū)的CEO匯報進度并發(fā)掘出易出現(xiàn)問題的關(guān)鍵節(jié)點以調(diào)配資源。
我們4個咨詢顧問分配下去各自負責(zé)幾個部門或者項目分支,和團隊一起規(guī)劃流程、畫甘特圖、確認里程碑及時間點、安排負責(zé)人等等。
當(dāng)每天回到辦公室大家將進度匯總在一起的時候發(fā)現(xiàn)了挑戰(zhàn)及難點,每條任務(wù)線并不是獨立發(fā)展的,而是各條任務(wù)線交織在一起并互相影響。
· 某些核心人員在多個任務(wù)線出現(xiàn)。比如:負責(zé)預(yù)算的財務(wù)人員,幾乎要出現(xiàn)在各條線中負責(zé)相關(guān)預(yù)算的審批環(huán)節(jié)。
· 某些任務(wù)線的里程碑是其他任務(wù)線里程碑的必要條件而相互關(guān)聯(lián)。比如:新車的下線時間影響發(fā)布會的時間,相關(guān)法規(guī)測試的通過又影響車輛的下線時間等等。
當(dāng)任務(wù)線增多以及任務(wù)線之間的交叉越發(fā)頻繁的時候,匯總的任務(wù)將會幾何級數(shù)增加,這就是我們在項目過程中遇到的問題。
于是我利用Excel+VBA完成了這個工作的自動化。主要實現(xiàn)的功能:
· 自動將4個顧問手中分散的Excel文件匯集在一起形成一個大的總表,如下圖。
· 各顧問手中的表格是按照部門維度來劃分的,匯總后需要按照不同的維度來輸出不同類型的表格。
比如:按任務(wù)線輸出表格、按責(zé)任人輸出表格、所有延誤任務(wù)的表格、所有需要資源重點投入任務(wù)的表格等等

在此基礎(chǔ)之上,還要將上面提到的各種維度下的所有表格(大概有200多張),按要求格式粘貼到PPT中,每周提交給中國區(qū)的總部進行匯報和評估。密密麻麻的表格如下圖。
于是,我又寫了一個程序?qū)xcel中的表格輸出到Powerpoint中,將一個秘書每次需要數(shù)小時才能完成的工作,簡化成了一鍵發(fā)布,并可以在Excel中完成對PPT的更新。

這個項目的程序量不小,近似于寫了一個迷你版的Microsoft Project來進行項目管理。

最后,下圖中密密麻麻的PPT每周需要更新一次,每次都是快100張的工作量,然而基本上都是靠Excel來自動完成更新的。
因為PPT的模版每次變化不大,我將這些模版記錄下來,每周更新的時候只要根據(jù)Excel中最新的數(shù)據(jù)更改PPT中的數(shù)據(jù)即可。

6、根據(jù)結(jié)果倒推假設(shè)
一般的Financial Model都是根據(jù)重重假設(shè)計算最終結(jié)果。而在為某頂級手機品牌服務(wù)的過程中,我們卻遭遇了逆向的尷尬。
本來是根據(jù)地面銷售人員的一定服務(wù)水平,計算所需要的銷售人員數(shù)量;結(jié)果在項目過程中,總部已經(jīng)確定好了銷售人數(shù)的Head Count,轉(zhuǎn)而要求我們根據(jù)HC確定服務(wù)水平。
然而,服務(wù)水平不是一個單變量,是由零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務(wù)深度等多重因素來決定的,同時還可以根據(jù)一線至無線城市來變化。
于是只好再次祭出Excel+VBA法寶。
先根據(jù)常規(guī)思路建立好Financial Model,得出HC的初步結(jié)果。
然后寫VBA程序,根據(jù)不同的情景、不同的優(yōu)先級以及不同的權(quán)重來調(diào)節(jié)零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務(wù)深度等多因素,同時設(shè)定這幾大因素的可接受范圍,逐步逼近HC的預(yù)設(shè)值。

如果沒有程序,以前基本是靠人工手動調(diào)節(jié)來湊結(jié)果,而且因為各種情景的不同,還需要多次調(diào)節(jié)。
而通過程序,基本是自動完成,還可智能得設(shè)置優(yōu)先級及權(quán)重,無需人工參與。
7、海量下載Bloomberg數(shù)據(jù)并完成分析
通過Bloomberg的VBA API,海量下載數(shù)百只目標股票的tick data以及order book。

并根據(jù)實現(xiàn)構(gòu)建好的數(shù)學(xué)模型,在后臺完成計算,將上述的實時數(shù)據(jù)轉(zhuǎn)化成每只股票實時的trading cost,實時展現(xiàn)在交易員最常用的Excel界面中,方便交易員評估當(dāng)下的交易成本以便于優(yōu)化交易策略。

8、結(jié)語
計算了一下,我在BCG做了三年咨詢顧問,大概寫了幾萬行VBA程序(都是自己手工輸入的,沒有復(fù)制拷貝和系統(tǒng)自動生成),每個項目一千至幾千行程序不等。
最后將Excel用成了中控界面,類似EmacS,在Excel可以隨意操控全公司的打印機、Word、Powerpoint等等,自動完成各種任務(wù)以及數(shù)據(jù)更新和抓取。
因為Excel的數(shù)據(jù)更結(jié)構(gòu)化,所以將其作為中控平臺,比Word和Powerpoint更有優(yōu)勢。