在VBA中需要帮助优化SUMIFS

我几个月来一直在使用这个网站,以帮助我开始我的早期编程生涯,这是我在这里的第一篇文章。 我很抱歉,如果我昨天在search论坛时错过了这个问题。 我有一个电子表格,大约有6000个活动的Sumif引用一个500,000行以上的表格。 你可以想像,这花了一些时间来计算。 我已经将它们写入VBA,所以它们只在用户select时才计算。 但是,如此多的代码,代码需要大约3-5分钟才能完成。 我正在寻找方法来加快这一点,以获得更好的最终用户体验。 我会发布如何执行下面的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 

将范围加载到变体数组中,然后在代码中写入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 

这应该让你开始。

您可能会考虑SUMIFS的替代(可能需要永久计算),例如SUM和SORT的组合。 请参阅如何在Excel中使用VBA对数组执行SumIf的答案, 该数组查看使用SUM和SORT组合导致非常快速的计算,同时仍然返回相同的值,就像已使用SUMIFS方法一样。