我已经使用这个网站好几个月来帮助我开始我的早期编码生涯,这是我在这里的第一篇文章。如果我在昨天搜索论坛时错过了这个问题,我很抱歉。我有一个电子表格,大约有6,000个有效的Sumif引用了一个500,000多行的表。你可以想象,这花了一点时间来计算。我已将它们写入VBA,因此它们只计算用户何时选择这样做。但是,有这么多sumifs,代码大约需要3-5分钟才能完成。我正在寻找方法来加快这种速度,以获得更好的最终用户体验。我将发布如何执行下面的sumifs。仅针对某些上下文,这是对同一组用户执行两次sumif,但是使用一个不同的标准。如果我遗漏任何相关信息,请告诉我。
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 :(得分: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
这应该让你开始。
答案 1 :(得分:1)
您可以考虑使用SUMIFS(可以永久计算)的替代方法,例如SUM和SORT的组合。请参阅How to perform SumIf using VBA on an array in Excel的答案,该答案使用SUM和SORT组合,导致计算速度非常快,同时仍然返回相同的值,就像使用SUMIFS方法一样。