【问题标题】:Excel VBA. Memory leak when running EntireColumn.DeleteExcel VBA。运行 EntireColumn.Delete 时内存泄漏
【发布时间】: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 With myfunction 之后的行

标签: excel vba


【解决方案1】:

试试这个

Dim ws As Worksheet

With Application
    .ScreenUpdating = False
    '' If still having memory spikes try uncommeting the .Calculation lines too
    '' (There's also one at the end)
    '.Calculation = xlCalculationManual
End With

For Each ws In ThisWorkbook.Worksheets
    MyFunction ws:=ws
Next ws

With Application
    '.Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
End With

Public Sub MyFunction(ws As Worksheet)
    ws.Range("E:G").EntireColumn.Delete
End Sub

这消除了 .Activate 的使用,这是您在执行此操作时不需要的额外开销,并且还明确声明了范围

【讨论】:

【解决方案2】:

你是对的,这是一个 Excel 错误。

我通过创建一个新工作表并复制我想要保留的数据来解决它,然后删除原始工作表。

或者,您也可以从 H 列开始复制所有内容并将其粘贴到 E 列中,然后将 .Clear 和 .ClearFormatting 粘贴到您现在为空的最后 3 列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2012-10-14
    • 2013-11-06
    • 1970-01-01
    • 2015-06-28
    • 2017-05-28
    相关资源
    最近更新 更多