excel拆分合并技巧:將工作表合并成總表的方法

編按:哈嘍,大家好!在上篇文章中我們給大家介紹了4種拆分工作表的方法,分別是函數(shù)、透視表、高級(jí)篩選、VBA,不知道小伙伴們學(xué)習(xí)得咋樣了?今天我們將學(xué)習(xí)合并工作表的三種方法,趕緊來看看吧?。ㄓ捎诤喜⒐ぷ鞅淼牡谝环N方法函數(shù)法,涉及的函數(shù)的應(yīng)用相對(duì)復(fù)雜,在函數(shù)方面比較薄弱的同學(xué),可以先看第二、三種方法,再繼續(xù)學(xué)習(xí)第一種~)
*********
【前言】?
在上篇文章中,對(duì)于總表拆分為分表的操作一共給大家分享了四種方法,建議同學(xué)們一定要勤加練習(xí),才能熟能生巧。既然說了拆分,那么就沒有道理不說“合并”。同樣的,在日常工作中,合并各個(gè)分表到總表,也是經(jīng)常會(huì)遇到的。
一、各個(gè)分表合并到總表——函數(shù)流
既然在“拆分”工作表的時(shí)候,我們使用了函數(shù)的方式,那么就來再感受一下“合并”工作表的函數(shù)方式吧!依然使用之前的分表作為我們合并工作表的數(shù)據(jù)源。

?
步驟1:利用名稱管理器把工作表名稱建立為內(nèi)存數(shù)組。按CTRL+F3,在彈出的“名稱管理器”窗口中,點(diǎn)擊“新建”,參照下圖進(jìn)行設(shè)置:

?
函數(shù):=GET.WORKBOOK(1)&T(NOW())?
利用宏表函數(shù)“GET.WORKBOOK(1)”,得到工作薄內(nèi)所有工作表名稱,并形成一個(gè)內(nèi)存數(shù)組,把這個(gè)內(nèi)存數(shù)組命名為“SHNAME”。T(NOW())是利用NOW函數(shù)的易失性,可以使宏表函數(shù)“GET.WORKBOOK(1)”自動(dòng)更新。因?yàn)镹OW函數(shù)返回的是時(shí)間格式的數(shù)值,T函數(shù)可以將數(shù)值轉(zhuǎn)換為空,而時(shí)間日期是特殊的數(shù)值,所以T(NOW())的結(jié)構(gòu)將返回空文本“”,這樣返回值的內(nèi)容就是工作表名稱了(注意這里有坑,下面填坑)。?
步驟2:新建一個(gè)空白工作表,命名為“匯總”,在《匯總》工作表的A1單元格中輸入“工作表”,在B1:K1區(qū)域復(fù)制粘貼分表的表頭字段,在A2單元格輸入函數(shù):?
=MID(INDEX(SHNAME,INT((ROW(A1)-1)/15)+1),FIND("]",INDEX(SHNAME,INT((ROW(A1)-1)/15)+1))+1,99)。如下圖:?

【函數(shù)解析】
這個(gè)嵌套函數(shù)的解析,要從上面提到的“坑”開始說起,GET.WORKBOOK(1)提取后的返回值是:[工作薄名稱]工作表名稱,這樣的格式。如果我們只需要提取工作表名稱,就要使用文本處理函數(shù)MID來提?。ó?dāng)然也可以用RIGHT函數(shù),大家可以自己試一下),通過FIND函數(shù)找到“]”的起始位置再加1,就是工作表名稱的起始位置,用99作為MID函數(shù)的第三參數(shù),來確定提取的字符串長度(如果提取長度超出實(shí)際長度,默認(rèn)提取實(shí)際長度)。?
這部分的內(nèi)容,我們?cè)谥谱鱡xcel中的目錄的文章中,詳細(xì)講解過,具體可以點(diǎn)擊鏈接《用GET.WORKBOOK函數(shù)實(shí)現(xiàn)excel批量生成帶超鏈接目錄且自動(dòng)更新》,進(jìn)行學(xué)習(xí)。?
那么這個(gè)函數(shù)最難理解的部分來了:
INDEX(SHNAME,INT((ROW(A1)-1)/15)+1)?
SHNAME是什么?是我們剛才在名稱管理器中設(shè)置的自定義名稱。在名稱管理器中使用了提取工作表名稱的宏表函數(shù)后,那么就形成了一個(gè)內(nèi)存數(shù)組,數(shù)組的內(nèi)容是{分表1;分表2;分表3;匯總}四個(gè)內(nèi)容,再用INDEX函數(shù)分別提取某個(gè)位置的內(nèi)容(即提取出工作表名稱)。?
因?yàn)槊總€(gè)分表中的明細(xì)數(shù)據(jù)都不可能是只有一條記錄條,所以我們對(duì)于SHNAME中的工作表名稱也不應(yīng)該只提取一次,因此使用INT((ROW(A1)-1)/15)+1來確定我們引出分表名稱的次數(shù)。?
對(duì)于這個(gè)函數(shù)的理解,需要空間感和數(shù)學(xué)思維相結(jié)合:?
1:ROW(A1)=1,?INT((ROW(A1)-1)/15)+1 = INT(0/15)+1 = 0+1 =1
2:ROW(A2)=2,?INT((ROW(A2)-1)/15)+1 = INT(1/15)+1 = 0+1 =1
3:ROW(A3)=3,?INT((ROW(A3)-1)/15)+1 = INT(2/15)+1 = 0+1 =1
…
15:ROW(A15)=15,?INT((ROW(A15)-1)/15)+1 = INT(14/15)+1 = 0+1 =1
16:ROW(A16)=16,?INT((ROW(A16)-1)/15)+1 = INT(15/15)+1 = 1+1 =2
17:ROW(A17)=17,?INT((ROW(A17)-1)/15)+1 = INT(16/15)+1 = 1+1 =2
…
30:ROW(A30)=30,?INT((ROW(A30)-1)/15)+1 = INT(29/15)+1 = 1+1 =2
31:ROW(A31)=31,?INT((ROW(A31)-1)/15)+1 = INT(30/15)+1 = 2+1 =3
…
?
大家可以看出來,當(dāng)行號(hào)減1等于我們?cè)O(shè)定的值“15”的時(shí)候,這個(gè)等式的值就會(huì)累加1?。這個(gè)15就是我們?cè)O(shè)定的最大引用記錄條的數(shù)值,算式就可以按這個(gè)數(shù)字,限定每個(gè)工作表名稱的引用次數(shù)。如果我們的各分表明細(xì)中最多的記錄條有6235行,那我們就設(shè)置這個(gè)值為INT((ROW(A1)-1)/6300)+1。?
步驟3:刪除錯(cuò)誤值和名為“匯總”的數(shù)據(jù)。?

步驟4:在B2單元格中,根據(jù)分表名稱,提取分表中對(duì)應(yīng)位置的數(shù)據(jù),函數(shù)如下:?
=INDIRECT(CONCATENATE($A2,"!",ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2))))?
這三個(gè)函數(shù)其實(shí)都是常用函數(shù),但是很多同學(xué)都不理解此時(shí)為什么用這三個(gè)函數(shù)來嵌套,我們來看看下圖,估計(jì)會(huì)對(duì)同學(xué)們有所幫助。?

B2單元格返回“《永達(dá)》表中的A2單元格”,如果直接引用的話,我們可以使用表達(dá)式“=永達(dá)!A2”。但是如果我們要?jiǎng)討B(tài)的引用這個(gè)工作表的其他單元格地址,就需要使用上述函數(shù)過程:?
第一階段——得到地址名:?
ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2)),利用工作表名稱出現(xiàn)的次數(shù),使用COUNTIF函數(shù)得到{1,2,3,…,15}的行號(hào),再加1,就能得到對(duì)應(yīng)目標(biāo)工作表的引用行號(hào),再使用COLUMN函數(shù)得到對(duì)應(yīng)的列號(hào)。最后通過ADDRESS函數(shù),返回行號(hào)列號(hào)確定的單元格地址。?
第二階段——確定此單元格地址,屬于哪個(gè)工作表:?
CONCATENATE($A2,"!",ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2))),CONCATENATE函數(shù)是一個(gè)連接文本的函數(shù),A2單元格是工作表名稱“永達(dá)”,所以此函數(shù)運(yùn)行后,就得到了“永達(dá)!A2”的字符串。?
第三階段——使字符串形成引用地址:
INDIRECT函數(shù)引用連接,并返回引用地址值的函數(shù)。用INDIRECT函數(shù)引用剛才的“永達(dá)!A2”字符串,得到對(duì)應(yīng)的單元格內(nèi)容。?
最后,將此函數(shù)向左填充、再向下填充,就可以得到我們各個(gè)分表的明細(xì)匯總了。?

?
步驟5:因?yàn)槲覀兪褂昧撕瓯砗瘮?shù),所以保存時(shí),我們要另存為.XLSM格式的文件。
?
【小結(jié)】?
從上圖中我們不難看出,如果對(duì)應(yīng)的分表數(shù)據(jù)沒有15行的時(shí)候,那么就會(huì)顯示0;而如果對(duì)應(yīng)的分表數(shù)據(jù)超出設(shè)定的15行,那么數(shù)據(jù)就會(huì)引出不全。?
所以我們既要考慮最大行數(shù)的設(shè)定,做出匯總表后,還要篩選出為0的行進(jìn)行刪除,這樣就會(huì)給我們后續(xù)的工作增加很多操作的步驟。
二、各個(gè)分表合并到總表——PQ流
PQ是什么?PQ是POWER QUERY的縮寫(以下簡稱PQ),是EXCEL中一個(gè)查詢模塊,對(duì)于不是像作者這樣需要寫文章、寫教程的同學(xué)來說,咱們不用知道它的各種解釋,只要知道它的功能即可。就像工作表函數(shù),我們知道IF、SUM如何使用就行,沒有必要知道這些內(nèi)置函數(shù)存儲(chǔ)在EXCEL的什么位置。?
在EXCEL2016中PQ是自帶的,如下圖:?

?
EXCEL2010版之前的版本是沒有PQ的,EXCEL2010和EXCEL2013版需要下載PQ插件。?
步驟1:啟動(dòng)PQ編輯器,如下圖:?

?
步驟2:在“主頁”選項(xiàng)卡中,點(diǎn)選“新建源”——“文件”——“EXCEL”,在彈出的“導(dǎo)入數(shù)據(jù)”窗口中,按路徑找到需要合并分表的源文件,點(diǎn)擊“導(dǎo)入”按鈕,彈出“導(dǎo)航器”窗口:?

?
步驟3:在“導(dǎo)航器”窗口中,勾選“選擇多項(xiàng)”,然后復(fù)選所有分表,再點(diǎn)擊“確定”按鈕將數(shù)據(jù)導(dǎo)入到PQ中,如下圖:?


步驟4:在“主頁”選項(xiàng)卡下的“組合”下拉菜單中,點(diǎn)擊“追加查詢”功能按鍵,彈出“追加”窗口。?


將所有非當(dāng)前的工作表,逐一全部追加到右面的列表框中,點(diǎn)擊“確定”按鈕,此時(shí)就將其他的工作表都追加到了當(dāng)前的工作表中。?
步驟5:點(diǎn)擊“主頁”中左上角的“關(guān)閉并上載”按鍵,將新建查詢導(dǎo)入此EXCEL工作薄中,如下圖:?

步驟6:保留下匯總的工作表,刪除其他的工作表,任務(wù)就完成了。
?
【小結(jié)】?
沒有復(fù)雜的函數(shù),所有的操作只需要鼠標(biāo)點(diǎn)擊即可完成,是不是很方便,那么以后如果有再多的工作表合并的問題,都是分分鐘搞定了吧。
三、各個(gè)分表合并到總表——VBA流
“沒有完美的方法,只有完美的操作體系”。EXCEL帶給我們的好像就是這么一個(gè)完美的操作體系,永遠(yuǎn)都是“一題多解”,如果當(dāng)你既不想費(fèi)勁去寫函數(shù),還想一勞永逸的合并工作表,那就采用VBA的方式來處理。?
有很多同學(xué)都是“談VBA色變”,但是作者E圖表述要說,當(dāng)你學(xué)了VBA才會(huì)真正的掌握EXCEL這個(gè)軟件。?
按ALT+F11組合鍵打開VBE界面,新建“模塊1”,在代碼區(qū)域輸入下面的代碼,操作一波看看吧。?

Sub?合并工作表()
? Sheets("匯總").Range("A2:J65000").ClearContents
? For Each sh In Worksheets
??? If sh.Name <> "匯總" Then
????? a = Sheets("匯總").Range("A65000").End(3).Row + 1
????? b = sh.Range("A65000").End(3).Row
????? sh.Range("A2:J" & b).Copy Sheets("匯總").Cells(a, 1)
??? End If
? Next
End Sub
?
代碼中的Range是單元格區(qū)域?qū)ο蟮臅鴮懛绞?,括?hào)中的J代表數(shù)據(jù)區(qū)域的末列,同學(xué)們?nèi)绻僮髯约旱谋砀竦臅r(shí)候,可以改成自己數(shù)據(jù)的末列列標(biāo),并把代碼中的“匯總”改為自己匯總表的名稱,即可。
【編后語】?
同工作薄的“拆分工作表”和“合并工作表”的方法給大家列舉了很多很多,在實(shí)際工作中,無論你掌握了哪種方法都可以讓你有的放矢的去做,最怕的就是你沒有一個(gè)方法傍身,那就真的無從下手了。
****部落窩教育-excel表格合并技巧***
原創(chuàng):E圖表述/部落窩教育(未經(jīng)同意,請(qǐng)勿轉(zhuǎn)載)
更多教程:部落窩教育(www.itblw.com)
微信公眾號(hào):exceljiaocheng