首页 > 解决方案 > 替代嵌套 for 循环以加快运行时间

问题描述

我有一个嵌套的 for 循环,它首先运行 10-15k 行,将该行中的一个单元格与另一个 40k+ 行的表进行比较,如果找到匹配项,则返回该匹配项,否则将“无记录”写入单元格. 该代码工作正常,只是研究一种替代方法以使其运行得更快。目前,运行 13000 行大约需要 50 分钟到一个小时。我研究过数组,但加载一个包含 40k+ 个项目的数组似乎是错误的路线。报告通常一次运行位,所以当它第一次创建时它可能有 2k 行,然后可能会在以后添加 3k 行,下面的代码将跳过它已经检查过的行并从它离开的地方开始. 任何帮助表示赞赏

For i = 2 To lastRow
    If Cells(i, 83).Value <> "" Then GoTo NextIteration:
    Sheets("mft Rpt").Cells(i, 83) = "No Record"
    model = Sheets("MFT RPT").Cells(i, 11).Value
    trimModel = Replace(Replace(model, " ", ""), "-", "")
    For j = 1 To lastCollateralRow
        If trimModel = Sheets("Promosheet Table").Cells(j, 1).Value Then
            Sheets("MFT RPT").Cells(i, 83) = Sheets("promosheet Table").Cells(j, 3).Value
        End If
    Next j
NextIteration:
Next i

标签: vbaperformanceloops

解决方案


谢谢@Michal

玩了一下。我使用此代码将运行时间从近一个小时缩短到大约 7 或 8 分钟。效果很好!!

Dim promoList As Range
Dim rngMatch As Range
Dim arrList As Variant
Dim arrMatch As Variant
Dim z


Set promoList = Sheets("promosheet table").Range("A1:A" & lastcollateralRow)
arrList = Application.Transpose(promoList.Value)
Set rngMatch = Sheets("Mft rpt").Range("K2:K" & lastRow)
arrMatch = Application.Transpose(rngMatch.Value)
For z = LBound(arrMatch) To UBound(arrMatch)
    arrMatch(z) = Replace(Replace(arrMatch(z), " ", ""), "-", "")
Next

For A = 1 To lastRow
    If Cells(A + 1, 83).Value <> "" Then GoTo skip:
    Sheets("mft rpt").Cells(A + 1, 83) = "No Record"
    For b = 1 To lastcollateralRow + 1
        If arrMatch(A) = promoList(b) Then
            Sheets("mft rpt").Cells(A + 1, 83) = promoList(b, 3)
            GoTo skip
        End If
    Next
skip:
Next

推荐阅读