Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3733  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

2010年2月17日 #

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では発生していなかった現象なので、おそらくクリップボードの扱いが変わったせいなのかもしれませんね。

posted @ 18:30 | Feedback (183)