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

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

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

Re[4]: VB.NETでEXCELのプロセスを確実に終了させる方法 


(過去ログ 30 を表示中)

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

■14632 / inTopicNo.1)  VB.NETでEXCELのプロセスを確実に終了させる方法 
  
□投稿者/ 梅田です (1回)-(2008/02/24(Sun) 09:34:51)

分類:[VB.NET/VB2005] 

質問です。

開発環境:VS2005
使用言語:VB.NET
OS:WIN XP

現在、VB.NETからエクセルを操作していますが、うまくプロセスを終了させることができません。とりあえずの手段として、下記の方法でプロセスを終了した場合に何か問題点があるのかをご教授お願いいたします。

1.起動中の全てのプロセスを取得する
2."EXCEL"という名前がある場合ユーザーにEXCELの終了を促し、プロシージャを終了する
3.全てのプロセスに"EXCEL"という名前がない場合は次に進む

4.〜VB.NETでEXCELを操作する〜

5.起動中の全てのプロセスの中に"EXCEL"というプロセスの有無を確認し
  "EXCEL"がなくなるまで強制終了する

※現在、この方法で問題なく動いています
※途中でユーザーが手動でEXCELを起動することは考慮しません

引用返信 編集キー/
■14634 / inTopicNo.2)  Re[1]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ はつね (466回)-(2008/02/24(Sun) 10:22:59)
はつね さんの Web サイト
No14632 (梅田です さん) に返信
> 現在、VB.NETからエクセルを操作していますが、うまくプロセスを終了させることができません。とりあえずの手段として、下記の方法でプロセスを終了した場合に何か問題点があるのかをご教授お願いいたします。

# 自分以外のプログラムの事(ユーザがExcelを使う事も含む)を考慮せずに動作するのが問題です。

この方法では、そのEXE以外にExcelを使う別のEXEが必要になったときに破綻します。
そもそも論として、Excelを操作するコードでSystem.Runtime.InteropServices.Marshal.ReleaseComObjectを使って参照カウントを解放するのが基本だと思います。
ReleaseComObjectをちゃんとやっていて、なおかつ記載の方法をしているのであれば別のEXEが必要になったときにプロセス解放しているところを取り除くだけで済みますが、ReleaseComObjectをせずにプロセス解放で帳尻を合わせているのであれば、破綻が分かったときの対応作業が非常に大変であると思います。

http://jeanne.wankuma.com/tips/excel/openbook.html
引用返信 編集キー/
■14637 / inTopicNo.3)  Re[2]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ 梅田です (2回)-(2008/02/24(Sun) 14:03:39)
レスありがとうございます。

> この方法では、そのEXE以外にExcelを使う別のEXEが必要になったときに破綻します。

というのは、「このプログラムの動作中に、同時にEXCELを起動する別のソフトを使ったとき」ということでしょうか。
確かにユーザーにはどれがエクセルベースのソフトかわからないので大変なことになる可能性がありますね。
別のソフトがエクセルを起動できないようにする方法があればいいのですが・・・・。

>System.Runtime.InteropServices.Marshal.ReleaseComObjectを使って参照カウントを解放する
一応やってはいるのですが、「変数名 as EXCEL.〜」で表現できないオブジェクトを
変数に格納しないといけないプログラムなので、「as object」でやったのですが
うまくプロセスを開放できなくなってしまいまして。それでとりあえずの手段としての方法を検討しています。
Xlapp.Selection ← これでいきづまってしまいました。
引用返信 編集キー/
■14638 / inTopicNo.4)  Re[1]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ Jitta on the way (36回)-(2008/02/24(Sun) 14:05:45)
Excel を扱うクラスをつくり、単一のインスタンスのみつくる。そのインスタンスを破棄したのち、GC.Collect を2回コールする。


簡単だけど、とても危険。危険。危険。
引用返信 編集キー/
■14639 / inTopicNo.5)  Re[2]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ Jitta on the way (37回)-(2008/02/24(Sun) 14:12:04)
Excel に対する処理を、別の実行ファイルに切り出す。
それを実行するための、専用のアカウントを作成する。
専用アカウントで、Excel 処理アプリケーションを実行させるようにプログラムする。


前のよりは安全。
引用返信 編集キー/
■14654 / inTopicNo.6)  Re[3]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ はつね (467回)-(2008/02/24(Sun) 22:01:09)
No14637 (梅田です さん) に返信
> >System.Runtime.InteropServices.Marshal.ReleaseComObjectを使って参照カウントを解放する
> 一応やってはいるのですが、「変数名 as EXCEL.〜」で表現できないオブジェクトを
> 変数に格納しないといけないプログラムなので、「as object」でやったのですが
> うまくプロセスを開放できなくなってしまいまして。それでとりあえずの手段としての方法を検討しています。

そのObject型の変数もReleaseComObjectで参照カウントを開放しているのにという意味ですか?

引用返信 編集キー/
■14655 / inTopicNo.7)  Re[3]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ 梅田です (3回)-(2008/02/25(Mon) 00:46:19)
>Jitta on the way さん
危険なのはちょっと・・・

別のexeを使うとすれば、VB6からできるのですが、
今後の修正を考慮してできる限り同じソリュージョン内でやりたいので・・


>はつね さん
object型の開放の問題というか
遅延バインディングとなる場合のEXCELのプロセスの開放の問題というのは
http://d.hatena.ne.jp/zecl/searchdiary?word=%A5%D0%A5%A4%A5%F3%A5%C7%A5%A3%A5%F3%A5%B0
に記載されているのですが
私の知識では「参照カウントが0(ゼロ)に到達するまで、複数回呼び出してあげる」方法と
あとからEXCELのプロセスを強制終了する方法の良し悪しがわかりませんでしたので
確実な方法を選んだという次第です。

引用返信 編集キー/
■14656 / inTopicNo.8)  Re[4]: VB.NETでEXCELのプロセスを確実に終了させる方法 
□投稿者/ はつね (468回)-(2008/02/25(Mon) 01:13:58)
No14655 (梅田です さん) に返信
> 私の知識では「参照カウントが0(ゼロ)に到達するまで、複数回呼び出してあげる」方法と
> あとからEXCELのプロセスを強制終了する方法の良し悪しがわかりませんでしたので

両者の方法でともに目的が達せられるのならば、前者の方が良いと思います。

例えば、ExcelではなくてDBだったらどうでしょうか(DBとか良く分からんとしたら適切なたとえじゃないですが)。
DBへの接続が切れないというのであれば、接続しているコネクションをすべて切るようにプログラミングしませんか?
どれだけコネクション張ってしまったのか分からないからDBを強制終了させていますとはしないと思う。
# 書いてみてあまり適切な例えじゃないなーとは思いつつなので細部は無視でお願いします。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -