字典常常用來(lái)進(jìn)行求和。
- 單列求和

源數(shù)據(jù)
Sub 求和()
Dim arr, i As Long, d As Object
arr = [a1].CurrentRegion'數(shù)組賦值
Set d = CreateObject("scripting.dictionary")'創(chuàng)建字典
For i = 2 To UBound(arr)'遍歷數(shù)組
d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)'對(duì)部門進(jìn)行求和
Next
[d2].Resize(d.Count, 1) = Application.Transpose(d.keys)'輸出數(shù)據(jù)
[e2].Resize(d.Count, 1) = Application.Transpose(d.items)
End Sub

結(jié)果
- 單條件多列求和

源數(shù)據(jù)
- 要實(shí)現(xiàn)這樣的求和,需要用字典來(lái)標(biāo)記行。
- 用exists判斷部門是否存在,當(dāng)遍歷部門時(shí),部門第一次出現(xiàn)的時(shí)候,是肯定不存在字典里的,因此,對(duì)部門進(jìn)行計(jì)數(shù),然后放進(jìn)字典,標(biāo)識(shí)行。以例子為參考......
- 1、當(dāng) i=2時(shí),A不存在,則計(jì)數(shù) k=k+1,k=1,d(A)=1,將部門A放在數(shù)組第一行。
- 2 當(dāng) i=3時(shí),B不存在,則計(jì)數(shù) k=k+1,k=2,d(B)=2,將部門B放在數(shù)組第二行。
- 3、當(dāng) i=4時(shí),C不存在,則計(jì)數(shù) k=k+1,k=3,d(C)=2,將部門C放在數(shù)組第三行。
...... - 4、當(dāng) i=10時(shí),E不存在,則計(jì)數(shù) k=k+1,k=5,d(E)=5,將部門E放在數(shù)組第五行。
-----依次類推-------- -
假定下圖綠色區(qū)域是一個(gè)數(shù)組,用來(lái)存放數(shù)據(jù)。
Paste_Image.png
Sub 求和()
Dim arr, i As Long, d As Object
arr = [a1].CurrentRegion '數(shù)據(jù)放進(jìn)數(shù)組arr
'定義一個(gè)和arr一樣大小的數(shù)組brr來(lái)存放求和數(shù)據(jù)
ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
Set d = CreateObject("scripting.dictionary") '創(chuàng)建字典
For i = 2 To UBound(arr) '遍歷數(shù)組
'如果部門沒(méi)有添加到字典里(第一次肯定不會(huì)存在字典里)
If Not d.exists(arr(i, 1)) Then
k = k + 1 '計(jì)數(shù)
d(arr(i, 1)) = k '字典標(biāo)識(shí)行,存入字典
For j = 1 To UBound(arr, 2) '將第一條數(shù)據(jù),從arr放進(jìn)brr
brr(k, j) = arr(i, j)
Next
Else '如果部門已經(jīng)在字典里面了
m = d(arr(i, 1)) '讀取字典標(biāo)識(shí)的行,如A,m=1,B,m=2.......
brr(m, 2) = brr(m, 2) + arr(i, 2) '數(shù)據(jù)累加,字段1
brr(m, 3) = brr(m, 3) + arr(i, 3)'字段2
brr(m, 4) = brr(m, 4) + arr(i, 4)'字段3
End If
Next
[g2].Resize(k, 4) = brr
End Sub
- 要弄明白上面的代碼else后面的累加,先看下面的例子

例子
- 數(shù)組arr,arr(2,2)元素,是第二行第二列的位置,當(dāng)執(zhí)行代碼arr(2, 2) = arr(2, 2) + 10000,arr(2,2)就由原來(lái)的200,變成了10200.
上面的代碼就是通過(guò)用字典來(lái)標(biāo)識(shí)行,實(shí)現(xiàn)在數(shù)組元素原來(lái)的基礎(chǔ)上累加。 m = d(arr(i, 1))讀取標(biāo)識(shí)行是關(guān)鍵。

結(jié)果
