需要帮助在VBA中优化SUMIFS

时间:2013-10-03 14:49:13

标签: excel vba optimization excel-vba sumifs

我已经使用这个网站好几个月来帮助我开始我的早期编码生涯,这是我在这里的第一篇文章。如果我在昨天搜索论坛时错过了这个问题,我很抱歉。我有一个电子表格,大约有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

2 个答案:

答案 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方法一样。