|
分類:[C#]
2009/02/21(Sat) 21:42:29 編集(投稿者) 2009/02/21(Sat) 21:42:20 編集(投稿者)
<pre><pre>初めまして。 プログラム暦初心者です。
質問をさせて頂きます。
2005C#からExcel2000への操作に関しての質問をさせて下さい。
今回、2005C#からExcel2000への操作をする仕事に携わる事になりまして、 じゃんぬねっと様のExcel:COM解放の記事(URL:http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html) を参考に、C#からExcel操作の勉強をしております。
【問題】 そこで、Excelのプロセスが残ってしまいます。 ・別PCで検証してみたところ、別PCでは残りませんでした。
【問題発生の環境】 ・XP Professional Service Pack 3 ・C# 2005 ・Excel2000、Excel2003 の両方インストール
【ソース】 参考記事のソース丸々コピーではコンパイルが通らなかったため、少々の変更を致しました。 (下記ソース)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// 必要な変数は try の外で宣言する Excel.Application xlApplication = null;
// COM オブジェクトの解放を保証するために try 〜 finally を使用する try { xlApplication = new Excel.Application();
// 警告メッセージなどを表示しないようにする xlApplication.DisplayAlerts = false;
Excel.Workbooks xlBooks = xlApplication.Workbooks;
try { Excel.Workbook xlBook = xlBooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); ※1
try { Excel.Sheets xlSheets = xlBook.Worksheets;
try { Excel.Worksheet xlSheet = (Excel.Worksheet)xlSheets[1];
try { Excel.Range xlCells = xlSheet.Cells;
try { Excel.Range xlRange = (Excel.Range)xlCells[6, 4];
try { // Microsoft Excel を表示する xlApplication.Visible = true;
// 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000);
// Row=6, Column=4 の位置に文字をセットする xlRange.Value2 = "あと 1 秒で終了します";
// 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000); } finally { if (xlRange != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange); } } } finally { if (xlCells != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells); } } } finally { if (xlSheet != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet); } } } finally { if (xlSheets != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets); } } } finally { if (xlBook != null) { try { xlBook.Close(true, Type.Missing, Type.Missing); ※2 } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook); } } } } finally { if (xlBooks != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks); } } } finally { if (xlApplication != null) { try { xlApplication.Quit(); } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication); } } }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 私がソース変更した箇所は、※1、※2 の部分です。
本ソースコードでExcelファイル作成 → 保存 → プログラム終了後に Excel.exeのプロセスが 残ってしまいます。
(保存処理は、 ※2の第一引数(true)で実施しております。)
ここで更に色々と調査した結果、 ※2の第一引数をfalseにし、保存をしないでプログラム終了と すると、Excel.exeのプロセスが残りません。
また、別PCで試したところ、別PCではExcel.exeが残りません。(保存処理有りのプログラム) ※試した方法としては、.netFrameWork 2.0、Excel2000を入れて、上記ソースの実行体ファイルを コピーして試しました。
ーーーーーーーーー別PCの環境ーーーーーーーーー ・XP Professional Service Pack 2 ・.Net Framework 2.0 ・Excel2000 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
何故、保存処理(※2)を加えただけでExcelプロセスが残るのでしょうか。
そして別PCでExcel.exeプロセスが残らない環境の違いから Excel2003、Excel2000 の両方をインストールした状態だと、起こるのかなと 個人的に勝手な予想をしております。
過去にExcel操作系のサイト・過去記事はいくつもあったのですが、 私の探し方が悪かったのか、どれも今回の不具合解明には至りませんでした。
大変お手数ながら、本記事の不具合についてどなたかご存知な方、 情報のご提供を願えないでしょうか。
</pre></pre>
|