Board logo

標題: [發問] SUMIF 問題 [打印本頁]

作者: jesscc    時間: 2018-11-23 19:30     標題: SUMIF 問題

因為資料量很龐大,一般 SUMIF 函數用法,很容易看得眼花撩亂,導致錯誤。
因此只想在有重複品名的第一筆顯示總銷售額,這樣子只要在篩選時剔除掉空白列就一目了然,能否用VBA實現這樣的做法?
[attach]29716[/attach]
[attach]29717[/attach]
作者: n7822123    時間: 2018-11-23 23:14

本帖最後由 n7822123 於 2018-11-23 23:16 編輯

回復 1# jesscc


VBA肯定可以,不過函數也可以達到呀

G5:
=IF(COUNTIF($C$5:$C5,C5)=1,SUMIF($C$5:$C$13,C5,$F$5:$F$13),"")

下拉

不過資料量大函數多的話,每次重算可能會卡卡的
作者: n7822123    時間: 2018-11-23 23:37

本帖最後由 n7822123 於 2018-11-23 23:44 編輯

回復 2# n7822123


VBA寫法:

Sub test()
Dim Arr, d As Object
Arr = Range([工作表1!O5], [工作表1!K5].End(xlDown))
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(Arr): d(Arr(i, 1) & "") = d(Arr(i, 1) & "") + Arr(i, 4): Next
For i = 1 To UBound(Arr)
  Arr(i, 5) = d(Arr(i, 1) & "")
  d.Remove (Arr(i, 1))
Next i
Range([工作表1!O5], [工作表1!K5].End(xlDown)) = Arr
End Sub
作者: n7822123    時間: 2018-11-24 00:04

本帖最後由 n7822123 於 2018-11-24 00:08 編輯

回復 3# n7822123


VBA用Find寫法(更簡短)

Sub test2()
Dim Arr, i%, d As Object
Arr = Range([工作表1!O5], [工作表1!K5].End(xlDown))
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(Arr): d(Arr(i, 1) & "") = d(Arr(i, 1) & "") + Arr(i, 4): Next
For Each xx In d.keys
  Sheets("工作表1").Columns("K").Find(xx, lookat:=xlWhole).Offset(, 4) = d(xx & "")
Next
End Sub
作者: 准提部林    時間: 2018-11-24 12:03

Sub TEST()
Dim Arr, r&, i&, xD, T$
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([F5], [C65536].End(xlUp))
For i = 1 To UBound(Arr)
    T = Arr(i, 1):  r = xD(T):  Arr(i, 1) = Empty
    If r = 0 Then r = i: xD(T) = i
    Arr(r, 1) = Arr(r, 1) + Arr(i, 4)
Next i
[G5].Resize(UBound(Arr)) = Arr
End Sub
作者: jesscc    時間: 2018-11-24 12:51

謝謝n大和准大,讓我又學到一些新的寫法和思路。
作者: n7822123    時間: 2018-11-24 18:39

回復 6# jesscc


  準大一個迴圈的寫法比較不好理解,不過速度應該較快
作者: 准提部林    時間: 2018-11-25 11:56

回復 7# n7822123


用字典檔去記錄〔首次〕出現的〔列號〕,
利用這列號,即可將累加值放在這個位置,

另,利用Arr陣列的〔第一欄〕做為累加值的存放區,即不必再定義一個Brr陣列,
但在迴圈時,用變數取得它的值 >> T = Arr(i,1)
然後再將它清空 >> Arr(i,1) = Empty
作者: n7822123    時間: 2018-12-5 01:35

回復 8# 准提部林


謝謝准大解釋,其實當下就看懂啦:P

准大把用過的資料覆蓋,當做累加儲存的位置,

這種寫法似乎很省記憶體空間




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