- ベストアンサー
エクセルのシートコピーでプロセスが残ってしまう理由と解決方法
- VB2008でエクセルを起動し、同一ブック内でシートをコピーする際にリソースが解放されず、プロセスが残ってしまう問題が発生しています。シートのコピーを別のブックにすると正常に動作するため、Copyメソッドの引数の扱いに問題がある可能性があります。
- 解決方法としては、Copyメソッドの引数には別のワークシートオブジェクトを指定する必要があります。同じワークシートオブジェクトを指定すると、リソースが正しく解放されずにプロセスが残ってしまいます。別のワークシートオブジェクトを使用することで、問題を回避することができます。
- 上記のコードでは、wsh.Copy(wshh)の部分で同じワークシートオブジェクトを指定しているため、プロセスが残ってしまいます。代わりに、別のワークシートオブジェクトを作成してそれを引数に指定することで、プロセスを正常に解放することができます。例えば、wsh.Copy(wsh_new)のように記述すれば良いでしょう。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
GC.Collect() でうまくいくかも知れませんが、、、お勧めする方法ではありません。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20215&forum=7 やはり ReleaseComObject でこまめに解放していくのが王道だと思います。 ちなみに私の環境では wsh.Copy(wshh) wb.Saved = True '← 追加 wb.Close() wbs.Close() app.Quit() とファイルを保存していないので、「変更を保存しますか?」と聞かれるのを出ないようにしてあげると、プロセスが残りませんでした。。。 そこで質問です。 質問者さんの環境では、質問に載せていたコードに wb.Saved = True を加えて、プロセスが残りますか?
その他の回答 (1)
- buraigasho
- ベストアンサー率78% (32/41)
もう回答は出ているので、横やりになっていたらごめんなさい。 私も以前はプロセスが残ることがありましたので、苦労しました。 現在の環境はWin7&Office2007でVB2008開発ですが、この手のプロセス残留は発生しなくなりました。 以前はXP&Office2003でVB2008という組み合わせでした。 OSとExcelのバージョンの組み合わせによって、残留が発生するしないもあるのかもしれません。 あと、ちょっと気になったのですが、ブックを格納するプロセスがひとつ多い気がします。 wbs = app.Workbooks wb = wbs.Open("c:\hoge.xls") ↓↓ wb = app.Workbooks.Open("c:\hoge.xls") 他の作業上必要なのかもしれませんが、プロセスが残らないように最短で開いて最短で閉じるという作業を行なったほうが良いかもしれませんよ。
補足
1050YENさん、ありがとうございます。 > 質問者さんの環境では、質問に載せていたコードに > wb.Saved = True > を加えて、プロセスが残りますか? 残念ながら、当方の環境ではプロセスが残ってしまいました。 が、GC.Collect()で残らないことは確認できました。 こちらで対処することにします。 ありがとうございました。