文/黃波藝
相信在工作中,很多時(shí)候會(huì)涉及多張工作表合并。特點(diǎn)是每張工作表的字段(標(biāo)題)一致,但是數(shù)據(jù)不一樣。例如各地的銷售報(bào)表,各個(gè)部門的財(cái)務(wù)報(bào)表等等。如果是三兩張表,怎么合并都問題不大。但是如果有幾十上百張表呢?怎么處理?
方法不限于以下三個(gè):
一. Ctrl + C, Ctrl + V
數(shù)據(jù)的搬運(yùn)工,理論上也是沒有問題的??墒钱?dāng)你在苦逼苦逼地復(fù)制粘貼,挑燈夜戰(zhàn),頭發(fā)冒煙的時(shí)候,可曾想妹子/暖男早跑光了呢?
二. VBA for Excel
對VBA有一定了解的話,也不難?;具壿嬍牵哼x取工作表的數(shù)據(jù)區(qū)域—復(fù)制—粘貼到匯總表—循環(huán)所有工作表。同樣是復(fù)制粘貼,不過前者自己動(dòng)手,后者讓機(jī)器動(dòng)手。但是單純?yōu)榱撕喜资畯埍韺iT學(xué)VBA的話,恐怕不一定所有人都有這興趣和耐心。
干脆順便把代碼也貼出來,有興趣的朋友可以看看。
<code>
Sub collectAll()
Dim i As Integer
'如果在03-07版本運(yùn)行,行數(shù)只有65535行,請把1048576改為65536.
Sheets(1).Range("a2:h1048576").ClearContents
For i = 2 To Sheets.Count
Sheets(i).Range("a2",”Sheets(i).Range("a2").End(xlToRight).End(xlDown)).Copy (Sheets(1).Range("a1048576").End(xlUp).Offset(1, 0))
Next
End Sub
</code>
無論什么時(shí)候工作表的記錄發(fā)生增刪修改(包括增加字段),運(yùn)行以上代碼均可即時(shí)刷新匯總數(shù)據(jù)。
三. 用數(shù)據(jù)整理利器PowerQuery
前面我說了這么多,顯然就是為就是為今天的主角--PowerQuery做鋪墊的。
“查詢增強(qiáng)版(PowerQuery)是一個(gè)Excel插件,是Power BI(商業(yè)智能)的一個(gè)組件。
使用PowerQuery,您可以:
? 從你所需要的數(shù)據(jù)來源提取數(shù)據(jù)(如關(guān)系型數(shù)據(jù)庫、Excel、文本和XML文件,OData提要、web頁面、Hadoop的HDFS,等等)
? 使用搜索功能,從內(nèi)部和外部發(fā)現(xiàn)相關(guān)的數(shù)據(jù)功能。
? 把不同來源的數(shù)據(jù)源整合在一起,建立好數(shù)據(jù)模型,為用Excel、Power Pivot、Power View、Power Map進(jìn)行進(jìn)一步的數(shù)據(jù)分析做好準(zhǔn)備。
? 與他人分享您所創(chuàng)建的查詢,讓他們可以很容易地通過搜索找到它?!?br>
--摘自微軟官方
簡單點(diǎn)說,PowerQuery就是PowerBI(商業(yè)智能)的一個(gè)組件,在Office2016版和Office365版本中,直接嵌入到了Excel(如果是舊版本,可以到微軟官方網(wǎng)站下載插件安裝)。它是一個(gè)數(shù)據(jù)查詢,整理,清洗的工具。而整理數(shù)組的目的主要就是為了對下一步PowerPivot的數(shù)據(jù)建模和分析做準(zhǔn)備。不過就算我們不需要進(jìn)行數(shù)據(jù)建模和制作儀表盤,也可以利用PowerQuery進(jìn)行數(shù)據(jù)處理。
言歸正傳,在PowerQuery合并多個(gè)工作表那就簡單多了。因?yàn)槭菍ο蠡僮?,操作界面友好,不需要寫代碼(當(dāng)然PowerQuery還是可以利用M代碼進(jìn)行更高級的操作,比如如果要合并多個(gè)工作簿的話就需要修改一下操作步驟的代碼)。
以下演示基于Excel2016專業(yè)增強(qiáng)版(不同版本的操作面板可能有差異,但核心的操作命令是一樣的)。
第一階段:
從數(shù)據(jù)選項(xiàng)卡進(jìn)入PowerQuery查詢;
當(dāng)我們進(jìn)入PowerQuery之后,發(fā)現(xiàn)共有31個(gè)工作表,其中每個(gè)工作表中有一個(gè)表。常規(guī)做法是建立31個(gè)查詢,然后通過“追加查詢”(Union all)的方式匯總所有數(shù)據(jù)。
但是,這樣做有兩個(gè)問題:
- 建立31個(gè)查詢的速度比建立1個(gè)查詢的速度慢的可不止31倍;
- 需要一個(gè)個(gè)地把所有表添加到“追加查詢”的列表中,如果有幾百個(gè)表呢?(都用上PowerQuery了,難道我還會(huì)做這些這么沒技術(shù)含量的重復(fù)動(dòng)作嗎?)
所以,不要選擇多個(gè),選擇建立任意一個(gè)查詢就好了。
第二階段:
其實(shí)我們并非要這一張表的數(shù)據(jù),而是要通過這張表向上追溯它的源頭。所以,建立查詢后,把“源”之后的應(yīng)用步驟都刪掉。然后我們就可以看到“源”數(shù)據(jù)的真面目了:工作簿里包含的所有表,位于data字段,正是我們要合并的數(shù)據(jù)。我們只要保留data字段就好了。接著把data字段里的所有table的所有字段都擴(kuò)展出來。
至此為止,此工作簿中的所有表已經(jīng)被合并。然而,工作還未完成。
第三階段:
雖然所有表已經(jīng)被合并,但是我們還需要設(shè)置好字段:把首行提升到字段。另外,因?yàn)槊總€(gè)表的表頭都被合并了過來,所以我們還需要通過篩選去除每個(gè)表的表頭。
最后一步,保存并上載到Excel。Mission Complete!
如果光看文字,可能會(huì)覺得復(fù)雜,但是實(shí)際操作起來就是幾分鐘的事。而且建立了鏈接后,任何時(shí)候只要刷新匯總表就能得到最新的數(shù)據(jù)—真正意義上的一鍵刷新(甚至還可以寫一小段VBA代碼實(shí)現(xiàn)當(dāng)每次工作表被激活(Activate)時(shí)就自動(dòng)刷新。爽翻了!)。
這個(gè)小小的功能,對于PowerQuery而言僅僅是冰山一角罷了。有時(shí)候,PowerQuery能輕易地做到一些些在Excel中很費(fèi)力氣的工作。尤其在面對海量數(shù)據(jù)的時(shí)候,Excel函數(shù)的運(yùn)行效率會(huì)表現(xiàn)出一定的局限性。
個(gè)人之言,PowerQuery確實(shí)是查詢,整理數(shù)據(jù)的利器,還有更多好玩的東西可以讓大家發(fā)掘。有興趣的朋友可以研究研究。