當前位置:首頁 > 教育 > 正文

Excel VBA 7.19 Excel跨工作薄多工作表數據合并之Excel表格多行表頭

一起學習,一起進步~~

多行表頭,表頭中含有合并單元格,這種類型的Excel表格在我們的日常工作中是經常出現的,很多的人在做表格的時候,想要體現表格的整齊和美觀,大批量的使用了合并單元格、多行表頭的形式,雖然整體表格數據好看了很多,但是對于數據分析和數據彙總的童鞋來說,則是非常頭疼的事情,小夥伴們在日常的工作中也反饋會碰到多行表頭的情況,所以我們今天針對多行表頭的數據彙總來分析下方法

場景模拟

假設我們要統計的Excel中每個表格都有表頭,如下圖

現在我們不僅僅要彙總表頭,同時還需要彙總表頭下面的具體的數據内容,很明顯,我們之前的代碼面對這樣的問題的時候,就受到限制了,因為我們之前的表頭都是默認隻有一行的标準數據,那麼眼下面對這樣的情況我們要如何來解決呢?

請聽我的拙見~~

代碼區

既然有了多行的标有,那麼我們實際操作的時候,确定有多少行表頭不就行了。

來試下

Sub test()Dim pathn, rng As Range, sth As Worksheet, book As WorkbookSet book = ActiveWorkbookpathn = ActiveWorkbook.Pathk = 0f = Dir(pathn & "\")Do While f <> "" If f <> ThisWorkbook.Name Then k = k + 1 Workbooks.Open pathn & "\" & f If k = 1 Then Set rng = Application.InputBox("請選擇表頭區域", "标有區域的确定", , , , , , 8) countr = rng.Rows.Count For Each sth In Worksheets k1 = k1 + 1 If k1 = 1 Then sth.UsedRange.Copy book.Worksheets(1).Cells(1, 1) Else l = book.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(countr, 0).Copy book.Worksheets(1).Cells(l + 1, 1) End If Next sth Else For Each sth In Worksheets k1 = k1 + 1 If k1 = 1 Then sth.UsedRange.Copy book.Worksheets(1).Cells(1, 1) Else l = book.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(countr, 0).Copy book.Worksheets(1).Cells(l + 1, 1) End If Next sth End If ActiveWorkbook.Close False End Iff = Dir()LoopEnd Sub

看看效果

我們首先要确定表頭的區域

然後後面就交給程序自動執行了,他會根據我們選擇的多行表頭的行數來自行複制相關的數據區域,避免了數複制很多次表頭的情況

來看看最終效果

多行表頭已複制了,相關的數據也複制了,成功的将所有的數據都合并在了一個工作表

代碼分析

其實本節的重點就是要獲得多行表頭的行數,然後我們可以從下一行将需要的正文數據複制出來,而不會将表頭複制過來了。 

但是因為我們手上沒有工作薄的樣式,是一個空的工作薄,所以再循環所有當前工作薄的文件夾的時候,我們再打開第一個個工作薄的時候,進行表頭區域的确定

If k = 1 Then Set rng = Application.InputBox("請選擇表頭區域", "标有區域的确定", , , , , , 8) countr = rng.Rows.Count

k是計量單位,記錄我們打開的次數,當他等于1的時候,就是代表第一次打開,然後我們就可以通過當前的這個工作薄确定表頭的區域了。

如何确定有多少行呢?

countr = rng.Rows.Count'此方法進行用來确定某個單元格區域的總行數,大家可以記下寫法

既然有了多行表頭的總行數,那麼就可以開工了。 循環所有的工作薄内的所有工作表,如果第一次循環,就将表頭複制過去,如果不是第一次了,那就将跳過表頭行來進行複制,就是這段代碼的作用、

For Each sth In Worksheets k1 = k1 + 1 If k1 = 1 Then sth.UsedRange.Copy book.Worksheets(1).Cells(1, 1) Else l = book.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row sth.UsedRange.Offset(countr, 0).Copy book.Worksheets(1).Cells(l + 1, 1) End If

當然上述的這些操作都是針對第一次打開第一件工作薄的操作的,如果打開後面的工作薄呢。k>1 ,則進入另外一個判斷體

大家會發現這個判斷體和上面的一個是完全重複的,沒有,一樣的思維邏輯,就是場景不同而已

===============================

你可能想看:

有話要說...

取消
掃碼支持 支付碼