Board logo

標題: 請教如何..取同姓名和加總成交金...感謝 [打印本頁]

作者: alims    時間: 2012-6-21 11:32     標題: 請教如何..取同姓名和加總成交金...感謝

.................資料-------
日期        姓名        成交金
2月1日        aaa               1000
2月2日        bbb        2000
2月3日        aaa                3000
2月4日        ccc               4000
2月5日        aaa               5000
2月7日        aaa               1000
2月8日        bbb        2000
2月9日        aaa               3000
2月10日ccc                4000
2月11日aaa         5000
               
---        變成------       
        姓名        成交金
        aaa         18000
        bbb        4000
        ccc                8000
也就是 同姓名作加總
作者: register313    時間: 2012-6-21 11:49

回復 1# alims

字典標準用法
  1. Sub XX()
  2. Dim Ar(), d As Object
  3. Set d = CreateObject("scripting.dictionary")
  4. Ar = Range("A1:C" & [C2].End(xlDown).Row)
  5. For i = 1 To UBound(Ar)
  6.   If Not d.exists(Ar(i, 2)) Then d.Add Ar(i, 2), Ar(i, 3) Else d(Ar(i, 2)) = d(Ar(i, 2)) + Ar(i, 3)
  7. Next i
  8. [E:F] = ""
  9. [E1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  10. [F1].Resize(d.Count, 1) = Application.Transpose(d.items)
  11. End Sub
複製代碼

作者: alims    時間: 2012-6-21 12:04

回復 2# register313


    好厲害!!!  謝謝了
作者: GBKEE    時間: 2012-6-21 12:55

回復 1# alims
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range
  4.     Set Rng = Range("A1").CurrentRegion         '設置資料區
  5.     Rng.Columns(2).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("IV1:IV2"), CopyToRange:=Range("F1"), Unique:=True
  6.                                                 '進階篩選 出不重復的姓名到 F欄
  7.     Range("G1") = "成交金"
  8.     With Range(Range("G2"), Range("F1").End(xlDown).Offset(, 1))
  9.         .FormulaR1C1 = "=SUMIF(" & Rng.Columns(2).Address(, , 0) & ", RC[-1] ," & Rng.Columns(3).Address(, , 0) & ")"
  10.                     '設下公式
  11.         .Value = .Value   '公式轉換為值 也可以不轉換
  12.     End With
  13. End Sub
複製代碼

作者: Hsieh    時間: 2012-6-21 17:00

回復 3# alims
合併彙算專門解決這類問題
作者: register313    時間: 2012-6-21 17:28

回復 3# alims

小計(姓名欄位要先排序)
[attach]11456[/attach]
作者: alims    時間: 2012-6-21 21:03

回復 6# register313

用過了 謝謝
作者: lasum    時間: 2012-6-22 04:49

感謝各位提供的資料…測試都可以執行…
但是出現一個問題…
執行register313大的程式時…要求定義 i …可能是我的版本比較低吧!
作者: mistery    時間: 2012-7-18 16:38

利用 SUM函數+矩陣 就可以了~
= { sum ((姓名欄位:姓名欄位 = "某人") * (成交金欄位:成交金欄位))  }
作者: GBKEE    時間: 2012-7-18 17:22

回復 9# mistery
不用陣列,還有也可以
=SUMIF($B$2:$B$11,E2,$C$2:$C$11)
=SUMPRODUCT(($B$2:$B$11=E2)*($C$2:$C$11))
作者: lalalada    時間: 2012-8-8 14:52

回復 2# register313

你好~
剛好需要這功能
不過是一個名稱對應兩個值
我直覺想到用do loop 加上判斷字串完成
結果發現真的太慢了...無法對整個資料庫使用
sumif 可能會快一點 可是還要把名稱重複的行刪除也是頗花時間
然後爬文爬到這篇
我自己亂改之後已經能達到想要的功能
(其實就是建立兩個dictionary...有其他更快的作法嗎?)
但想真的了解程式碼含意
不知道能不能麻煩解釋一下各行的意思?
尤其是這句
If Not d.exists(Ar(i, 2)) Then d.Add Ar(i, 2), Ar(i, 3) Else d(Ar(i, 2)) = d(Ar(i, 2)) + Ar(i, 3)
感恩:)




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)