返回列表 上一主題 發帖

[發問] 寫macro 代替 Sumif, countif formula

[發問] 寫macro 代替 Sumif, countif formula

如題, 太多formula會影響運算速度. 所以想用macro 取代
請看附件
謝謝:)

Sumif.zip (21.57 KB)

回復 1# nelson9165
試試看
  1. Option Explicit
  2. Sub EX()
  3.     Dim d As Object, i As Long, D_S As String, AR(), E As Range
  4.     Set d = CreateObject("scripting.dictionary")  '設立物件:字典物件
  5.     With Sheets("data")   '資料工作頁
  6.         i = 2
  7.         Do While .Cells(i, "A") <> ""
  8.             D_S = .Cells(i, "C") & .Cells(i, "B") & .Cells(i, "A") '字典物件的 關鍵字
  9.             'Exists 方法 如果在 Dictionary 物件中指定的關鍵字存在,傳回 True,若不存在,傳回 False。
  10.             If d.Exists(D_S) Then
  11.                 AR = d(D_S)                     '陣列=字典物件的項目
  12.                 AR(0) = AR(0) + 1               '項目 個數的加總
  13.                 AR(1) = AR(1) + .Cells(i, "D")  '項目 數字的加總
  14.                 d(D_S) = AR
  15.             Else
  16.                 d(D_S) = Array(1, .Cells(i, "D").Value)  '字典物件的項目導入陣列
  17.             End If
  18.             i = i + 1
  19.         Loop
  20.    
  21.     End With
  22.    
  23.     With Sheets("工作表1")
  24.         .Range("B9:I16") = ""   '清除資料不含Code
  25.         For Each E In .Range("A9:A16")  'Code欄的範圍
  26.             D_S = .Range("D6") & E      '日期 & Code
  27.             If d.Exists(D_S & "A") Then
  28.                 E.Range("D1") = d(D_S & "A")(0)
  29.                 E.Range("G1") = d(D_S & "A")(1)
  30.             End If
  31.             If d.Exists(D_S & "B") Then
  32.                 E.Range("E1") = d(D_S & "B")(0)
  33.                 E.Range("H1") = d(D_S & "B")(1)
  34.             End If
  35.             E.Range("F1") = E.Range("D1") + E.Range("E1")
  36.             E.Range("I1") = E.Range("G1") + E.Range("H1")
  37.         Next
  38.     End With
  39.    
  40. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 成功是優點的發揮,失敗是缺點的累積。
返回列表 上一主題