【问题标题】:Optimising a For Each loop used for counting Excel VBA优化用于计算 Excel VBA 的 For Each 循环
【发布时间】:2021-01-06 08:30:14
【问题描述】:

我目前正在编写质量问题日志,该日志将在我的工作场所用于跟踪质量问题,并通过仪表板将特定数据输出给管理层。

我有一个计算,遍历日志中的行并计算满足特定条件的行数。它本质上是一个 CountIf 函数,但带有一个 For 循环。然后将计数转储到一个单元格中,然后计算移至该范围内的下一个值。

我目前在日志中有 95 个条目,而且计数运行得很慢。随着我们越来越关注质量问题,代码运行速度不可避免地会变得更慢。

这是我正在运行的代码示例:

For Each cell In mnthRng

    monthVal = cell.value
    YearVal = cell.Offset(-1, 0).value
    num = 1
    Total_prjctCount = 0
    
    For i = LBound(prjcts) To UBound(prjcts)
        PrjctName = prjcts(i)
        included_in_calcs = prjctYesNo(num, 1)
        If included_in_calcs = "YES" Then
            Total_Count = 0
            For j = 8 To IDLastRow
                If QCRLogSheet.Range("AI" & j) = monthVal _
                And QCRLogSheet.Range("AK" & j) = YearVal _
                And QCRLogSheet.Range("D" & j) = PrjctName Then
                    Total_Count = Total_Count + 1
                Else
                End If
            Next j
                
            Total_prjctCount = Total_Count + Total_prjctCount
        End If
        num = num + 1
    Next i
    cell.Offset(1, 0).value = Total_prjctCount
Next cell

只是为了给你一些关于代码的更多信息:

mnthRng 是包含不同月份的单元格范围。

数组 prjcts 包含我们现场的各种不同项目的名称,如果有人取消了仪表板上的“包含在计算中”框,我可以按项目对数据进行排序 p>

我读过这篇文章以加快这种性质的计算,而不是循环每个单元格,我可以将范围添加到数组中,并在数组中进行计数。不幸的是,我不确定如何将数据范围添加到数组中,然后循环遍历它。

任何帮助将不胜感激!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    未经测试:

    Dim arrMonth, arrYear, arrProj
    
    arrMonth = QCRLogSheet.Range("AI8:AI" & IDLastRow)
    arrYear = QCRLogSheet.Range("AK8:AK" & IDLastRow)
    arrProj = QCRLogSheet.Range("D8:D" & IDLastRow)
    
    For Each cell In mnthRng
    
        monthVal = cell.Value
        YearVal = cell.Offset(-1, 0).Value
        num = 1
        Total_prjctCount = 0
        
        For i = LBound(prjcts) To UBound(prjcts)
            PrjctName = prjcts(i)
            included_in_calcs = prjctYesNo(num, 1)
            If included_in_calcs = "YES" Then
                Total_Count = 0
                For j = 1 To UBound(arrMonth, 1)
                    'nested if's are faster...
                    If arrMonth(j, 1) = monthVal Then
                        If arrYear(j, 1) = YearVal Then
                            If arrProj(j, 1) = PrjctName Then Total_Count = Total_Count + 1
                        End If
                    End If
                Next j
                    
                Total_prjctCount = Total_Count + Total_prjctCount
            End If
            num = num + 1
        Next i
        cell.Offset(1, 0).Value = Total_prjctCount
    Next cell
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2019-09-27
      • 2022-12-15
      • 1970-01-01
      • 2018-12-24
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多