返回列表 上一主題 發帖

[發問] SUMIF 問題

[發問] SUMIF 問題

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

test.rar (6.14 KB)
Jess

本帖最後由 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),"")

下拉

不過資料量大函數多的話,每次重算可能會卡卡的
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 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
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 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
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

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

TOP

謝謝n大和准大,讓我又學到一些新的寫法和思路。
Jess

TOP

回復 6# jesscc


  準大一個迴圈的寫法比較不好理解,不過速度應該較快
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 7# n7822123


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

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

TOP

回復 8# 准提部林


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

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

這種寫法似乎很省記憶體空間
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 【做人的開始】每一天都是故人的開始,每一個時刻都是自己的警惕。
返回列表 上一主題