通過昨天的分享,我們學(xué)習(xí)了如果通過VBA來實(shí)現(xiàn)將多個工作薄內(nèi)多個工作表進(jìn)行合并的操作,按照昨天的VBA代碼進(jìn)行操作,我們能夠成功的將所有的工作表數(shù)據(jù)匯總在一個工作表中,不過有時候我們可能并不需要將所有的工作表匯總在一個表中,我們需要將多個工作薄中所有的工作表按照既定的工作表名稱匯總,相同的工作表名稱的內(nèi)容匯總在同一個工作表中,那么這樣的需要要如何實(shí)現(xiàn)呢? 場景模擬 假設(shè)我們現(xiàn)在將A\B\C三個班次的所有學(xué)習(xí)全部進(jìn)行分組,每組10個人,按照這樣的方式來分考場進(jìn)行考試,方便在考試的過程中,更好的監(jiān)控學(xué)生的實(shí)操過程,那么最終得到的數(shù)據(jù)表也是按照考場分布的學(xué)生成績 這次我們想要得到每個班成績的所有學(xué)生的成績,以班級為單位進(jìn)行匯總,分析,如果按照上節(jié)的方法就有點(diǎn)不合理了,所有的數(shù)據(jù)都匯總在一個表,在進(jìn)行分析,明顯數(shù)據(jù)暫時效果并不好,那么我們?nèi)绾伟凑瞻嗉墎磉M(jìn)行區(qū)分呢?
其實(shí)按照班次區(qū)分,說白了就是按照工作表的名稱來進(jìn)行區(qū)分,我們可以遍歷當(dāng)前文件夾所有的工作薄,然后遍歷所有的工作表,將最新的數(shù)據(jù)匯總到指定的班級名稱的工作表中就可以了。 來看看代碼 Sub sdd() Dim tbook As Workbook, book As Workbook, sth As Worksheet, new_sth As Worksheet Set tbook = ThisWorkbook Application.ScreenUpdating = False With Application.FileDialog(msoFileDialogFolderPicker) .Title = "請選擇要匯總的工作薄所在文件夾" If .Show = -1 Then Filename = .SelectedItems(1) End If End With k = 0 j = 0 f = Dir(Filename & "\") Do While f <> "" And f <> tbook.Name k = k + 1 Workbooks.Open Filename & "\" & f Set book = ActiveWorkbook If k = 1 Then For i = 1 To book.Worksheets.Count tbook.Worksheets.Add Next i End If For Each sth In book.Worksheets j = j + 1 If k = 1 Then tbook.Worksheets(j).Name = sth.Name sth.UsedRange.Copy tbook.Worksheets(sth.Name).Cells(1, 1) Else l = tbook.Worksheets(j).UsedRange.Rows.Count sth.UsedRange.Offset(1, 0).Copy tbook.Worksheets(sth.Name).Cells(l + 1, 1) End If Next sth j = 0 f = Dir() ActiveWorkbook.Close False Loop Application.ScreenUpdating = True End Sub 看看代碼最終的效果 已A班為例,從上圖中可以看出,我們已經(jīng)將所有的A班學(xué)生的數(shù)據(jù)都匯總在新工作薄的A班的這個工作表中 并且只有A班學(xué)生的數(shù)據(jù),沒有其他班級學(xué)生的數(shù)據(jù),我們在A班的這個工作表中的所有操作結(jié)果,都是針對A班這個集體的,而不會去牽涉其他班,非常完美的達(dá)到了我們的要求。
With Application.FileDialog(msoFileDialogFolderPicker) .Title = "請選擇要匯總的工作薄所在文件夾" If .Show = -1 Then Filename = .SelectedItems(1) End If End With k = 0 j = 0 f = Dir(Filename & "\") Do While f <> "" *********** f = Dir() Loop 這一段都是老熟人了,主要是用來方便我們選擇要匯總的工作薄所在文件夾,然后進(jìn)行遍歷循環(huán)文件夾內(nèi)的所有工作薄的 Workbooks.Open Filename & "\" & f 打開工作薄的代碼,也很熟悉了。 If k = 1 Then For i = 1 To book.Worksheets.Count tbook.Worksheets.Add Next i End If 這段代碼的意思是, 如果我們是第一次打開第一個工作薄,我們需要根據(jù)第一個工作薄的工作表總數(shù)來創(chuàng)建相同數(shù)量的工作表,比方說案例中有三個工作表,我們就一次性的創(chuàng)建3個心的工作表 For Each sth In book.Worksheets j = j + 1 If k = 1 Then tbook.Worksheets(j).Name = sth.Name sth.UsedRange.Copy tbook.Worksheets(sth.Name).Cells(1, 1) Else l = tbook.Worksheets(j).Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(1, 0).Copy tbook.Worksheets(sth.Name).Cells(l + 1, 1) End If Next sth 此段代碼就是核心代碼了,主要遍歷循環(huán)所有的工作表的,除去k=k+1這個老熟人之外,這里有多了一個J=J+1,我這里來解釋下 我的習(xí)慣是通過變量的方式來代表當(dāng)前當(dāng)前是第幾次操作,最開始j=0 當(dāng)我們操作第一個表的時候,j=1 說明當(dāng)前正在操作第一個表,我們在tbook這個工作薄創(chuàng)建了3個工作表,那么我們正在操作的第一個表就讓他對應(yīng)當(dāng)前活動工作表的第一個表就可以了。 說的有點(diǎn)含糊,看下截圖就知道了 然后我們就開始重命名,將第一個表重命名成當(dāng)前的這個工作表,第一個工作表如何表示呢? Worksheets(1) 放到案例中就是 tbook.Worksheets(j).Name = sth.Name 這樣就成功將第一個工作表變成了對應(yīng)的工作表的名稱了,后面的幾個都是類似的操作,需要記住一點(diǎn),沒循環(huán)完一個工作薄之后,要將J重新等于0 ,為什么呢? 我們看下如果不等于0,會有什么結(jié)果 熟悉的下標(biāo)越界,我們來看看這個時候的j是多少, j=4,但是我們總共只有3個工作表,沒有第4個工作表,所以才會提示下標(biāo)越界,所以在每完成一次工作薄的遍歷之后,記得加上j=0 Next sth j = 0 |
|