在单列中循环遍历 22 行时内存不足

Out of Memory When Looping Through 22 Rows in a Single Column

Excel 给我一个 007 内存错误。

这本书有 160 sheet 篇。我的目标是转到每个 sheet,遍历 B 列以找到 Profit 所在的位置,然后转到下一列并提取利润数字。然后在最后将这些信息合并到一个 sheet 上。

我将循环遍历更大的范围(例如,A1:G20)。我认为这个大范围是问题所在,但我仍然遇到只有 20 行 B 列的内存错误。

Sub EstimGP()
Dim a As Integer
Dim i As Integer
Dim EstimGP As Integer

rng = Range("B1:B22")
a = Application.Worksheets.Count

'Select Worksheet
For i = 1 To (a - 1)
    Worksheets(i).Activate

    'Loop cells
    For Each Cell In rng

        'THIS IS WHERE THE MEMORY ERROR OCCURS
        If Cells.Value = "Estimated GP%:" Or "Estimated GP%: " Then EstimGP = ActiveCell.Offset(0, 1).Value

        Worksheets("SummaryData").Activate
        ActiveSheet.Cells(i, 10).Value = EstimGP
    Next Cell
Next i

End Sub

Cells 是一个 implicit ActiveSheet reference(Rubberduck 可以为您找出所有这些);没有参数,它 returns 一个 Range 对象代表 所有 单元格,无论 ActiveSheet 是什么(超过 100 万行乘以 16K 列!)。

当它表示多个单元格时,Range.Value 为您提供二维 Variant 数组中单元格的

所以 If Cells.Value = "some string literal" 通常会失败,因为你不能在数组和文字值之间使用比较运算符:这可能只是一个错字,你打算写 If Cell.Value... 指的是 Cell 循环变量;考虑重命名为CurrentCell,条件变为If CurrentCell.Value...。请注意,sheet 处于活动状态的循环发生变化,因此该循环中的任何隐式 ActiveSheet 引用都是危险的,不会产生预期的结果。

布尔表达式也有问题:你有If something = "abc" Or "xyz"; comparison/logical 运算符有 2 个操作数,每边一个,它们应该是布尔表达式,因此您想将其更改为 If something = "abc" Or something = "xyz".

考虑将外循环更改为 For Each CurrentSheet In ActiveWorkbook.Worksheets,然后您可以关闭 CurrentSheet 而无需 Activate 它们。