Excel VBA工作薄 5.9多個(gè)工作薄求和,不僅僅是合并

前景提要

忽然發(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)果

image.png

總共有4個(gè)文件需要我們匯總


image.png

方法分析

之前我們匯總數(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

我們來看看最終的效果
image.png

完美的實(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)

image.png

它的兩個(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ù)

image.png

完整代碼

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容