42、[VBA入門到放棄筆記](méi)字典應(yīng)用:求和

字典常常用來(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é)果

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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