返回列表 上一主題 發帖

[發問] 如何提高多條件加總效率 SUMIFS vs SUMPRODUCT vs VBA

回復 1# sunnyso
請教一個問題:
  1. fSumIFs = "=SUMIFS(原始資料!R2C3:R" & RowsCnt & "C3,原始資料!R2C1:R" & RowsCnt & "C1,總表!RC1,原始資料!R2C5:R" & RowsCnt & "C5, COLUMN(R[-3]C[-1]))"
複製代碼
其中最尾端之 COLUMN(R[-3]C[-1]) 指的是? 它的用意何在?
謝謝你!

TOP

回復  c_c_lai

=column(a1)=1 to 12 (月)
sunnyso 發表於 2013-6-1 16:50

原來如此,萬分感激!

TOP

回復 1# sunnyso
試試這個程式碼,耗時 0.921875
  1. Sub Ex_VBA_Array()          '  VBA Code Array
  2.     Dim RowsCnt As Long, m As Long, SubTotalAr() As Double
  3.     Dim t1 As Variant, t2 As Variant, AllType As Variant
  4.     Dim DataArea As Variant
  5.     Dim i%, j%
  6.    
  7.     t1 = Timer
  8.     AllType = Array("A類", "B類", "C類", "D類", "E類", "F類", "G類", "H類", "I類", "J類")
  9.     ReDim SubTotalAr(0 To UBound(AllType), 0 To 11)
  10.     Application.ScreenUpdating = False
  11.    
  12.     '  清理舊數據
  13.     '  Sheets("總表").Activate
  14.     Sheets("總表").Range("A3").CurrentRegion.Offset(1, 1).Clear
  15.    
  16.     With Sheets("原始資料")
  17.         RowsCnt = .Range("A1").CurrentRegion.Rows.Count
  18.         DataArea = .Range("A2").Resize(RowsCnt, 3)
  19.         
  20.         For m = 1 To UBound(DataArea)
  21.             For i = 0 To UBound(AllType) '  A類 To J類
  22.                 If DataArea(m, 1) = AllType(i) Then           ' Jan to Dec
  23.                     SubTotalAr(i, Month(DataArea(m, 2)) - 1) = SubTotalAr(i, Month(DataArea(m, 2)) - 1) + DataArea(m, 3)
  24.                 End If
  25.             Next i
  26.         Next m
  27.     End With
  28.    
  29.     With Sheets("總表")
  30.         .Range("B4").Resize(UBound(AllType) + 1, 12) = SubTotalAr
  31.         .Range("N4:N13").FormulaR1C1 = "=SUM(RC[-12]:RC[-1])"
  32.         For i = 0 To 3
  33.             '  .Range(Chr(79 + i) & 4 & ":" & Chr(79 + i) & 13).FormulaR1C1 = "=SUM(RC[-" & (13 - i * 2) & "]:RC[-" & (11 - i * 2) & "])"
  34.             .Range(Chr(79 + i) & 4).Resize(UBound(AllType) + 1).FormulaR1C1 = "=SUM(RC[-" & (13 - i * 2) & "]:RC[-" & (11 - i * 2) & "])"
  35.             .Range(Chr(79 + i) & 4).Resize(UBound(AllType) + 1) = .Range(Chr(79 + i) & 4).Resize(UBound(AllType) + 1).Value
  36.         Next i
  37.         .Range("B14:R14").FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
  38.     End With
  39.     Application.ScreenUpdating = True
  40.     t2 = Timer
  41.     MsgBox "耗時" & t2 - t1
  42.     '  Sheets("原始資料").[F3] = "耗時: " & (t2 - t1)
  43. End Sub
複製代碼

TOP

看完1#附件,第一反應是覺得第三種方法的VBA CODE 中 For下的不太好,要為他平反 !!! 應該是像c_c_lai大這樣 ...
stillfish00 發表於 2013-6-4 20:05

謝謝指導!
Exit Sub 適度的置入,的確能避掉不必要的浪費迴圈,
用變數來取代確實也有些許的助益,如果 Month()
使用頻率大的話,那就會有很大地效率提升了。
再次向你說聲謝謝。

TOP

回復  sunnyso
ML089 發表於 2013-6-5 21:38

如此修改後確實有不錯效益提升。
多角度的思維亦能考驗與增進我們思考的能力。
謝謝你。

TOP

        靜思自在 : 有願放在心裡,沒有身體力行,正如耕田不播種,皆是空過因緣。
返回列表 上一主題