前景提要
在昨天的學(xué)習(xí)中,我們也是分享了升級版的工作薄匯總的難度恳邀,當(dāng)字段的順序不同的時候要如何匯總,我們巧妙的利用了數(shù)組的方式來判斷數(shù)據(jù)的位置飒货,從而實(shí)現(xiàn)相應(yīng)的字段再粘貼相應(yīng)的數(shù)據(jù)的瞧甩,當(dāng)然這僅僅是工作中可能碰到的眾多情況中的一種熄捍,還有童鞋表示字段順序不同儿普,其實(shí)就是小兒科的事情祖娘,他們要匯總的數(shù)據(jù)荚孵,不僅僅字段展示順序不同妹窖,而且字段都不相同呢,這里小編內(nèi)心只想說一句話:你們之前都是怎么熬過來的
場景模擬
我們還是繼續(xù)只用之前的數(shù)據(jù)模型吧收叶,我們還是以京東的產(chǎn)品為例子骄呼,我們對數(shù)據(jù)做一些更改,我們將產(chǎn)品2的數(shù)據(jù)替換成為手機(jī)的數(shù)據(jù)
為了效果明顯一點(diǎn)判没,我們再更改一個數(shù)據(jù)源蜓萄,把香港的數(shù)據(jù)源中產(chǎn)品3替換成為TVB
好,通過這番更改澄峰,我們再處理數(shù)據(jù)的時候嫉沽,就不僅僅是要處理字段順序的情況了,而且還有字段也不同的情況俏竞,難度全面升級绸硕,VBA還可以實(shí)現(xiàn)嗎?
方法分析
方法我們還是來看看正常的手工操作的話魂毁,我們需要如何實(shí)現(xiàn)玻佩,我們需要判斷目標(biāo)工作薄的表頭和總工作薄的表頭是否一致,在上節(jié)我們學(xué)習(xí)了如果數(shù)據(jù)順序不一致的話席楚,我們可以通過數(shù)組方式來找到對應(yīng)的位置咬崔,那么今天的情況字段都不相同,我們還可以通過數(shù)字的方式來實(shí)現(xiàn)嗎烦秩?當(dāng)然可以垮斯,不過這里我們需要靈活一點(diǎn),做出一些調(diào)整闻镶,具體的看代碼
代碼區(qū)
Sub test()
Dim pathn, sth As Workbook, rng As Range, rng1 As Range, sbook As Workbook, arrT, k&
k = 0
pathn = ThisWorkbook.Path
Set sbook = ThisWorkbook
f = Dir(pathn & "\")
Do While f <> ""
l = Cells(Rows.Count, 1).End(xlUp).Row
If f <> "test.xlsm" Then
For Each sth In Workbooks
If sth.Name = f Then
GoTo line
End If
Next sth
'=====匯總工作薄的代碼======
k = k + 1
If k = 1 Then
Workbooks.Open (pathn & "\" & f)
Set rng = ActiveSheet.UsedRange
rng.Copy sbook.Worksheets(1).Cells(1, 1)
Else
l1 = Cells(1, Columns.Count).End(xlToLeft).Column
arrT = Range(Cells(1, 1), Cells(1, l1))
Workbooks.Open (pathn & "\" & f)
Set rng = ActiveSheet.UsedRange
arrW = rng.Rows(1)
l2 = UBound(arrW, 2)
For i = 1 To l2
On Error Resume Next
Num = WorksheetFunction.Match(arrW(1, i), arrT, 0)
If Err.Number = 0 Then
rng.Columns(i).Offset(1, 0).Copy sbook.Worksheets(1).Cells(l + 1, Num)
Else
l3 = sbook.Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
sbook.Worksheets(1).Columns(l3).Insert
sbook.Worksheets(1).Cells(1, l3) = arrW(1, i)
rng.Columns(i).Offset(1, 0).Copy sbook.Worksheets(1).Cells(l + 1, l3)
ReDim Preserve arrT(1 To 1, 1 To l3 + 1)
arrT(1, l3) = arrW(1, i)
arrT(1, l3 + 1) = arrW(1, l2)
End If
Next i
End If
'=====匯總工作薄的代碼======
ActiveWorkbook.Close True
End If
line:
f = Dir()
Loop
End Sub
我們來看看最終的效果
產(chǎn)品這一列數(shù)據(jù)都是正常的甚脉,同時我們新增加的兩個測試時產(chǎn)品,手機(jī)和TVB的相關(guān)數(shù)據(jù)都已經(jīng)成功的匯總到了總數(shù)居里面铆农,非常完美的實(shí)現(xiàn)了我們的要求
單獨(dú)看看這兩份數(shù)據(jù)的內(nèi)容牺氨,完美狡耻,應(yīng)該空的地方都空, 應(yīng)該有數(shù)據(jù)的地方也正常有數(shù)據(jù)猴凹。nice
代碼分析
其實(shí)今天的代碼并么有增加太多的知識點(diǎn)夷狰,基本上都是在上節(jié)的代碼的基礎(chǔ)上進(jìn)行調(diào)整和更改的,改動比較大的地方就是增加了一個判斷
If Err.Number = 0 Then
rng.Columns(i).Offset(1, 0).Copy sbook.Worksheets(1).Cells(l + 1, Num)
Else
l3 = sbook.Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
sbook.Worksheets(1).Columns(l3).Insert
sbook.Worksheets(1).Cells(1, l3) = arrW(1, i)
rng.Columns(i).Offset(1, 0).Copy sbook.Worksheets(1).Cells(l + 1, l3)
ReDim Preserve arrT(1 To 1, 1 To l3 + 1)
arrT(1, l3) = arrW(1, i)
arrT(1, l3 + 1) = arrW(1, l2)
End If
如果我們要匯總的目標(biāo)表格中的數(shù)據(jù)在我們的匯總表中沒有對應(yīng)的字段的話郊霎,我們需要增加字段沼头。我們來分解下動作
l3 = sbook.Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
sbook.Worksheets(1).Columns(l3).Insert
sbook.Worksheets(1).Cells(1, l3) = arrW(1, i)
獲取匯總表的行的最下下標(biāo),并且新插入一列书劝,同時將這一列的表頭設(shè)置為我們匯總表中缺失的這個表頭
rng.Columns(i).Offset(1, 0).Copy sbook.Worksheets(1).Cells(l + 1, l3)
ReDim Preserve arrT(1 To 1, 1 To l3 + 1)
arrT(1, l3) = arrW(1, i)
arrT(1, l3 + 1) = arrW(1, l2)
這一段是本段代碼中最難以理解的部分进倍,因?yàn)槲覀兊臄?shù)據(jù)源中,總計(jì)那一列的數(shù)據(jù)應(yīng)該是放在最后面的购对,所以我們增加的字段都應(yīng)該放在總計(jì)這一列的前面猾昆,所以這里就需要利用數(shù)組的動態(tài)添加和重新賦值,我們將原來的總計(jì)這個字段對應(yīng)的位置讓給新增加的字段的位置骡苞,然后把新增加的那一列的數(shù)據(jù)替換成為總計(jì)垂蜗,這里比較繞,大家要多理解下解幽,來截圖看看實(shí)際效果
這是替換之前的數(shù)組的狀態(tài)
第5個位置是總結(jié)贴见,新增加的列在數(shù)組中是空白的
來看看替換后的效果
成功的完成了數(shù)據(jù)的位置的替換和數(shù)組的更新
最終的狀態(tài)是這樣的