本次我們要寫一個一鍵合并多個sheet的VBA小工具。展示的時候都是圖片展示,文章最后面有源代碼可以復(fù)制。大家可以復(fù)制嘗試。
這其中涉及到的Range和相對路徑的知識點,大家可以前往其他文章查看。
(1)Range的用法 第一天
(2)VBA中的相對路徑第二天
本章我們會整理一些比較細碎的知識點。
并且完成我們的第一個小功能!合并多個sheet!
使用Now()方法為合并后的EXCEL文件命名
因為考慮到源數(shù)據(jù)變化,我們需要不斷的點擊合并。因此這里需要有一個動態(tài)的命名方法。如果將命名寫成固定的名稱,在重復(fù)導(dǎo)出的時候會出錯。
首先Now()函數(shù)返回當前的日期+星期+時間,返回的是Date類型的,所以我們需要使用CDate()函數(shù)將Now()的返回值轉(zhuǎn)化為字符串。
這邊我們發(fā)現(xiàn)輸出的字符串有空格,也有冒號【:】字符,正常的文件名,不允許這樣的字符出現(xiàn)。因此我們需要對字符串進行替換處理。
使用Replace()方法替換命名中不合法的字符
Replace()方法接受3個參數(shù),非常簡單
Replace(需要操作的字符串,查找的字符,替換的字符)
為了美觀,我們把斜杠號【/】也一并去除。
這樣命名這部分就完成了。
使用Workbooks.Add方法,新建EXCEL文件,存放匯總后的數(shù)據(jù)
這個方法十分簡單,只需2行代碼,就可以新建一個EXCEL文件。
這里實測運行無誤。
存放數(shù)據(jù)的容器都有了,但是我們卻沒有保存,這里就需要使用到上面和以前的知識點了。
我們將該新建的EXCEL文件存放在源數(shù)據(jù)表的同級目錄。
這邊為了后期修改,我們將該功能封裝成一個函數(shù),該函數(shù)返回我們新建的EXCEL對象。供合并使用。
這邊我們已經(jīng)解決了一個較為關(guān)鍵的知識點。
現(xiàn)在我們就得開始合并每個sheet的內(nèi)容了。VBA合并sheet本質(zhì)上就是模擬人工,我們?nèi)藶楹喜⒌臅r候,(假設(shè)3個sheet)操作順序是這樣的:
①打開第1個sheet,復(fù)制,粘貼到指定的EXCEL中。(第1次復(fù)制粘貼帶著表頭)
②打開第2個sheet,復(fù)制,粘貼到指定的EXCEL中。(第2次復(fù)制粘貼不帶著表頭)
③打開第3個sheet,復(fù)制,粘貼到指定的EXCEL中。(第3次復(fù)制粘貼不帶著表頭)
因此這邊就需要循環(huán)一個EXCEL中的所有Sheet。
所以我們就需要下面的知識點!
使用For...Each循環(huán)每個Sheet
大家可以看一下圖,在使用For Each的時候,不要忘了加上Next。
既然我們可以循環(huán)到每個sheet了,那我們就可以操作每個sheet中的數(shù)據(jù),然后復(fù)制到存放的表了。但是由于循環(huán)的操作都是一樣的。所以第一次復(fù)制表頭而二三次不復(fù)制表頭循環(huán)里寫是不太美觀的。因此,我們把復(fù)制表頭單獨列出來寫。
并且我們將合并后要存放的數(shù)據(jù)存放EXCEL,作為我們的參數(shù),這樣后期的修改會比較方便。
這樣就完成了!
可以參考下動圖:
以下是源代碼,大家可以嘗試一下。有任何問題歡迎大家留言~
Sub Run() Dim tar_wb As Workbook Set tar_wb = CreateWorkbook Call MergeContent(tar_wb)End Sub'函數(shù)名: CreateWorkbook'接受參數(shù):無'返回值:Workbook(返回創(chuàng)建的Workbook)'說明:創(chuàng)建一個Excel文件,存放合并的數(shù)據(jù)Private Function CreateWorkbook() As Workbook Dim fileName As String Dim filePath As String Dim nowDate As String nowDate = CDate(Now()) nowDate = Replace(nowDate, ':', '') nowDate = Replace(nowDate, '/', '') nowDate = Replace(nowDate, ' ', '_') filePath = ThisWorkbook.path & '\' fileName = filePath & nowDate & '_匯總表.xlsx' Dim newBook As Workbook Set newBook = Workbooks.Add With newBook .SaveAs fileName End With Set CreateWorkbook = newBookEnd Function'函數(shù)名: MergeContent'接受參數(shù):targetWorkbook(合并后的數(shù)據(jù)存放的Workbook對象)'返回值:無'說明:將數(shù)據(jù)依次粘貼到目標Workbook對象、即EXCEL中。Private Function MergeContent(targetWorkbook As Workbook) '復(fù)制粘貼表頭 Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(1, 1).End(xlToRight)).Copy _ targetWorkbook.Sheets('Sheet1').Range('A65536').End(xlUp) '循環(huán)每個Sheet,然后把數(shù)據(jù)復(fù)制到存放EXCEL For Each sht In ThisWorkbook.Worksheets sht.Range('A1').CurrentRegion.Offset(1, 0).Copy _ targetWorkbook.Sheets('Sheet1').Range('A65536').End(xlUp).Offset(1, 0) Next '完成后,將存放EXCEL關(guān)閉,并且保存 targetWorkbook.Close TrueEnd Function