在单列中循环遍历 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
它们。
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
它们。