【发布时间】:2016-11-20 22:56:54
【问题描述】:
我有这个 Excel VBA 脚本,我在其中循环浏览工作簿中的工作表,并删除一些列以制作本书的摘要版本。
我用这个命令删除列:
Columns(columna).EntireColumn.Delete
我的循环没有什么特别的:
Application.ScreenUpdating = False
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 1 To WS_Count
ActiveWorkbook.Worksheets(I).Activate
MyFunction
Next I
Application.ScreenUpdating = True
在 MyFuntion 我有:
'I delete 3 columns in each sheet
Columns("E:G").EntireColumn.Delete 'Memory leak exactly here!
我第一次在工作表中运行此命令时,这会导致内存峰值,并且在循环大约 10 - 12 个工作表后,系统会耗尽内存并引发资源不足错误。
我已经在几台机器和 excel 版本(2007,2013)上尝试过这个
这是正常的 Excel 行为吗?如何避免这种内存泄漏?
更新 目前,作为一种解决方法,如果在处理每几张纸后保存工作簿 (ThisWorkbook.Save),我可以恢复一些内存。这使我的脚本慢得多,但至少可以完成这项工作。
在删除列时,所有 Excel 版本中肯定存在内存泄漏。提出的大多数解决方案只是删除它们的其他方法,但是当我们有一个简单的命令时,这应该是不必要的 IMO
Columns(columna).EntireColumn.Delete
【问题讨论】:
-
你应该发布你正在使用的循环。
-
尝试将变量名从
column更改为另一个名称,如MyColumn。 -
您是否要始终删除 E、F 和 G 列?如果是这样,您可以使用
Columns("E:G").EntireColumn.Delete。还。你可以使用Application.ScreenUpdating。 -
基本上是的,但还有更多。我删除了 EFG,因为 BC 中有内容。然后我测试IJ中是否有数据,并删除LMN,直到我没有更多数据为止。但是第一次调用“EntireColumn.Delete”会导致泄漏,所以我想这不相关。
-
你试过上面的代码吗?您也可以使用
With语句。With Worksheets(i)而不是ActiveWorkbook.Worksheets(I).Activate记住End Withmyfunction之后的行