一個關於PowerQuery(及PowerPivot等工具)和VBA的簡單比較

常有朋友問到PowerQuery(以及PowerPivot、PowerView等PowerBI工具)和VBA之間的關係,特別是PowerQuery是否可以替代VBA的問題。比如剛剛又有知友在文章關於VBA教學方式的解答中提問「現在vba是不是已經過時了,用powerquery就可以啊」。所以這裡我先為大家做一個簡單的回復,過幾天會寫一個深入點的文章來詳細討論一下,PowerQuery等系列工具(簡單起見,以下均以PowerQuery代表)與VBA之間的關係。

==========================正文分割線==============================

關於VBA和PowerQuery的區別,我之前的另一個文章(公式 vs VBA,到底該選誰?)裡面略有涉及。PowerQuery 等一系列工具的功能非常強大,能夠滿足非常多的日常數據分析需求,而且學習曲線沒有VBA那樣陡峭,所以很值得大家學習。但是從我個人的感覺看,PowerQuery並不能替代VBA,因為二者的定位不同。簡單的說,PowerQuery是一個數據分析工具,而VBA則是一個辦公自動化工具

可能有些朋友不清楚數據分析與辦公自動化的區別,這裡解釋一下。數據分析的主要內容,是把一批數據按照規則整理、轉換成另一批數據,比如根據銷售明細數據編製區域季度報表。這個任務的重點在於「轉換/計算」。而辦公自動化的關注點,則是讓計算機自動執行大量重複的手工操作,比如把幾百張工作表都按照統一要求進行格式設定(修改每張工作表的名稱、合併某些單元格)、將一個表格中的數據拆分保存到若干個新建工作簿中,乃至將表格中的每條發票數據自動發送郵件給相應客戶等。從這個角度看,PowerQuery關注領域(也就是Excel數據分析)可以看做是VBA關注領域(所有Office辦公操作)的一個子集,這也就是為什麼目前PowerQuery還無法替代VBA的根本原因。

另外從技術層面看,目前PowerQuery仍然是一個用於「彌補從原始數據到Excel報表之間的空隙」的工具插件,而不是一個程序設計語言。這就意味著,當我們需要深入調用Office對象的時候,PowerQuery的靈活性不如VBA。

舉一個例子:PowerQuery可以輕鬆的把多個Worksheet匯總到一張工作表,但是如果反過來,把一個工作表的不同區域(不僅僅是不同列)拆分到多個工作表中再分別計算小計金額,使用PowerQuery就非常繁瑣了(具體例子可見微軟社區上這個討論貼:How to split one worksheet into multiple worksheets?)。而如果這個操作是你的日常工作內容,需要頻繁調用,並且每次調用時還需要指定一些特殊設定(比如是否將拆分結果保存到新的工作簿中等等),那麼使用PowerQuery就更加麻煩。這時候VBA作為辦公自動化工具的優勢就體現出來了:身為一門完整的Office二次開發工具,VBA可以調用幾乎所有Office對象的所有功能(比如新建工作表),甚至包括PowerQuery本身。所以使用VBA或者VBA調用PowerQuery的方式,你可以做出一個便捷的自動化工具,每次使用時點擊一個按鈕,挑選一個複選框,就可以輕鬆等待結果。

再舉一個例子:如果你想把一批表格的格式進行修改,比如根據數值大小修改某些單元格的顏色、字體,或者將某些內容相同的連續單元格合併在一起,那麼使用PowerQuery的難度可想而知。而VBA中只要調用Range等對象,幾行代碼套一個循環就可以完成。

此外,VBA還可以通過事件編程對Excel中的大多數手工操作進行模擬和控制。比如每當用戶單擊某個單元格時,根據其內容自動彈出一個輸入輸出窗體、或者執行一些數據校驗操作;每當手動添加一個新的工作表時,自動將該工作表進行預排版和基本信息填充、以及靈活控制各種Excel圖表等等(參見全民一起VBA提高篇(Excel數據處理) - 網易雲課堂第21回、27回),而且這些功能的程序代碼並不複雜,往往只需要十行左右就能實現。

以上還只是在二者重疊的領域(Excel數據處理)討論。如果我們把視野再放開一點,會發現更多VBA可以搞定、但PowerQuery卻很難發揮作用的地方。最簡單的例子:PowerQuery是Excel的插件,所以在Word、PPT等其他Office軟體中無法使用。但是VBA卻不受Excel的限制,比如我們《全民一起VBA 提高篇》(全民一起VBA提高篇(Excel數據處理) - 網易雲課堂)第34回中舉的例子,在Word中編寫一個小程序,就可以自動對Word文檔進行各種複雜的排版處理和文字處理;如果再配合正則表達式等工具庫,可以實現的功能就更加強大了。再考慮到對各種Windows系統API的調用、對Internet、Email的處理等,VBA能完成的任務確實不是目前的PowerQuery所能及的。

最後需要說明的是,「不可替代」是一個相互性的描述,PowerQuery不能取代VBA,而VBA也不能取代PowerQuery以及公式等等其他各種工具。任何一個技術都有自己的優勢和局限,VBA的局限我之前在另一個文章「Excel VBA不適合做什麼?」中已經有闡釋,大家可以去看一下。事實上對於很多Excel用戶來說,主要的日常工作就是基本的數據轉換。在這種情況下,PowerQuery很可能已經夠用,學習VBA也就只算是一個錦上添花的工作了。


推薦閱讀:

RFM靜態精細化分析
練習題056答案:九九乘法除法口訣表、十以內加法減法表
專欄導讀-Excel巔峰該如何攀登(Excel學習.序)
將多單元格內容合併到一個單元格居然有這麼多方法,你知道幾種?
淺談使用VBA處理不同語言時的亂碼問題

TAG:VBA | MicrosoftExcel | 财务 |