字典常常用來進(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)這樣的求和,需要用字典來標(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ù)組,用來存放數(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來存放求和數(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ù)組
'如果部門沒有添加到字典里(第一次肯定不會(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)就由原來的200滥酥,變成了10200.
上面的代碼就是通過用字典來標(biāo)識(shí)行更舞,實(shí)現(xiàn)在數(shù)組元素原來的基礎(chǔ)上累加。 m = d(arr(i, 1))讀取標(biāo)識(shí)行是關(guān)鍵坎吻。
結(jié)果