Mr.Tです、こんにちは。
仕事でExcel 2003とExcel 2007の両方で使用するVBAコードを書いていたときに、ぶちあたった問題がとりあえず直接の原因までは
わからないものの、おそらくここが原因だろうという部分がはっきりしたと思うので、覚書程度に。
VBAコード内では、ワークシートを内部で作成、追加し、他のワークシートの内容をまるごと上書きコピー&若干の内容変更を
行うものでした。
変更前の、コードの概要はこんな感じでした。
(パート1)
ActiveWorkbook.Sheets.Add.Name = NewSheetName
'全体のALL Copyをしておく
Call ActiveWorkbook.Sheets(baseSheetName).Cells.Copy(ActiveWorkbook.Sheets(NewSheetName).Cells)
~~~~~~~~色々やってる~~~~~
(パート2)
'クリップボード経由
Call dataSheet.Range(startDataLine & CStr(TargetLineNo) & ":" & endDataLine & CStr(TargetLineNo)).Copy
'データはC列から
Call saveSheet.Range("C" & CStr(NextLineNo) & ":C" & CStr(NextLineNo)).PasteSpecial(xlPasteValues)
~~~~~~ 色々やってる~~~~~
変更点としては、パート2のあとに、更にパート1のようなコードを追加して、動きとしてはシートを2回追加するように
していました。
このVBAコードは、マクロ実行からおこなわれるようになっていたのですが、この修正後にマクロ実行、Excelファイルを終了しようとすると
タイトルのようなメッセージがでて、マシン自体が固まったようになってしまう現象でした。(メモリの使用量が100%近くなる)
この挙動がどうにも納得できないことが多く、コピーするワークシートには限らないようで、どのワークシートをつかっても発生していました。
そこで、2回目のパート1をごっそり削って、パート2も削って再度同じことをしてみると、同じ現象が。
まとめると、エラーがおきていなかった状態では、
- (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
- →(上とは別のシート上からデータを参照し、それをまた別のシートに貼り付ける)
という動き。
試してみてエラーが起きたのは、
- (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
- →(上とは別のシート上からデータを参照し、それをまた別のシートに貼り付ける)
- →(シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
これと、
- (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
のパターン。
ということで、コピー自体はどちらもクリップボード経由であることに気がつきました。
となると、Excel2007の全体指定でALLコピーしてきた内容(パート1)の部分が、そのままクリップボードに残っていると
Excelの終了時にリソース不足になるのではないか、と当たりをつけてみました。
で、上記の流れの最後に、こんな感じにしてみました。
'クリップボードの中身を軽減
Call dataSheet.Range("A1:A1").Copy
もちろん、VBAでクリップボードのクリアを行うコードは、APIを利用すれば可能なのですが、いちいち面倒な宣言をしないといけない
ので、こんな感じでクリアっぽいことができればそれでOKだろうと考えてみたのです。
このやり方で、マクロの実行をしExcelファイルの終了をすると、無事終了ができました。心持ち、終了速度も速くなった感じもしますが、
とりあえずこれでなんとかできたのではないかと思います。
これ、Excel2003では発生していなかった現象なので、おそらくクリップボードの扱いが変わったせいなのかもしれませんね。