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

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

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

Re[3]: 2005 C# からのExcel操作


(過去ログ 58 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■33156 / inTopicNo.1)  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>
引用返信 編集キー/
■33163 / inTopicNo.2)  Re[1]: 2005 C# からのExcel操作
□投稿者/ 中 博俊 (21回)-(2009/02/22(Sun) 11:18:06)
単純に言うと"."が1文で2回出てきたらバグです。

Excel.XlWBATemplate.xlWBATWorksheet

これは

var template = Excel.XlWBATemplate;
var worksheet = template. xlWBATWorksheet

と2文に分けて、それぞれ開放してあげましょう。
引用返信 編集キー/
■33168 / inTopicNo.3)  Re[2]: 2005 C# からのExcel操作
□投稿者/ 魔界の仮面弁士 (1012回)-(2009/02/22(Sun) 11:40:58)
2009/02/22(Sun) 12:12:26 編集(投稿者)

No33163 (中 博俊 さん) に返信
> var template = Excel.XlWBATemplate;
> var worksheet = template. xlWBATWorksheet
> と2文に分けて、それぞれ開放してあげましょう。

そもそもコンパイルすら通らなくなってしまうような気がするのですが、
そちらの環境では、本当にそれで動作しているのでしょうか?

(Excel の場合、基本的には「Xl で始まるものは列挙型」「xl で始まる物は列挙値」のハズ)


No33156 (YA さん) に返信
> 【ソース】
[図表モード]で投稿していただけると助かります。
なお当方 Excel 2007 環境では、プロセスが終了しないという現象を再現できませんでした。

> ・Excel2000、Excel2003 の両方インストール
Excel のタイプライブラリは共存できず、複数インストール時は、
どちらか(通常は上位バージョン)で上書きされてしまうと思います。

また、2003 の PIA は存在しますが、2000 の PIA は用意されていなかったかと思います。
使用している相互運用機能アセンブリが、2000/2003、いずれのバージョン向けの物か
確認しておいた方が良いかと思います。

ただし、当方で 2000 と 2003 のタイプライブラリを比較してみた限りでは、
Workbooks.Add や Workbook.Close のメソッド定義(引数定義、戻り値、DispId)には
差異が見当たらなかったので、コードそのものの問題では無いような気もします。


> 何故、保存処理(※2)を加えただけでExcelプロセスが残るのでしょうか。
検証のために、ReleaseComObject の戻り値を調べてみてください。
それが 0 以外の値になるようであれば、内部的に参照カウントが変化している
可能性があります。

たとえば当方では、特定の条件下において、object 型からの型変換/型チェック時の際に、
Excel が参照カウントを勝手に増加させてしまう状況を目にしていますし、また、
Excel のアドインやマグロの不具合によって、そうした状況を引き起こした事もあります。


# 「という状況に 出/会/っ/た」と書いたら、キーワードチェックによって
# 投稿が拒否されてしまい、折角書いた内容が失われてしまいました…。(泣)
## エラー時にも投稿内容を維持して、編集画面に戻すようにして欲しいです。>管理者チーム
引用返信 編集キー/
■33187 / inTopicNo.4)  Re[3]: 2005 C# からのExcel操作
□投稿者/ YA (2回)-(2009/02/22(Sun) 20:56:51)
2009/02/22(Sun) 20:58:33 編集(投稿者)
> ■No33163 (中 博俊 さん) に返信
・参考に致します。
 返信の方、有難う御座いました。


No33168 (魔界の仮面弁士 さん) に返信
> 2009/02/22(Sun) 12:12:26 編集(投稿者)
>
>>【ソース】
> [図表モード]で投稿していただけると助かります。
・ソースを貼り付けたあと、「図表モード」を選択しての投稿だったのですが
 それが駄目なようでした。
 申し訳ありません。

> Excel のタイプライブラリは共存できず、複数インストール時は、
> どちらか(通常は上位バージョン)で上書きされてしまうと思います。
・Excel2003が入っているPCに、Excel2000をインストールという手段をしてました。

>
> また、2003 の PIA は存在しますが、2000 の PIA は用意されていなかったかと思います。
> 使用している相互運用機能アセンブリが、2000/2003、いずれのバージョン向けの物か
> 確認しておいた方が良いかと思います。
・Microsoft Excel 9.0 Object Libraryを参照設定にし、使用しております。
 (私はこれで、Excel2000の相互運用機能アセンブリを使用していると思っております)
 (知識不十分なため、このような返答になってしまい申し訳御座いません)

> 検証のために、ReleaseComObject の戻り値を調べてみてください。
> それが 0 以外の値になるようであれば、内部的に参照カウントが変化している
> 可能性があります。
・上記コードの全ての箇所のReleaseComObjectの戻り値は0でした。

> たとえば当方では、特定の条件下において、object 型からの型変換/型チェック時の際に、
> Excel が参照カウントを勝手に増加させてしまう状況を目にしていますし、また、
> Excel のアドインやマグロの不具合によって、そうした状況を引き起こした事もあります。
・環境の問題と、現在仮定することに致しました。
 情報の方、大変有難う御座います。

私の知識が満足ではないため、返信に対してのピンポイントな解答のやりとり
が出来ず申し訳ありません。
(PIA,相互アセンブリ等、ぼんやりとした知識しか無く、突き詰まって言われると
 わからない程の知識不足でした。)

>
>
> # 「という状況に 出/会/っ/た」と書いたら、キーワードチェックによって
> # 投稿が拒否されてしまい、折角書いた内容が失われてしまいました…。(泣)
・再度、ご返信をして頂き大変有り難く思いました。
 有難う御座います。

コーディングの問題ではないと捉えさせて頂きました。
よって、以上で解決とさせて頂きました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -