返回列表 上一主題 發帖

請問sumif 改寫成字典或是array讓執行速度變快

請問sumif 改寫成字典或是array讓執行速度變快

以下是我目前可以執行 但是運算時間有點久
請問有更好的方法可以去取代嗎
  1. Sub 倉庫庫存合計()
  2. Dim X, i As Long
  3. For i = 4 To Sheets("倉庫庫存").[A1000].End(3).Row

  4.     X = WorksheetFunction.SumIf(Sheets("入庫明細").Range("O2:O600"), Sheets("倉庫庫存").Cells(i, 1), Sheets("入庫明細").Range("R2:R600")) '入庫合計
  5.     DA = WorksheetFunction.SumIf(Sheets("全機種BOM").Range("P:P"), Sheets("倉庫庫存").Cells(i, 1), Sheets("全機種BOM").Range("Z:Z")) '公司總需求
  6.     BA = WorksheetFunction.SumIf(Sheets("A需求").Range("A:A"), Sheets("倉庫庫存").Cells(i, 1), Sheets("A需求").Range("H:H")) 'A倉
  7.     bb = WorksheetFunction.SumIf(Sheets("b需求").Range("A:A"), Sheets("倉庫庫存").Cells(i, 1), Sheets("B需求").Range("H:H")) 'B倉
  8.     BC = WorksheetFunction.SumIf(Sheets("指圖明細").Range("F:F"), Sheets("倉庫庫存").Cells(i, 1), Sheets("指圖明細").Range("L:L")) '總出貨
  9.     FY = WorksheetFunction.SumIf(Sheets("出庫明細").Range("H2:H600"), Sheets("廢料倉").Cells(i, 1) & Sheets("廢料倉").Cells(1, 1), Sheets("出庫明細").Range("I2:I600"))  '廢料
  10.     FX = WorksheetFunction.SumIf(Sheets("指圖明細").Range("F2:F2000"), Sheets("廢料倉").Cells(i, 1), Sheets("指圖明細").Range("K2:K2000")) '廢料
  11.     EY = WorksheetFunction.SumIf(Sheets("出庫明細").Range("H2:H600"), Sheets("退庫").Cells(i, 1) & Sheets("退庫").Cells(1, 1), Sheets("出庫明細").Range("I2:I600"))   '退庫

  12.    
  13.     QA = Sheets("倉庫庫存").Cells(i, 4) + Sheets("倉庫庫存").Cells(i, 5) ' ''倉庫庫存
  14.     QB = Sheets("倉庫庫存").Cells(i, "K") + Sheets("倉庫庫存").Cells(i, "L")
  15.    
  16.     Sheets("倉庫庫存").Cells(i, 5) = X '入庫合計
  17.     Sheets("倉庫庫存").Cells(i, "M") = BC ''總出貨
  18.     Sheets("倉庫庫存").Cells(i, "C") = DA ' 總需求
  19.     Sheets("倉庫庫存").Cells(i, "H") = QA - QB - BA - bb - BC ''公司倉
  20.     Sheets("倉庫庫存").Cells(i, "I") = bb ''B倉
  21.     Sheets("倉庫庫存").Cells(i, "J") = BA ''A倉
  22.     Sheets("倉庫庫存").Cells(i, "G") = QA - QB - BC ''總數
  23.     Sheets("廢料倉").Cells(i, 3) = FY + FX
  24.     Sheets("退庫").Cells(i, 3) = EY

  25. Next i

  26. End Sub
複製代碼

回復 2# samwang


    好的 那我簡化一些再貼上來

TOP

回復 2# samwang


   
倉庫合計.rar (467.23 KB)

檔案在這 再麻煩你看看

TOP

回復 5# Andy2483


    厲害了~感謝前輩幫我解惑
    我再好好研究研究!

TOP

回復 7# samwang


    好厲害!
    這也是一種方法,速度又更快了!
    謝謝前輩!

TOP

回復 7# samwang


  前輩請問一下如果是要判斷兩個條件
例如:
  1. With Sheets("入庫明細")
  2.     Arr = .Range(.[r1], .[o65536].End(3))
  3.     For i = 2 To UBound(Arr)
  4.         T = Arr(i, 1): xD(T) = xD(T) + Arr(i, 4) '入庫合計
  5.     Next
  6. End With
複製代碼
加入判斷倉庫別的話

TOP

本帖最後由 s3526369 於 2022-9-15 12:56 編輯

回復 11# samwang
  1. With Sheets("入庫明細")
  2.     Arr = .Range(.[r1], .[o65536].End(3))
  3.     For i = 2 To UBound(Arr)
  4.         T = Arr(i, 1): xD(T) = xD(T) + Arr(i, 4) '入庫合計
  5.     Next
  6. End With
複製代碼
目前是 判斷料號 = 入庫明細料號 加總後填入到倉庫庫存的進貨合計欄位   
我的意思是判斷料號後還要再判斷入庫明細裡的倉庫(入)欄位,符合是"公司倉"才可以填入
                          數量    ,        料號     ,     料號       ,      倉別    ,   倉別
WorksheetFunction.SumIf(Sheets("入庫明細").Range("H2:H600"), Sheets("A需求").Cells(i, 1) ,Sheets("入庫明細").Range("O2:O600"), "公司倉",Sheets("入庫明細").Range("S2:S600") )

TOP

回復 14# samwang
不好意思
原本資料是sumif 改成
  1. With Sheets("入庫明細")
  2.     Arr = .Range(.[r1], .[o65536].End(3))
  3.     For i = 2 To UBound(Arr)
  4.         T = Arr(i, 1): xD(T) = xD(T) + Arr(i, 4) '入庫合計
  5.     Next
  6. End With
複製代碼
如果是換成sumifs 要判斷兩個條件成立的話

入庫單.png (93.26 KB)

入庫單.png

TOP

回復 13# Andy2483


    謝謝前輩,這個執行速度也很快,但是內容就比較複雜需要好好好研究

TOP

回復 14# samwang


    我重新上傳我修改後的檔案
     我有增加了些條件

倉庫合計TEST.rar (592.53 KB)

TOP

        靜思自在 : 甘願做、歡喜受。
返回列表 上一主題