友快網

導航選單

【第二講堂】工作簿的欄位不同的求和,如何利用字典+陣列實現求和

前景提要

上兩節的時候,我們學習了利用字典+陣列的方法來實現工作簿的資料求和操作,透過這個方法,我們可以直接針對工作簿的內容進行計算,而不需要先合併工作簿,然後在針對合併後的工作簿展開計算了,這樣可以節省我們不少的時間

而之前兩節我們的方法都是字典搭配陣列的方法,同時進行的,效果也是非常的不錯。

今天我們在針對小夥伴提出的另外一個場景來進行處理,今天小夥伴給出的場景是,工作簿的欄位不同的求和。

場景模擬

比方說這樣的場景,這是欄位不同的場景,其實我們之前也是學習過類似的場景的處理,在之前我們是使用陣列的方式來實現了,借用了陣列的MATCH方法

那麼今天我們來換種方法,我們用純字典的方法來實現這樣的效果

這樣大家面對這個場景的時候,就可以選擇使用兩種方法來進行處理了。

靈活性和通用性就更高了。

程式碼區

Sub test()

Dim zd As Object, pathn, arr(), arr1, sgm(), zxl(), brr()

pathn = ThisWorkbook。Path

Set zd = CreateObject(“scripting。dictionary”)

f = Dir(pathn & “\”)

k = 0

k1 = 0

Do While f <> “”

If f <> “5-9-3。xlsm” Then

Workbooks。Open pathn & “\” & f

l = Cells(Rows。Count, 1)。End(xlUp)。Row

arr1 = ActiveSheet。UsedRange

For i = 2 To l

For j = 2 To UBound(arr1, 2)

s = Cells(i, 1) & arr1(1, j)

If zd。Exists(s) Then

zd(s) = zd(s) + Cells(i, j)

Else

zd(s) = Cells(i, j)

End If

Next j

Next i

ActiveWorkbook。Close True

End If

f = Dir()

Loop

sgm() = zd。keys()

zxl() = zd。Items()

zl = zd。Count

ActiveSheet。Cells(1, 1)。Resize(zl, 1) = WorksheetFunction。Transpose(sgm())

ActiveSheet。Cells(1, 2)。Resize(zl, 1) = WorksheetFunction。Transpose(zxl())

End Sub

相較於之前的程式碼,今天的程式碼,簡短了很多,但並不是說字典一定就比陣列簡單,主要看不同的場景的,在今天的這個場景中,字典明顯要比陣列簡單,好理解一點。

先來看看程式碼執行的效果

程式碼也是很輕鬆的就得到了我們想要的結果

不過這裡肯定會有小夥伴疑惑了,這樣結果似乎不盡完美,沒關係,我們後面會稍微處理一下就可以了。

程式碼分析

既然今天我們沒有使用陣列的方法,而使用字典的方法,那麼我們的思路就應該變更一下,就不應該用陣列的思路

之前使用陣列的時候,我們先去判斷欄位的位置,有了欄位的位置之後,我們在針對每一列進行求和,當然這樣的方法在今天的場景中可能就不實用了。

因為我們仔細觀察下資料,我們會發現,不僅僅是行標頭不同,列表頭也不同

這樣用陣列,就會導致資料出現偏出了,那麼這樣一來,好像我們也只能使用字典了。

那麼來看看字典是如何實現的。

要使用字典的話,那麼在字典中一定要有一個唯一值的存在,那麼在今天這樣的場景中,如何去構造一個唯一值是關鍵。

在上一節,我們學習了透過連字元的方式,將兩列合併成為一個列,作為一個整體參加字典的迴圈的方法,那麼在今天還可以這樣用嘛?

完全可以!

不過我們要稍微變更一下

今天我們並不是將兩列合併成為一個列,今天我們是要將一行和一列迴圈構造成為一個整體,如上圖

我們要做的就是將姓名和學科,一次形成一個組合,比方說A1的語文成績,那麼就是“A1語文”“A1陣列”這樣的結構,也就是大家在上面的gif動圖中,看到的結果

這樣一來,我們就不需要去判斷姓名所對應的成績是在第幾列,第幾行這樣的問題,透過姓名和學科組成了一個唯一值之後,就可以進行字典去計算了,

再次迴圈到下一個表的時候,比方說A1語文的成績,就將字典中A1語文的成績進行累加即可,徹底地迴歸到字典的方式

上面這個判斷也是字典的常用方法,在之前的學習中,我們也是學習了

那我們繼續往下走,通過幾次的迴圈累加之後,我們現在已經有了一個字典了,現在的問題就是,如何將字典的內容寫入Excel呢?

這個問題,和當初我們得到了陣列之後,如何將陣列寫入Excel一樣,也是最為重要的一步。

我們這裡來看看字典要如何實現

sgm() = zd。keys()

zxl() = zd。Items()

zl = zd。Count

先來看看這三段程式碼

分別是將字典的鍵,字典的值寫入到一個數組當中,同時獲得字典的總個數

還不清楚?來看看下面的圖

這樣是不是很清楚了,這個方法是不是和之前陣列的寫入又有幾分相似,那麼大家這樣一對比,應該會好理解很多了吧。

那麼有了這兩個是陣列之後,寫入Excel的方法,是不是就很簡單了呢?

ActiveSheet。Cells(1, 1)。Resize(zl, 1) = WorksheetFunction。Transpose(sgm())

ActiveSheet。Cells(1, 2)。Resize(zl, 1) = WorksheetFunction。Transpose(zxl())

相信很多的小夥伴們,對於這樣的結果肯定是非常不滿意的,這樣的結果,都在兩列,並不是我們想要的結果,沒關係,我們稍微對結果進行處理一些就可以了。

來看看下

將最終的結果,交給Excel自帶的功能就可以輕鬆實現啦。

上一篇:【資料探勘】excel窗體縮小、大小化、小幅度變化,這些方法一定要學會
下一篇:女大學生吐槽公司加班被勸退,老闆回覆:不加班,我們就不會倒閉!