【发布时间】:2018-09-04 18:59:32
【问题描述】:
我正在尝试运行一个 VBA 宏,它向下迭代大约 67,000 行,每行 100 列。对于这些行中的每个单元格,将值与另一个工作表中具有 87 个条目的列进行比较。运行代码时没有记录错误,但 Excel 每次都会崩溃。奇怪的是代码似乎可以工作。我将其设置为标记找到匹配项的每一行,并且在崩溃之前这样做。我尝试运行它很多次,它在崩溃之前已经运行了 800 到 11,000 行,具体取决于尝试。
我的第一个怀疑是由于计算量导致内存溢出,但我的系统在运行此代码时显示 CPU 利用率为 100%,内存使用率约为 50%:
Sub Verify()
Dim codes As String
Dim field As Object
For i = 2 To Sheets("DSaudit").Rows.Count
For Each field In Sheets("Dsaudit").Range(Cells(i, 12), Cells(i, 111))
r = 1
While r <= 87
codes = ThisWorkbook.Sheets("287 Denominator CPT").Cells(r, 1).Value
If field = codes Then
Cells(i, 112).Value = "True"
r = 88
Else
r = r + 1
End If
Wend
Next field
i = i + 1
Next i
End Sub
还应该指出,我对 VBA 还是很陌生,所以我很可能犯了某种严重的新手错误。我可以对此代码进行一些更改以避免崩溃,还是应该废弃它并采取更有效的方法?
【问题讨论】:
-
你想使用数组并循环它。
-
那是因为您正在进行至少 10 亿次迭代,很可能更多。这需要很长时间
-
^^ 使用列来指定 last populated row 并将其用作终点,而不是工作表中的总行数。
-
我愿意展示如何在这种情况下使用数组来加速它,但我需要知道我的问题的答案,您将 100 列与 87 个值进行比较,但只输出一个值.这是否意味着如果在列表中找到特定行中的任何值返回 true,或者如果所有值都在列表中?现在,如果找到一个,则输出变为 True。只是想确保逻辑是我们想要的。
-
它不是“崩溃”,而是“(不响应)”——因为它正忙于运行您的嵌套循环以完成。让它运行足够长的时间(一周,也许?),它最终会完成。 Protip:永远不要迭代单元格。仅将必要的数据复制到二维变量数组中,然后迭代该数组。