2015-11-25 64 views
0

我想優化一個使用Excel的sumif函數的子函數,因爲它需要幾次完成。SumIf函數與範圍對象或數組的使用

的特定行(包含在以一個循環)是這樣的一種:

Cupones = Application.WorksheetFunction.SumIf(Range("Test_FecFinCup"), Arr_FecFlujos(i), Range("Test_MtoCup")) 

凡範圍被命名爲在工作簿範圍內,並且Arr_FecFlujos()是日期

的陣列,代碼工作正常,除了需要很長時間才能完成。

我想這兩種方法 陣列:

聲明我的陣列

With Test 
    Fluj = .Range(Range("Test_Emision").Cells(2, 1), Range("Test_Emision").Cells(2, 1).End(xlDown)).Rows.Count 
    Arr_FecFinCup = .Range("Test_FecFinCup") 
    Arr_MtoCup = .Range("Test_MtoCup") 
End With 

Cupones = Application.WorksheetFunction.SumIf(Arr_FecFinCup, Arr_FecFlujos(i), Arr_MtoCup) 

錯誤告訴我,我需要的對象範圍工作,所以我改成:

With Test 
Set Rango1 = .Range("Test_FecIniCup") 
Set Rango2 = .Range("Test_MtoCup") 
End With 

Cupones = Application.WorksheetFunction.SumIf(Rango1, Arr_FecFlujos(i), Rango2) 

那一個,不顯示任何錯誤消息,但總和是不正確的。

有人可以告訴我這些方法有什麼問題,也許我指出了正確的方向?

+0

你嘗試過'sumifs'嗎? – mrtig

+0

尚未,是否以不同的方式工作tan SumIf –

+0

產生不正確總和的代碼使用的命名範圍稍有不同。原始代碼有Range(「Test_FecFinCup」)'作爲第一個範圍,而不正確的代碼使用'Set Rango1 = .Range(「Test_FecIniCup」)'這是故意的嗎? – barrowc

回答

0

看來你嘗試使用了一系列的標準,總結了一系列數字:

WorksheetFunction.SumIf(Arr_FecFinCup, Arr_FecFlujos(i), Arr_MtoCup) 

據我所知,如果標準參數給出一個範圍時,Excel不超過該範圍,但迭代而是在criteria_range中查找與正在計算的單元格的行一致的一個值。

例如

Range("D3") = WorksheetFunction.SumIf(Range("A1:A10"),Range("B1:B10")) 

Excel會將實際計算如下

Range("D3") = WorksheetFunction.SumIf(Range("A1:A10"),Range("B3")) 

如果沒有重合,則收益爲0

例如

Range("D7") = WorksheetFunction.SumIf(Range("A1:A10"),Range("B1:B5")) 

然後D7始終爲0,因爲在[B1:B5]中查找[B7]超出範圍。

因此,要使用多個標準進行求和,正確的方法是使用@mrtiq建議的SUMIFS。