前景提要
忽然發(fā)現(xiàn)大家的日常工作中會(huì)使用到的場景真的好多,不過這樣也好槽卫,大家告訴我相關(guān)的場景跟压,小編也是盡量的去實(shí)現(xiàn),即幫助了大家歼培,也鍛煉了自己的能力震蒋,一舉兩得,哈哈
有童鞋說躲庄,他想要的效果并不僅僅是數(shù)據(jù)合并喷好,簡單的將各種數(shù)據(jù)合并在一起對(duì)他來說并沒有太大的作用,它希望能夠再進(jìn)行數(shù)據(jù)合并的同時(shí)读跷,順帶進(jìn)行數(shù)據(jù)的計(jì)算,比方說數(shù)據(jù)的求和禾唁,這樣就不用在數(shù)據(jù)完成合并之后再進(jìn)行求和匯總了效览,其實(shí)這也并不難,我們開工吧
場景模擬
正好昨晚趁著放假有空荡短,重溫了下復(fù)仇者聯(lián)盟系列丐枉,今天我們就用復(fù)仇者聯(lián)盟的數(shù)據(jù)來坐下例子吧,假設(shè)我們通過各種渠道成功的統(tǒng)計(jì)出了漫威的幾個(gè)英雄人物在每一集的殺敵數(shù)掘托,我們需要將四季的所有的英雄的殺敵匯總并求和瘦锹,得到一個(gè)最終的數(shù)據(jù),能夠展示每個(gè)英雄的殺敵數(shù)的闪盔,我們依然還是利用之前已經(jīng)寫好的合并數(shù)據(jù)的代碼的基礎(chǔ)上弯院,繼續(xù)寫
這是我們假設(shè)的漫威英雄的殺敵戰(zhàn)果
總共有4個(gè)文件需要我們匯總
方法分析
之前我們匯總數(shù)據(jù)的時(shí)候,僅僅是將需要的數(shù)據(jù)復(fù)制粘貼過來就可以了泪掀,并沒有做其他的操作听绳,而現(xiàn)在進(jìn)行求和的話,方法上面會(huì)稍微有一點(diǎn)不同异赫,因?yàn)槲覀冎安簧婕皵?shù)據(jù)的任何操作椅挣,僅僅是匯總头岔,而現(xiàn)在我們不僅是匯總,還需要進(jìn)行求和鼠证,人工操作的話峡竣,我們需要遍歷每個(gè)表,找到對(duì)應(yīng)的人的數(shù)據(jù)量九,比方說我們要匯總鋼鐵俠的數(shù)據(jù)适掰,這個(gè)時(shí)候我們就要翻遍4個(gè)工作薄,然后講鋼鐵俠所在的哪一行的數(shù)據(jù)進(jìn)行相加娩鹉,然后以此類推攻谁,如果碰到某個(gè)表沒有鋼鐵俠的話,還不能夠計(jì)算弯予,只能跳過打開下一個(gè)戚宦,那么這樣的一個(gè)過程,遍歷文件夾我們已經(jīng)學(xué)過了锈嫩,批量打開工作薄我們也學(xué)習(xí)了受楼,現(xiàn)在就是數(shù)據(jù)的相加的問題了,如果單純的用數(shù)組的話呼寸,我們還需要遍歷數(shù)組艳汽,今天我們換種方法,我們用字典+數(shù)組的方法來實(shí)現(xiàn)对雪,字典可能很多小伙伴們都比較陌生河狐,沒事,先理解邏輯瑟捣,直接套用即可馋艺。
代碼區(qū)
Sub test()
Dim zd As Object, pathn, arr()
pathn = ThisWorkbook.Path
Set zd = CreateObject("scripting.dictionary")
f = Dir(pathn & "\")
k = 0
Do While f <> ""
If f <> "test.xlsm" Then
Workbooks.Open pathn & "\" & f
l = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To l
If zd.Exists(Cells(i, 1).Value) Then
n = zd(Cells(i, 1).Value)
arr(2, n) = arr(2, n) + Cells(i, 2)
arr(3, n) = arr(3, n) + Cells(i, 3)
Else
k = k + 1
zd(Cells(i, 1).Value) = k
ReDim Preserve arr(1 To 3, 1 To k)
arr(1, k) = Cells(i, 1)
arr(2, k) = Cells(i, 2)
arr(3, k) = Cells(i, 3)
End If
Next i
ActiveWorkbook.Close True
End If
f = Dir()
Loop
ActiveSheet.Cells(2, 1).Resize(k, 3) = WorksheetFunction.Transpose(arr)
End Sub
我們來看看最終的效果
完美的實(shí)現(xiàn)了數(shù)據(jù)的合計(jì),并且展示了相關(guān)的數(shù)據(jù)
代碼分析
今天的新知識(shí)點(diǎn)就是字典迈套,字典的話捐祠,我們現(xiàn)在暫時(shí)不去涉及,因?yàn)椴⒉皇呛唵蔚膸拙湓捑涂梢哉f完的桑李,后面我們會(huì)專門重點(diǎn)開一個(gè)系列來說下字典的踱蛀,今天我們先接觸下字典的使用方法就好,字典的特點(diǎn)就是相同的值在字典中只能出現(xiàn)一個(gè)贵白,并且也只能對(duì)應(yīng)一個(gè)值率拒。
案例中,比方說黑寡婦的數(shù)據(jù)禁荒,在第一個(gè)表出現(xiàn)了俏橘,在第一個(gè)表的時(shí)候,黑寡婦的數(shù)據(jù)是第一次顯示圈浇,所以字典中并不存在黑寡婦的數(shù)據(jù)寥掐,我們?cè)谧值渲袑⒑诠褘D的值對(duì)應(yīng)為它在第一表中的行號(hào)
它的兩個(gè)值靴寂,則通過定義動(dòng)態(tài)數(shù)組的方式進(jìn)行賦值
ReDim Preserve arr(1 To 3, 1 To k)
arr(1, k) = Cells(i, 1)
arr(2, k) = Cells(i, 2)
arr(3, k) = Cells(i, 3)
這個(gè)動(dòng)態(tài)數(shù)組的代碼的邏輯,大家應(yīng)該能夠理解了召耘,因?yàn)槲覀兦昂笠呀?jīng)使用了很多次了百炬。
然后到我們打開第二個(gè)表的時(shí)候,看看黑寡婦的數(shù)據(jù)有什么變化污它,因?yàn)槭堑诙€(gè)數(shù)據(jù)表了剖踊,那么黑寡婦的數(shù)據(jù)肯定是已經(jīng)在字典中存在了,所以這個(gè)時(shí)候就直接進(jìn)行數(shù)據(jù)的更改就好了衫贬,而不用再次增加數(shù)據(jù)
完整代碼
Sub test()
Dim zd As Object, pathn, arr()
pathn = ThisWorkbook.Path
Set zd = CreateObject("scripting.dictionary")
f = Dir(pathn & "\")
k = 0
Do While f <> ""
If f <> "test.xlsm" Then
Workbooks.Open pathn & "\" & f
l = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To l
If zd.Exists(Cells(i, 1).Value) Then '判斷數(shù)據(jù)在字典中是否存在
n = zd(Cells(i, 1).Value) '如果存在就講原來的數(shù)據(jù)和新的數(shù)據(jù)相加
arr(2, n) = arr(2, n) + Cells(i, 2)
arr(3, n) = arr(3, n) + Cells(i, 3)
Else '如果不存在則進(jìn)行賦值德澈,并更改動(dòng)態(tài)數(shù)組
k = k + 1
zd(Cells(i, 1).Value) = k
ReDim Preserve arr(1 To 3, 1 To k)
arr(1, k) = Cells(i, 1)
arr(2, k) = Cells(i, 2)
arr(3, k) = Cells(i, 3)
End If
Next i
ActiveWorkbook.Close True
End If
f = Dir()
Loop
ActiveSheet.Cells(2, 1).Resize(k, 3) = WorksheetFunction.Transpose(arr) '將最終的結(jié)果在匯總的數(shù)據(jù)表內(nèi)輸出
End Sub