返回列表 上一主題 發帖

請教 公式_跳欄並且符合條件才加總

回復 25# 准提部林


    請教前輩 關於 SET 問題
下方程式碼 加了SET 之後執行時間是沒加SET的3倍
Set Z = Z(1, 1).Resize(R, W)     '0.09秒
Z = Z(1, 1).Resize(R, W)            '0.03秒

1.是因為沒加SET是陣列,加了SET 是字典嗎?
2.什麼時候用 陣列?什麼時候用 字典?

謝謝前輩
  1. Option Explicit
  2. Sub TEST_20220920_2()
  3. Dim Brr, R&, C&, i&, j&, k%, T$, TT, Y, Z, W
  4. TT = Timer
  5. Set Y = CreateObject("Scripting.Dictionary")
  6. Set Z = CreateObject("Scripting.Dictionary")
  7. Set Z = ActiveSheet.Cells
  8. R = Z(Rows.Count, "D").End(xlUp).Row '最後一行
  9. W = Z(12, Columns.Count).End(xlToLeft).Column '最後一欄
  10. Set Z = Z(1, 1).Resize(R, W) '定義資料範圍--A1至整個區
  11. For i = 1 To 13 Step 4
  12.    Y.Add Mid(Z(11, i + 12), 2, 2), i
  13. Next
  14. ReDim Brr(1 To R - 12, 1 To 20) '設空陣列
  15. For i = 13 To R
  16.    For j = [AG1].Column To W Step 4
  17.        T = Right(Split(Z(11, j), "]")(0), 2)  '取[??]中的文字
  18.        C = Y(T) '檢測各分項要填入Brr的位置
  19.        If C = 1 Then  '前置--取最大
  20.           For k = 0 To 2
  21.               If Z(i, j + k) > Brr(i - 12, C + k) Then
  22.                  Brr(i - 12, C + k) = Z(i, j + k)
  23.               End If
  24.           Next k
  25.        ElseIf C >= 5 Then '其它項--累計
  26.           For k = 0 To 2
  27.               Brr(i - 12, C + k) = Brr(i - 12, C + k) + Z(i, j + k) '各分項累計
  28.               Brr(i - 12, 17 + k) = Brr(i - 12, 17 + k) + Z(i, j + k) '合計
  29.           Next k
  30.        End If
  31.     Next j
  32. Next i
  33. [M13].Resize(UBound(Brr), UBound(Brr, 2)) = Brr
  34. MsgBox Timer - TT
  35. End Sub
複製代碼

TOP

VBA中的陣列用法, 要早點了解,
最好也理解字典用法,
字典+陣列, 可處理很多種資料的處理及統計運算需求,
...
准提部林 發表於 2020-8-24 17:19



    謝謝前輩指導
後學駑鈍! 經過了2年才學到陣列語字典的一點點皮毛
勤能補拙!,永不放棄!
下列程式碼是今日學習到的字典與陣列技巧
再請前輩撥空再指導
  1. Option Explicit
  2. Sub TEST_20220920_3()
  3. Dim Brr, R&, C&, i&, j&, k%, T$, TT, Y, Z, W, P, Q
  4. Dim Crr, V, xR, n
  5. TT = Timer
  6. Set Y = CreateObject("Scripting.Dictionary")
  7. Set Z = CreateObject("Scripting.Dictionary")
  8. Set V = CreateObject("Scripting.Dictionary")
  9. Set Z = ActiveSheet.Cells
  10. For i = 1 To 4
  11.    Set V(i) = CreateObject("Scripting.Dictionary")
  12. Next
  13. R = Z(Rows.Count, "D").End(xlUp).Row '最後一行
  14. W = Z(12, Columns.Count).End(xlToLeft).Column '最後一欄
  15. Crr = Z(12, 33).Resize(R - 11, W - 32)
  16. Z = Z(1, 1).Resize(R, W) '定義資料範圍--A1至整個區
  17. For i = 1 To 13 Step 4
  18.    Y.Add Mid(Z(11, i + 12), 2, 2), (i + 3) / 4
  19. Next
  20. For i = 33 To W Step 4
  21.    P = Right(Split(Z(11, i), "]")(0), 2)
  22.    V(Y(P)).Add V(Y(P)).Count, i
  23. Next
  24. ReDim Brr(1 To R - 12, 1 To 20) '設空陣列
  25. For i = 13 To R
  26.    For Each xR In V(1)
  27.       If Z(i, V(1)(xR) + 1) > Brr(i - 12, 2) Then
  28.          Brr(i - 12, 1) = Z(i, V(1)(xR))
  29.          Brr(i - 12, 2) = Z(i, V(1)(xR) + 1)
  30.       End If
  31.       If Z(i, V(1)(xR) + 1) - Z(i, V(1)(xR)) > Brr(i - 12, 3) Then
  32.          Brr(i - 12, 3) = Z(i, V(1)(xR) + 1) - Z(i, V(1)(xR))
  33.       End If
  34.    Next
  35.    For n = 1 To 3
  36.       For Each xR In V(n + 1)
  37.          Brr(i - 12, n * 4 + 1) = Brr(i - 12, n * 4 + 1) + Z(i, V(n + 1)(xR))
  38.          Brr(i - 12, n * 4 + 2) = Brr(i - 12, n * 4 + 2) + Z(i, V(n + 1)(xR) + 1)
  39.          Brr(i - 12, n * 4 + 3) = Brr(i - 12, n * 4 + 2) - Brr(i - 12, n * 4 + 1)
  40.       Next
  41.    Next
  42.    For n = 1 To 3
  43.       For j = 1 To 3
  44.          Brr(i - 12, 16 + n) = Brr(i - 12, 16 + n) + Brr(i - 12, j * 4 + n)
  45.       Next
  46.    Next
  47. Next i
  48. [M13].Resize(UBound(Brr), UBound(Brr, 2)) = Brr
  49. MsgBox Timer - TT
  50. End Sub
複製代碼

TOP

        靜思自在 : 閒人無樂趣,忙人無是非。
返回列表 上一主題