我有这个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版本肯定存在内存泄漏。提出的大多数解决方案只是删除它们的其他方法,但是当我们有一个像
这样的简单命令时,这应该是不必要的IMOColumns(columna).EntireColumn.Delete
答案 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列中。