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

わんくま同盟

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

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


(過去ログ 58 を表示中)
■33156 / )  2005 C# からのExcel操作
□投稿者/ YA (1回)-(2009/02/21(Sat) 21:37:45)

分類:[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>
返信 編集キー/


管理者用

- Child Tree -