Excel VBA。运行EntireColumn.Delete时内存泄漏

时间:2016-11-20 22:56:55

标签: excel excel-vba vba

我有这个Excel VBA脚本,我循环浏览工作簿中的工作表,并删除一些列以制作该书的摘要版本。

我使用此命令删除列:

Columns(columna).EntireColumn.Delete

My Loop并不特别:

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行为吗?我怎样才能避免这种内存泄漏?

更新 目前,作为一种解决方法,如果我在处理每张纸后保存WorkBook(ThisWorkbook.Save),我可以恢复一些内存。这使我的脚本慢得多,但至少可以胜任。

删除列时,所有Excel版本肯定存在内存泄漏。提出的大多数解决方案只是删除它们的其他方法,但是当我们有一个像

这样的简单命令时,这应该是不必要的IMO
Columns(columna).EntireColumn.Delete

2 个答案:

答案 0 :(得分:0)

试试这个

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的使用,这是一个额外的开销,在执行此操作时您不需要并且还明确声明范围

答案 1 :(得分:0)

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

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

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