編按:哈嘍,大家好!在上篇文章中我們給大家介紹了4種拆分工作表的方法,分別是函數、透視表、高級篩選、VBA,不知道小夥伴們學習得咋樣了?今天我們將學習合併工作表的三種方法,趕緊來看看吧!(由於合併工作表的第一種方法函數法,涉及的函數的應用相對複雜,在函數方面比較薄弱的同學,可以先看第二、三種方法,再繼續學習第一種~)
*********
【前言】
在上篇文章中,對於總表拆分為分表的操作一共給大家分享了四種方法,建議同學們一定要勤加練習,才能熟能生巧。既然說了拆分,那麼就沒有道理不說「合併」。同樣的,在日常工作中,合併各個分表到總表,也是經常會遇到的。
一、各個分表合併到總表——函數流
既然在「拆分」工作表的時候,我們使用了函數的方式,那麼就來再感受一下「合併」工作表的函數方式吧!依然使用之前的分表作為我們合併工作表的數據源。
步驟1:利用名稱管理器把工作表名稱建立為內存數組。按CTRL+F3,在彈出的「名稱管理器」窗口中,點擊「新建」,參照下圖進行設置:
函數:=GET.WORKBOOK(1)&T(NOW())
利用宏表函數「GET.WORKBOOK(1)」,得到工作薄內所有工作表名稱,並形成一個內存數組,把這個內存數組命名為「SHNAME」。T(NOW())是利用NOW函數的易失性,可以使宏表函數「GET.WORKBOOK(1)」自動更新。因為NOW函數返回的是時間格式的數值,T函數可以將數值轉換為空,而時間日期是特殊的數值,所以T(NOW())的結構將返回空文本「」,這樣返回值的內容就是工作表名稱了(注意這裡有坑,下面填坑)。
步驟2:新建一個空白工作表,命名為「匯總」,在《匯總》工作表的A1單元格中輸入「工作表」,在B1:K1區域複製粘貼分表的表頭欄位,在A2單元格輸入函數:
=MID(INDEX(SHNAME,INT((ROW(A1)-1)/15)+1),FIND("]",INDEX(SHNAME,INT((ROW(A1)-1)/15)+1))+1,99)。如下圖:
【函數解析】
這個嵌套函數的解析,要從上面提到的「坑」開始說起,GET.WORKBOOK(1)提取後的返回值是:[工作薄名稱]工作表名稱,這樣的格式。如果我們只需要提取工作表名稱,就要使用文本處理函數MID來提取(當然也可以用RIGHT函數,大家可以自己試一下),通過FIND函數找到「]」的起始位置再加1,就是工作表名稱的起始位置,用99作為MID函數的第三參數,來確定提取的字符串長度(如果提取長度超出實際長度,默認提取實際長度)。
這部分的內容,我們在製作excel中的目錄的文章中,詳細講解過,具體可以點擊連結《用GET.WORKBOOK函數實現excel批量生成帶超連結目錄且自動更新》,進行學習。
那麼這個函數最難理解的部分來了:
INDEX(SHNAME,INT((ROW(A1)-1)/15)+1)
SHNAME是什麼?是我們剛才在名稱管理器中設置的自定義名稱。在名稱管理器中使用了提取工作表名稱的宏表函數後,那麼就形成了一個內存數組,數組的內容是{分表1;分表2;分表3;匯總}四個內容,再用INDEX函數分別提取某個位置的內容(即提取出工作表名稱)。
因為每個分表中的明細數據都不可能是只有一條記錄條,所以我們對於SHNAME中的工作表名稱也不應該只提取一次,因此使用INT((ROW(A1)-1)/15)+1來確定我們引出分表名稱的次數。
對於這個函數的理解,需要空間感和數學思維相結合:
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
…
大家可以看出來,當行號減1等於我們設定的值「15」的時候,這個等式的值就會累加1 。這個15就是我們設定的最大引用記錄條的數值,算式就可以按這個數字,限定每個工作表名稱的引用次數。如果我們的各分表明細中最多的記錄條有6235行,那我們就設置這個值為INT((ROW(A1)-1)/6300)+1。
步驟3:刪除錯誤值和名為「匯總」的數據。
步驟4:在B2單元格中,根據分表名稱,提取分表中對應位置的數據,函數如下:
=INDIRECT(CONCATENATE($A2,"!",ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2))))
這三個函數其實都是常用函數,但是很多同學都不理解此時為什麼用這三個函數來嵌套,我們來看看下圖,估計會對同學們有所幫助。
B2單元格返回「《永達》表中的A2單元格」,如果直接引用的話,我們可以使用表達式「=永達!A2」。但是如果我們要動態的引用這個工作表的其他單元格地址,就需要使用上述函數過程:
第一階段——得到地址名:
ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2)),利用工作表名稱出現的次數,使用COUNTIF函數得到{1,2,3,…,15}的行號,再加1,就能得到對應目標工作表的引用行號,再使用COLUMN函數得到對應的列號。最後通過ADDRESS函數,返回行號列號確定的單元格地址。
第二階段——確定此單元格地址,屬於哪個工作表:
CONCATENATE($A2,"!",ADDRESS(COUNTIF($A$2:$A2,$A2)+1,COLUMN(A2))),CONCATENATE函數是一個連接文本的函數,A2單元格是工作表名稱「永達」,所以此函數運行後,就得到了「永達!A2」的字符串。
第三階段——使字符串形成引用地址:
INDIRECT函數引用連接,並返回引用地址值的函數。用INDIRECT函數引用剛才的「永達!A2」字符串,得到對應的單元格內容。
最後,將此函數向左填充、再向下填充,就可以得到我們各個分表的明細匯總了。
步驟5:因為我們使用了宏表函數,所以保存時,我們要另存為.XLSM格式的文件。
【小結】
從上圖中我們不難看出,如果對應的分表數據沒有15行的時候,那麼就會顯示0;而如果對應的分表數據超出設定的15行,那麼數據就會引出不全。
所以我們既要考慮最大行數的設定,做出匯總表後,還要篩選出為0的行進行刪除,這樣就會給我們後續的工作增加很多操作的步驟。
二、各個分表合併到總表——PQ流
PQ是什麼?PQ是POWER QUERY的縮寫(以下簡稱PQ),是EXCEL中一個查詢模塊,對於不是像作者這樣需要寫文章、寫教程的同學來說,咱們不用知道它的各種解釋,只要知道它的功能即可。就像工作表函數,我們知道IF、SUM如何使用就行,沒有必要知道這些內置函數存儲在EXCEL的什麼位置。
在EXCEL2016中PQ是自帶的,如下圖:
EXCEL2010版之前的版本是沒有PQ的,EXCEL2010和EXCEL2013版需要下載PQ插件。
步驟1:啟動PQ編輯器,如下圖:
步驟2:在「主頁」選項卡中,點選「新建源」——「文件」——「EXCEL」,在彈出的「導入數據」窗口中,按路徑找到需要合併分表的源文件,點擊「導入」按鈕,彈出「導航器」窗口:
步驟3:在「導航器」窗口中,勾選「選擇多項」,然後複選所有分表,再點擊「確定」按鈕將數據導入到PQ中,如下圖:
步驟4:在「主頁」選項卡下的「組合」下拉菜單中,點擊「追加查詢」功能按鍵,彈出「追加」窗口。
將所有非當前的工作表,逐一全部追加到右面的列表框中,點擊「確定」按鈕,此時就將其他的工作表都追加到了當前的工作表中。
步驟5:點擊「主頁」中左上角的「關閉並上載」按鍵,將新建查詢導入此EXCEL工作薄中,如下圖:
步驟6:保留下匯總的工作表,刪除其他的工作表,任務就完成了。
【小結】
沒有複雜的函數,所有的操作只需要滑鼠點擊即可完成,是不是很方便,那麼以後如果有再多的工作表合併的問題,都是分分鐘搞定了吧。
三、各個分表合併到總表——VBA流
「沒有完美的方法,只有完美的操作體系」。EXCEL帶給我們的好像就是這麼一個完美的操作體系,永遠都是「一題多解」,如果當你既不想費勁去寫函數,還想一勞永逸的合併工作表,那就採用VBA的方式來處理。
有很多同學都是「談VBA色變」,但是作者E圖表述要說,當你學了VBA才會真正的掌握EXCEL這個軟體。
按ALT+F11組合鍵打開VBE界面,新建「模塊1」,在代碼區域輸入下面的代碼,操作一波看看吧。
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是單元格區域對象的書寫方式,括號中的J代表數據區域的末列,同學們如果操作自己的表格的時候,可以改成自己數據的末列列標,並把代碼中的「匯總」改為自己匯總表的名稱,即可。
【編後語】
同工作薄的「拆分工作表」和「合併工作表」的方法給大家列舉了很多很多,在實際工作中,無論你掌握了哪種方法都可以讓你有的放矢的去做,最怕的就是你沒有一個方法傍身,那就真的無從下手了。
****部落窩教育-excel表格合併技巧***
原創:E圖表述/部落窩教育(未經同意,請勿轉載)