このExcel VBAスクリプトでは、ワークブック内のシートをループし、いくつかの列を削除してそのブックの要約版を作成します。Excel VBA。 EntireColumn.Delete実行時にメモリリークが発生する
私は、このコマンドを使用して列を削除:
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枚のシートをループした後、システムは使い果たされる十分なリソースエラーをスローします。
私はいくつかのマシンでこれを試してみましたが、バージョン(2007,2013)
エクセルましたが、これは通常のExcelの動作ですか?このメモリリークを回避するにはどうすればよいですか?
UPDATE 瞬間のために私はすべての数枚を処理した後、ブック(ThisWorkbook.Save)を保存する場合は、回避策として、私はいくつかのメモリを回復することができます。これは私のスクリプトをはるかに遅くしますが、少なくとも仕事をします。
間違いなく、すべてのExcelバージョンで列を削除するとメモリリークが発生します。提案されたソリューションのほとんどは、それらを削除するには、単に他の方法ですが、我々はこの
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
これで試してみてください
Columns(columna).EntireColumn.Delete
使用しているループを投稿する必要があります。 – Niclas
変数名を 'column'から' MyColumn'のような別の名前に変更してみてください。 – Fadi
E、F、G列を常に削除しようとしていますか?もしそうなら、 'Columns(" E:G ")。EntireColumn.Delete'を使うことができます。また、 'Application.ScreenUpdating'を使うことができます。 – Niclas