2013-10-03 239 views
2

我一直在使用這個網站幾個月,以幫助讓我開始在我的早期編碼生涯,這是我在這裏的第一篇文章。如果我昨天在搜索論壇時錯過了這個問題,我很抱歉。我有一個電子表格,大約有6000個活動的Sumif參考了一個500,000行以上的表格。你可以想象,這花了一些時間來計算。我已經將它們寫入VBA,因此它們只在用戶選擇時才計算。但是,如此多的sumifs,代碼需要大約3-5分鐘才能完成。我正在尋找方法來加速實現更好的最終用戶體驗。我會發布我如何執行下面的總和。只是在某些情況下,這是在同一組用戶上執行兩次總和,但有一個不同的標準。如果我遺漏了任何有關的信息,請告訴我。需要幫助優化VBA內的SUMIFS

For i = 1 To 12 
    Range("Emp_Utility").Offset(1, i).Activate 
    Do Until Cells(ActiveCell.Row, 2) = "" 
     ActiveCell.Value = Application.WorksheetFunction.SumIfs(Hrs, Emp, Cells(ActiveCell.Row, 2), Y, Cells(4, ActiveCell.Column), M, Cells(3, ActiveCell.Column)) 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
Next i 

For a = 1 To 12 
    Range("Emp_Billable").Offset(1, a).Activate 
    Do Until Cells(ActiveCell.Row, 30) = "" 
     ActiveCell.Value = Application.WorksheetFunction.SumIfs(Hrs, Emp, Cells(ActiveCell.Row, 2), Y, Cells(4, ActiveCell.Column), M, Cells(3, ActiveCell.Column), Bill, "No") 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
Next a 
+0

聽起來像你應該看透視表。 – user2140261

+0

我希望我能。對於我所需要的不夠動態。這只是導出即時報告過程中的幾個步驟之一。 – Clouse24

回答

2

將範圍加載到變量數組中,然後將SUMIFS寫入代碼中,而不使用公式。如果你需要例子讓我知道,我會指導你通過它。

編輯:沒有問題。這是一個例子。

Sub example() 

    Dim EmpUtil, EmpBillable As Variant ' Creates variant array 

    EmpUtil = Range("Emp_Utility")  'Places Range into EmpUtil Array 
    EmpBillable = Range("Emp_Billable") 'Places Range into EmpBillable Array 

    For x = LBound(EmpUtil) To UBound(EmpUtil) 'Cycles through EmpUtil Rows 
     'Do comparisons and additions here 
     'References to arrays should be something like 
     ' "EmpUtil(x,3) = example" - for the 3rd column 

     'for calculations on each column you cycle through each column for that row 
     For y = LBound(EmpUtil, 2) To UBound(EmpUtil, 2) 
      EmpUtil(x, y) = Calculation 

     Next y 


    Next x 

    For x = LBound(EmpBillable) To UBound(EmpBillable) 'Cycles through EmpBillable Rows 
     'Do comparisons and additions here 


    Next x 

    Range("Emp_Utility") = EmpUtil   'Places EmpUtil Array back into Range 
    Range("Emp_Billable") = EmpBillable 'Places EmpBillable Array back into Range 


End Sub 

這應該讓你開始。

+0

嗨jlaverde,我絕對可以使用一個例子。我對VBA中的數組很不熟悉。謝謝! – Clouse24

+0

如果您需要其他幫助,請告訴我。另外,如果這是您需要的,請記住注意是否有幫助或接受答案。 – jlaverde

+0

謝謝!這絕對看起來更有效率。關於執行計算的一個簡短問題。我有12列,我會有EmpUtil(x,1)=計算 EmpUtil(x,2)=計算 等.... – Clouse24

1

您可能會考慮SUMIFS的替代方法(可能需要永久計算),例如SUM和SORT的組合。請參閱How to perform SumIf using VBA on an array in Excel的回答,它看起來使用SUM和SORT組合導致計算速度非常快,但仍然返回相同的值,就好像使用了SUMIFS方法一樣。