我已经使用这个网站几个月了,以帮助我开始从事早期编码工作,这是我在这里的第一篇文章。如果昨天搜索论坛时错过此问题,我深表歉意。我有一个电子表格,其中包含大约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


这应该可以帮助您入门。

10-07 23:47