通過之前的幾節(jié)的分享,小伙伴們應(yīng)該能夠熟練的掌握工作表的新建和重命名等一些簡單的操作了,既然已經(jīng)有了一些基本的基礎(chǔ)之后,我們現(xiàn)在開始增加難度,學(xué)習(xí)一些更加實用性的操作吧,今天我們來分享下批量合并單個工作薄下所有工作表的數(shù)據(jù) 工作???工作表?有什么不同,還比較懵的小伙伴們建議看看這一系列的第一節(jié)分享,這里就不再重復(fù)說明了,批量合并工作表在大家的日常工作中是非常常見的,因為很小伙伴在我一開始說工作表的時候,就說到這個問題了,接下來我們進入實際的場景模擬,綜合實例來學(xué)習(xí)下批量工作表的合并操作 場景模擬 還是用我們之前的例子吧,假設(shè)當(dāng)前工作薄內(nèi)有3個班次的所有學(xué)生的VBA和python的考試成績 現(xiàn)在我們想要知道本年級所有的學(xué)生的考試成功,就需要將這幾個表匯總在一起,不然的話,沒有辦法針對整體進行分析 一個個的復(fù)制粘貼明顯很明顯,并不是我們想要的效果,雖然眼下只有3個工作表,但是如果有10+,20+呢? 我們還是學(xué)習(xí)系VBA的做法,這樣能夠更好的提升工作效率
首先我們來查看下數(shù)據(jù),每個報表的數(shù)據(jù)結(jié)構(gòu)都是相同的, 這是一個標準結(jié)構(gòu)的數(shù)據(jù),那就非常簡單了,上代碼 Sub testadd() Dim sth As Worksheet, new_sth As Worksheet Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "匯總表" Set new_sth = ActiveSheet k = 0 For Each sth In Worksheets If sth.Name <> "匯總表" Then If Not sth.UsedRange Is Nothing Then k = k + 1 If k = 1 Then sth.UsedRange.Copy new_sth.Cells(1, 1) Else l = new_sth.Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(1, 0).Copy new_sth.Cells(l + 1, 1) End If End If End If Next sth End Sub 來看看代碼執(zhí)行的效果 程序新建了一個工作表,命名為匯總表,將所有匯總的數(shù)據(jù)都合并在這個工作表中,方便區(qū)分 并且匯總表中也是涵蓋了所以的數(shù)據(jù),一個都沒有少。每個表的10個數(shù)據(jù)都匯總過來了,沒有損失數(shù)據(jù)。
首先我們?yōu)榱朔奖氵M行區(qū)分,新建一個工作表,將所有的數(shù)據(jù)都匯總在這個新建的工作表中,工作表的新建和重命名,之前已經(jīng)分享過了,想必大家都非常的熟悉了。 Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "匯總表" 大家會留意到這里有一點不同,Worksheets.Count這個代碼的意思是代表當(dāng)前所有的工作表的總和,比方說現(xiàn)在有4個工作表, 一個新建+原來的3個班班級的工作表 后面的代碼就非常的簡單了 For Each sth In Worksheets If sth.Name <> "匯總表" Then If Not sth.UsedRange Is Nothing Then k = k + 1 If k = 1 Then sth.UsedRange.Copy new_sth.Cells(1, 1) Else l = new_sth.Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(1, 0).Copy new_sth.Cells(l + 1, 1) End If End If End If Next sth 這一段代碼就是循環(huán)遍歷所有的工作表,只要工作表的名稱不等于我們的匯總表,那么就執(zhí)行匯總 這里講一個新的知識點sth.UsedRange,代表的就是當(dāng)前工作表的所有被使用區(qū)域,沒有被使用的區(qū)域不算在內(nèi)的,這樣就可以將所有的有數(shù)據(jù)的區(qū)域全部匯總起來,不需要再通過Cells(Rows.Count, 1).End(xlUp).Row來進行判斷最后一個非空單元格了,我們來具體看看sth.UsedRange的效果 我們這里執(zhí)行sth.UsedRange.select方便大家識別下 一句話就可以將所有的有數(shù)據(jù)的單元格區(qū)域選中, 周圍的沒有數(shù)據(jù)的區(qū)域都不會被選中 好吧,這個是標準數(shù)據(jù),如果不標準數(shù)據(jù)呢? 來看看 就算是數(shù)據(jù)不標準,也可以 之前有小伙伴不太清楚我這里為什么使用一個k=k+1,我這里解釋下 因為第一次復(fù)制的話,我們需要將標頭復(fù)制上去 而后面就不需要復(fù)制標頭了。 后面我們選擇單元格下移一行,就是跳過標頭,只復(fù)制數(shù)據(jù)區(qū)域 sth.UsedRange.Offset(1, 0).Copy new_sth.Cells(l + 1, 1) 其他的步驟就和之前我們合并工作薄是差不多的 |
|