許多高級程序員瞧不上VBA。因為程序員是有鄙視鏈的:匯編 >C >C++ >Python >JAVA及C#及php(這三者相互撕) >VB >html。在這長長的鄙視鏈中,甚至都沒有VBA的位置。
可是,Excel+VBA是圖靈完備的,所以被程序員用來耍酷的各類性感語言能實現的大部分功能,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的價值。”
本文作者何明科,LinkedIn專欄作家。
1、自動打印
剛進職場的新人,只要爸爸不是李剛,基本都做過影帝影后(影=印,各種復印打印的體力勞動)。
特別是咨詢投行服務行業,在某次給客戶的大匯報或者大忽悠會議之前,花數小時或者整晚來打印數個文件,并不是天方夜譚。而且這件事情是對著同樣一堆不斷修改的文件,會經常不斷重復發生。
我加入BCG的第一個項目,就是幫助某大型企業從上到下設計KPI體系并實施。從上到下涉及到幾十個部門,大概有100多張的KPI表格需要完成,這些KPI表格分布在各個Excel文件里。
我們4個咨詢顧問的任務:
· 設定好KPI的基本格式,然后每個顧問負責幾個部門,在Excel里不斷修改KPI表格,打印出來后去各個當事人及其領導那里討論并修改。
· 每周把所有的Excel文件中的KPI表格歸集在一起,按順序分部門打印出來,并需要多份,找負責該項目的HR頭兒匯報進度和情況。
這里面有個費時費力的環節,每周需要在多個Excel文件中找出目標Worksheet,然后選定合適的區域作為輸出的表格,按照一定的格式和一定的順序,打印出這100多張表格。
之前我們全是憑借人力,每周由一個Analyst把所有最新的Excel文件收集在一起,然后挨個打開文件選中合適的Worksheet,選中區域設置好格式進行打印。每進行一次,幾乎耗費一兩個小時,還不能保證不出錯。
于是寫下了我的第一個VBA程序,而且基本上是宏錄制之后來改的,沒有使用參考書及搜索引擎,全靠F1和自動提示,所以貼出來特別紀念一下。實現的功能就是將上述的人肉實現的功能全部自動化。按下一個鈕,就慢慢等著打印機按順序出結果吧。
后來這個程序的升級版是:調度多臺打印機,進一步提高效率,以及將打印機卡紙造成隊列錯誤的概率降到極小的范圍內。
2、制作圖表及GIF動畫
圖表制作是每個Office一族的必備任務,制得一手好表格,絕對是升職加薪和偷懶放風的利器。利用Excel+VBA做出數張炫酷的信息地圖,利用VBA為每個省的圖形涂色。
(涂色部分來自于網上的一段程序,制作GIF動畫的是自己完成的)
同時,為了進一步增強炫酷結果,還利用VBA將這些連續變化的圖表做成了GIF動畫,可惜知乎不支持GIF的顯示。
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保持了最高靈活度和效率。
4、根據格式化信息,生成標準的word文件
這是幫朋友實現的一個項目,他們實驗室是研究某類事故并對重大事故進行鑒定,最后發布word版的正式報告。
之前的工作流程是在專業的軟件中完成計算和仿真,最后按照正式報告八股文的行文,把各種關鍵信息填進去,最后寫成word文件。
寫報告的過程枯燥而沒有技術含量,但卻要反復進行。
通過下圖的Word+VBA,完成主要的交互界面并連接計算軟件。
在通過簡單的交互獲取主要信息后,在后臺完成計算并將主要信息填寫入八股文的word模版,最終完成報告,同時將結構化的信息存入Access數據庫。
5、通過Excel管理分布的任務流,并將Excel表格輸出到Powerpoint
某國際大型汽車制造廠完成新品牌及其新款車型上市,面臨車型即將斷檔的窘境,該新車型的上市非常關鍵,不能錯失時間節點。
然而,新車型上市涉及到無數分支:制造、產品、市場、渠道、營銷、公關、財務等等,同時還要協調歐洲的兩個總部以及中國的兩個分部。
這次咨詢的核心任務就是項目管理,總控整個大項目的進度,并每周向中國區的CEO匯報進度并發掘出易出現問題的關鍵節點以調配資源。
我們4個咨詢顧問分配下去各自負責幾個部門或者項目分支,和團隊一起規劃流程、畫甘特圖、確認里程碑及時間點、安排負責人等等。
當每天回到辦公室大家將進度匯總在一起的時候發現了挑戰及難點,每條任務線并不是獨立發展的,而是各條任務線交織在一起并互相影響。
· 某些核心人員在多個任務線出現。比如:負責預算的財務人員,幾乎要出現在各條線中負責相關預算的審批環節。
· 某些任務線的里程碑是其他任務線里程碑的必要條件而相互關聯。比如:新車的下線時間影響發布會的時間,相關法規測試的通過又影響車輛的下線時間等等。
當任務線增多以及任務線之間的交叉越發頻繁的時候,匯總的任務將會幾何級數增加,這就是我們在項目過程中遇到的問題。
于是我利用Excel+VBA完成了這個工作的自動化。主要實現的功能:
· 自動將4個顧問手中分散的Excel文件匯集在一起形成一個大的總表,如下圖。
· 各顧問手中的表格是按照部門維度來劃分的,匯總后需要按照不同的維度來輸出不同類型的表格。
比如:按任務線輸出表格、按責任人輸出表格、所有延誤任務的表格、所有需要資源重點投入任務的表格等等
在此基礎之上,還要將上面提到的各種維度下的所有表格(大概有200多張),按要求格式粘貼到PPT中,每周提交給中國區的總部進行匯報和評估。密密麻麻的表格如下圖。
于是,我又寫了一個程序將Excel中的表格輸出到Powerpoint中,將一個秘書每次需要數小時才能完成的工作,簡化成了一鍵發布,并可以在Excel中完成對PPT的更新。
這個項目的程序量不小,近似于寫了一個迷你版的Microsoft Project來進行項目管理。
最后,下圖中密密麻麻的PPT每周需要更新一次,每次都是快100張的工作量,然而基本上都是靠Excel來自動完成更新的。
因為PPT的模版每次變化不大,我將這些模版記錄下來,每周更新的時候只要根據Excel中最新的數據更改PPT中的數據即可。
6、根據結果倒推假設
一般的Financial Model都是根據重重假設計算最終結果。而在為某頂級手機品牌服務的過程中,我們卻遭遇了逆向的尷尬。
本來是根據地面銷售人員的一定服務水平,計算所需要的銷售人員數量;結果在項目過程中,總部已經確定好了銷售人數的Head Count,轉而要求我們根據HC確定服務水平。
然而,服務水平不是一個單變量,是由零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務深度等多重因素來決定的,同時還可以根據一線至無線城市來變化。
于是只好再次祭出Excel+VBA法寶。
先根據常規思路建立好Financial Model,得出HC的初步結果。
然后寫VBA程序,根據不同的情景、不同的優先級以及不同的權重來調節零售店的覆蓋率、銷售拜訪頻率、拜訪中的服務深度等多因素,同時設定這幾大因素的可接受范圍,逐步逼近HC的預設值。
如果沒有程序,以前基本是靠人工手動調節來湊結果,而且因為各種情景的不同,還需要多次調節。
而通過程序,基本是自動完成,還可智能得設置優先級及權重,無需人工參與。
7、海量下載Bloomberg數據并完成分析
通過Bloomberg的VBA API,海量下載數百只目標股票的tick data以及order book。
并根據實現構建好的數學模型,在后臺完成計算,將上述的實時數據轉化成每只股票實時的trading cost,實時展現在交易員最常用的Excel界面中,方便交易員評估當下的交易成本以便于優化交易策略。
8、結語
計算了一下,我在BCG做了三年咨詢顧問,大概寫了幾萬行VBA程序(都是自己手工輸入的,沒有復制拷貝和系統自動生成),每個項目一千至幾千行程序不等。
最后將Excel用成了中控界面,類似EmacS,在Excel可以隨意操控全公司的打印機、Word、Powerpoint等等,自動完成各種任務以及數據更新和抓取。
因為Excel的數據更結構化,所以將其作為中控平臺,比Word和Powerpoint更有優勢。