vba - 替代嵌套 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
解决方案
谢谢@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
推荐阅读
- python - Pandas 错误:“[Index([' '], dtype='object')] 均不在 [columns] 中”
- java - 无法在 Eclipse jee-2020-03 上安装 Aptana Studio 3
- unity3d - 如何在 Unity VR 中为抓取设置动画?
- java - Java 到 C# 格式说明符
- r - 用特定字符串值填充 NA 的 R 函数是什么?
- ios - 显示 Firebase/Google Admob 非个性化广告,不收集 IDFA
- vue.js - Vue 3 包更新错误
- angular - 发生未处理的异常:无法解析集合“@angular/material”
- google-apps-script - 谷歌表格到谷歌日历
- css - 如何使用 CSS 选择器获取 DOM 的 activeElement?