我已经使用这个网站几个月了,以帮助我开始从事早期编码工作,这是我在这里的第一篇文章。如果昨天搜索论坛时错过此问题,我深表歉意。我有一个电子表格,其中包含大约6,000个活动Sumifs,引用了500,000+行的表。您可以想象,这花了一些时间来计算。我已将它们写入VBA,因此它们仅在用户选择时才计算。但是,由于有这么多的sumif,该代码大约需要3-5分钟才能完成。我正在寻找加快速度以获得更好的最终用户体验的方法。我将在下面发布如何执行总结。仅在某些情况下,这会对同一组用户执行两次求和,但使用一个不同的条件。让我知道是否遗漏了任何相关信息。
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
最佳答案
将范围加载到变量数组中,然后在代码中而不是使用公式编写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
这应该可以帮助您入门。