返回列表 上一主題 發帖

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

回復  samwang


  前輩請問一下如果是要判斷兩個條件
例如:加入判斷倉庫別的話
s3526369 發表於 2022-9-15 09:53


不太了解您的意思,是這樣嗎?

T = Arr(i, 1) & "|" & Arr(i, ??)

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

本帖最後由 Andy2483 於 2022-9-15 14:19 編輯

回復 4# s3526369


    謝謝前輩發表此主題
    謝謝samwang前輩指導
    謝謝准提部林前輩的 字典中的字典
後學習得很多技巧
1.字典名字參數化
2.資料倒入字典迴圈化
3..IIF 函數補 0
  1. Option Explicit
  2. Sub TEST_2()
  3. Application.ScreenUpdating = False
  4. Dim x, i, QA, QB, T, S, Srr, Arr, Ac, xR, C
  5. Dim Trr, Brr, Crr, Rs, Rqs, Rqn, Ras, Ran, B
  6. T = Timer
  7. Set Srr = CreateObject("Scripting.Dictionary")
  8. Set Trr = CreateObject("Scripting.Dictionary")
  9. S = Split("入庫明細,全機種BOM,A需求,b需求,指圖明細,倉庫庫存", ",")
  10. For i = 0 To UBound(S)
  11.    Set Srr(i) = Sheets(S(i))
  12.    Set Trr(i) = CreateObject("Scripting.Dictionary")
  13. Next
  14. Rs = Rows.Count
  15. Ac = Srr(5).Cells(Rs, 1).End(3).Row
  16. Arr = Range(Srr(5).[N4], Srr(5).Cells(Ac, 1))
  17. C = Array(15, 18, 16, 26, 1, 8, 1, 8, 6, 12)
  18. For i = 0 To UBound(C) Step 2
  19.    Set Rqs = Srr(i / 2).Cells(1, C(i))
  20.    Set Rqn = Srr(i / 2).Cells(Rs, C(i)).End(3)
  21.    Brr = Srr(i / 2).Range(Rqs, Rqn)
  22.    Set Ras = Srr(i / 2).Cells(1, C(i + 1))
  23.    Set Ran = Srr(i / 2).Cells(Rqn.Row, C(i + 1))
  24.    Crr = Srr(i / 2).Range(Ras, Ran)
  25.    For x = 1 To UBound(Brr)
  26.       B = Brr(x, 1)
  27.       Trr(i / 2)(B) = Trr(i / 2)(B) + Crr(x, 1)
  28.    Next
  29. Next
  30. For i = 1 To Ac - 3
  31.    xR = Arr(i, 1)
  32.    Arr(i, 5) = IIf(Trr(0)(xR), Trr(0)(xR), 0) '入庫合計
  33.    Arr(i, 3) = IIf(Trr(1)(xR), Trr(1)(xR), 0) '公司總需求
  34.    Arr(i, 10) = IIf(Trr(2)(xR), Trr(2)(xR), 0) 'A倉
  35.    Arr(i, 9) = IIf(Trr(3)(xR), Trr(3)(xR), 0) 'B倉
  36.    Arr(i, 13) = IIf(Trr(4)(xR), Trr(4)(xR), 0) '總出貨
  37.    QA = Arr(i, 4) + Arr(i, 5) '倉庫庫存
  38.    QB = Arr(i, 11) + Arr(i, 12)
  39.    Arr(i, 8) = QA - QB - Arr(i, 10) - Arr(i, 9) - Arr(i, 13) '公司倉
  40.    Arr(i, 7) = QA - QB - Arr(i, 13) '總數
  41. Next i
  42. C = Array(, 3, 5, 7, 8, 9, 10, 13)
  43. For i = 1 To UBound(C)
  44.    Srr(5).Cells(4, C(i)).Resize(UBound(Arr), 1) = Application.Index(Arr, , C(i))
  45. Next
  46. Set Arr = Nothing
  47. Set Brr = Nothing
  48. Set Crr = Nothing
  49. MsgBox "共耗時:" & Timer - T & " 秒"
  50. End Sub
複製代碼

TOP

回復  samwang 目前是 判斷料號 = 入庫明細料號 加總後填入到倉庫庫存的進貨合計欄位   
我的意思是判斷料 ...
s3526369 發表於 2022-9-15 12:46


不好意思,不太了解需求,可否附上說明演練實際數據,謝謝

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

回復 12# s3526369


    請教前輩:
1.Sheets("入庫明細").Range("H2:H600") 這欄位是隱藏而且被保護了
2.Sheets("入庫明細").儲存格[H2]內容是   1501343公司倉   !跟此主題是什麼關係?
3.這 WorksheetFunction.SumIfs的值要放哪裡?

TOP

回復 18# Andy2483


    我有重新修改了
檔案在17樓
可以看看
謝謝

TOP

回復  samwang
不好意思
原本資料是sumif 改成如果是換成sumifs 要判斷兩個條件成立的話
s3526369 發表於 2022-9-15 14:43

是這樣嗎? 請測試看看,謝謝
With Sheets("入庫明細")
    Arr = .Range(.[S1], .[o65536].End(3))
    For i = 2 To UBound(Arr)
        If Arr(i, 5) = "公司倉" Then '是公司倉-->貨物編號累加R欄的Qty
            T = Arr(i, 1): xD(T) = xD(T) + Arr(i, 4) '入庫合計
        End If
    Next
End With

TOP

        靜思自在 : 【為善競爭】人生要為善競爭,分秒必爭。
返回列表 上一主題