vba excel 宏使用过多内存(select.insert 似乎是原因)
vba excel macro using too much memory (select.insert seems to be the cause)
由于内存使用过多,我遇到了一个无法结束的宏。
我有一个特定的行似乎对此负责:
Selection.Insert Shift:=xlToRight
这是一个 while 循环和一个 if/else 语句,如下所示:
While SearchRow < lastRow
If StrComp(...) = 0 Then
...
End If
If StrComp(...) = 0 Then
...
End If
If StrComp(...) = 0 _
Or StrComp(...) = 0 _
Or StrComp(...) = 0 Then
ActiveSheet.Cells(SearchRow, 1).EntireRow.Delete
Else
ThisWorkbook.Sheets(...).Cells(SearchRow, 1).Select
Selection.Insert Shift:=xlToRight
End If
Wend
我在调试中逐行运行了宏,所以当我进入 If/Or 块然后到 EndIf 我看到 windows 任务管理器中的内存使用量在跳跃。
你有关于这个的 explanation/suggestion 吗?
非常感谢您的帮助。
BR,
马西莫
在我什至努力寻找一个优雅的解决方案之前,我会先优化宏以刷新公式和屏幕:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
请不要忘记在完成子程序后将它们恢复为原始值。
这应该可以防止在插入期间进行任何重新计算,并防止屏幕进行不必要的自我更新。这实际上可能会立即解决您的问题。
现在,对于一个优雅的解决方案,我们需要查看您的整个代码并查看您正在努力实现的目标,因为很可能您正在移动大量包含数据和公式的列,因此 Excel 必须处理一个很多在内存中将它们移动到右边。
W/o 看到你的代码我可能会:
- 考虑或重写它以防止任何 Shift
- 修改代码以从右向左而不是从右向左插入(以限制需要移动的列数)
- 预先插入许多列并隐藏它们。然后在代码中,当需要而不是插入它们时,您将取消隐藏其中一个隐藏的列 - 最有效
由于内存使用过多,我遇到了一个无法结束的宏。
我有一个特定的行似乎对此负责:
Selection.Insert Shift:=xlToRight
这是一个 while 循环和一个 if/else 语句,如下所示:
While SearchRow < lastRow
If StrComp(...) = 0 Then
...
End If
If StrComp(...) = 0 Then
...
End If
If StrComp(...) = 0 _
Or StrComp(...) = 0 _
Or StrComp(...) = 0 Then
ActiveSheet.Cells(SearchRow, 1).EntireRow.Delete
Else
ThisWorkbook.Sheets(...).Cells(SearchRow, 1).Select
Selection.Insert Shift:=xlToRight
End If
Wend
我在调试中逐行运行了宏,所以当我进入 If/Or 块然后到 EndIf 我看到 windows 任务管理器中的内存使用量在跳跃。
你有关于这个的 explanation/suggestion 吗?
非常感谢您的帮助。 BR, 马西莫
在我什至努力寻找一个优雅的解决方案之前,我会先优化宏以刷新公式和屏幕:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
请不要忘记在完成子程序后将它们恢复为原始值。
这应该可以防止在插入期间进行任何重新计算,并防止屏幕进行不必要的自我更新。这实际上可能会立即解决您的问题。
现在,对于一个优雅的解决方案,我们需要查看您的整个代码并查看您正在努力实现的目标,因为很可能您正在移动大量包含数据和公式的列,因此 Excel 必须处理一个很多在内存中将它们移动到右边。
W/o 看到你的代码我可能会:
- 考虑或重写它以防止任何 Shift
- 修改代码以从右向左而不是从右向左插入(以限制需要移动的列数)
- 预先插入许多列并隐藏它们。然后在代码中,当需要而不是插入它们时,您将取消隐藏其中一个隐藏的列 - 最有效