- 締切済み
Excelの行の削除、挿入の繰り返し実行時の時間
下記のようなExcelのマクロを繰り返し実行すると、だんだん実行時間が増えて しまいます。一度そのファイルを閉じると元に戻ります。 メモリ使用量が増えて、ガベージコレクションのようなものが起きているためと 思うのですが、対処方法をご存知の方がいらっしゃいましたら教えてください。 (Excelは2003/2007/2010です。) Sub Test() ThisWorkbook.Worksheets("Sheet1").Range("A1:CZ2000").ClearContents ThisWorkbook.Worksheets("Sheet1").Range("A1:CZ2000").Value = 1.1 Dim Time1, Time2, Time3, Time1to2, Time2to3 As Variant Time1 = Time For i = 1 To 100 ThisWorkbook.Worksheets("Sheet1").Rows(100 & ":" & 150).Delete Next i Time2 = Time For j = 1 To 100 ThisWorkbook.Worksheets("Sheet1").Rows(100 & ":" & 150).Copy ThisWorkbook.Worksheets("Sheet1").Rows(200 & ":" & 250).Insert Shift:=xlDown Excel.Application.CutCopyMode = False Next j Time3 = Time Time1to2 = Time2 - Time1 Time2to3 = Time3 - Time2 MsgBox "Deleteの所要時間は" & Minute(Time1to2) & "分" & _ Second(Time1to2) & "秒、Insertの所要時間は" & _ Minute(Time2to3) & "分" & _ Second(Time2to3) & "秒でした。" End Sub また、このマクロではないのですが、同じような行の削除/挿入のあるマクロを 繰り返し実行した際、Excel2010だけでやたらと実行時間が増加する場合が ある(Excel2003、Excel2007はそれほど増加しない)のですが、Excel2010と Excel2003/2007で何がちがうのかご存知の方がいらっしゃいましたら 教えてください。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- MARU4812
- ベストアンサー率43% (196/452)
直接の回答ではありません。情報提供中心です。 CPU2.0GHz 960MB RAM WinXp(SP3),Office2003Pro の環境で >Deleteの所要時間は0分1秒、Insertの所要時間は0分2秒でした。 >Deleteの所要時間は0分2秒、Insertの所要時間は0分3秒でした。 >Deleteの所要時間は0分3秒、Insertの所要時間は0分4秒でした。 ・・・ >Deleteの所要時間は0分10秒、Insertの所要時間は0分12秒でした。 ・・・ 1回実行する毎に見事に1秒ずつ処理時間が延びました。 >メモリ使用量が増えて、ガベージコレクション エクセルのメモリ管理は OS とは別で、エクセルががばっと 実行用のメモリを確保して、自分用にちまちま使ってた気がします。 その使い方はかなり下手で、解放を上手くできていないような現象が 多々知られています。ガベージコレクションは適用されていないと 思いますし、適用されても解放漏れのメモリは回収できませんので、 単純にメモリリークと同様の認識でいいと思います。 だめもとで途中、処理対象の Range を変数に取って Nothing 設定して みましたが効果はありませんでした。 > Dim rng1 As Excel.Range > Dim rng2 As Excel.Range > Set rng1 = ThisWorkbook.Worksheets("Sheet1").Rows(100 & ":" & 150) > Set rng2 = ThisWorkbook.Worksheets("Sheet1").Rows(200 & ":" & 250) > rng1.Copy > rng2.Insert Shift:=xlDown > Set rng1 = Nothing > Set rng2 = Nothing >一度そのファイルを閉じると元に戻ります。 ファイルを保存しただけで、ファイルを閉じなくても処理時間は 元に戻りました。 (コードで処理の最後に Save しても処理時間は伸びなくなりました) コードで実行した処理は UNDO できないと思いますが、何か 覚えようとしているのではないかと思ったりもします。 (Save すると UNDO の内容がクリアされるので怪しいのです) Delete, Copy, Insert の回数をできるだけ減らして、 Clear とか Value へ直接値を書き込むほうが安定するかも しれません。 > Excel2010だけでやたらと実行時間が増加する場合が 対象のセルの数はどうでしょうか?(2007から増えてるのは知ってますが) 行ではなく、セル範囲でテストしてみるとか?