C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 86 を表示中)
■50721 / )  Re[2]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (2回)-(2010/06/16(Wed) 10:52:39)
>>Private Function testExcel() As String
> この実装だと、エラーが起きようと起きまいと、戻り値は常に "OK" しか
> 返さない事になりますが、それで良いのでしょうか?
→ご指摘ありがとうございます。
 このコードは原因調査用のコードで戻り値でなくタスクマネージャーでプロセスをチェック
 していました。本番にはFinallyブロックをなくして正しく”NG"が出るようにします。

> ファイルの上書き保存なら、Save を使うべきかと思いますよ。
→Saveでも同じでした。
 本番のソフトは、新規ブックを開いて、SaveAsでファイル名指定して保存していました。
 しかし、プロセスにExcel.exeが残る問題が発生したため、原因調査用のコードを新規に実装
 しどこに原因があるかを1行1行コードを変えたりして調べていました。
 その結果、SaveAsもしくはSaveメソッドを実行すると問題が発生するところまで判りました。

> それにこのコードだと、保存に失敗したとき(C:\test.xls が読み込み専用であるなど)には
> xlbook.Close() や Marshal.ReleaseComObject(xlbook) が実行されない事になりますね。
→アドバイスありがとうございます。
 このコードはプロセスが残る原因を調査するためだけに作ったテスト用のコードでtest.xlsも、
 読み書き可能な空のExcelファイルです。
 デバックモードでトレースしながらタスクマネージャーでチェックしていますが、Excel.exe
 プロセスが残る問題以外は異常ありませんでした。

 
> ・それぞれの ReleaseComObject の戻り値が、0 である事を確認する。
> ・SaveAs(Save)の処理を CallByName 経由の呼び出しに変更してみる。
→ReleaseComObject の戻り値が、0 であるのは全て確認しました。
 「CallByName 経由の呼び出しに変更」も試しましたが、うまくいきませんでした。
 
> ・Excel ライブラリを使うために、どのファイルを参照設定に加えているかを再確認。
→確認しましたが問題ありません。
 Excel 11.0 object Library Ver 1.5
 Office 11.0 object Library Ver 2.3
Office 12.0 object Library Ver 2.4
を参照しています。
 参考)Excel2002環境で作ったプロジェクトを使って、Excel2003がインストされたターゲット
 マシンで動かしているためかと思い、Excel2003環境で参照を設定し直してもだめでした。

> ・新規に空の xls ファイルを作って試した場合にも、同じ結果になるかどうかを確認。
→確認しましたが問題ありません。
 
> ・C:\test.xls または PERSONAL.XLS などで、何らかのマクロが実行されてはいないかを確認。
→確認しましたが問題ありません。

私感ですが、Excel2002とExcel2003のSaveAs(もしくはSave)でCOMの挙動が違うような気がします。
他のCOMはちゃんと開放できています。
Excel2003のSaveAs(もしくはSave)メソッドを使用した場合は、根にか別の処理を追加する必要が
あるのでは? と考えていますが、ネットを検索しても有効な手段が見つかりません。
ネットに「SaveAsの後にApplication.DoEvents()を入れてみてください。」というのがありましたが、
これもうまくいきませんでした。

返信 編集キー/


管理者用

- Child Tree -