需要帮助在VBA中优化SUMIFS吗

需要帮助在VBA中优化SUMIFS吗,vba,optimization,excel,sumifs,Vba,Optimization,Excel,Sumifs,我已经使用这个网站好几个月了,这是我在这里的第一篇文章,帮助我开始我早期的编码生涯。如果我昨天搜索论坛时错过了这个问题,我深表歉意。我有一个电子表格,其中大约有6000个活动sumif引用了一个500000多行的表格。你可以想象,这花了一点时间来计算。我已将它们写入VBA,因此它们仅在用户选择时计算。但是,由于sumif太多,代码运行大约需要3-5分钟。我正在寻找加快速度的方法,以获得更好的最终用户体验。我将在下面发布我是如何执行sumifs的。仅在某些上下文中,这是在同一组用户上执行两次sum

我已经使用这个网站好几个月了,这是我在这里的第一篇文章,帮助我开始我早期的编码生涯。如果我昨天搜索论坛时错过了这个问题,我深表歉意。我有一个电子表格,其中大约有6000个活动sumif引用了一个500000多行的表格。你可以想象,这花了一点时间来计算。我已将它们写入VBA,因此它们仅在用户选择时计算。但是,由于sumif太多,代码运行大约需要3-5分钟。我正在寻找加快速度的方法,以获得更好的最终用户体验。我将在下面发布我是如何执行sumifs的。仅在某些上下文中,这是在同一组用户上执行两次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

将范围加载到变量数组中,然后在代码中写入SUMIF,而不是使用公式。如果您需要示例,请让我知道,我将指导您完成

编辑:没问题。下面是一个例子

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的替代方案(可以永远计算),比如总和和排序的组合。请参阅答案,该答案着眼于使用求和和和排序组合,从而实现非常快速的计算,同时仍然返回与使用SUMIFS方法相同的值。

Hi jlaverde,我肯定可以使用一个示例。我对VBA中的数组非常缺乏经验。谢谢好了,如果你需要其他帮助,请告诉我。此外,如果这有帮助,请记住向上投票,如果这是你需要的,请接受答案。谢谢!这看起来确实更有效率。关于执行计算的快速问题。我有12列,我会有EmpUtil(x,1)=计算EmpUtil(x,2)=计算等等…你可以把它们分开做另一个for循环。我将编辑为有意义的示例。最后一个问题,我是否像工作表一样使用sumif语法。函数?听起来你应该查看透视表。我希望我可以。没有足够的动力满足我的需要。这只是导出即时报告过程中的几个步骤之一。