@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ユーザ操作でExcelアプリケーションが終了してしまう

投稿者投稿内容
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-15 11:22
VB.NETでExcel2003にファイルからデータを出力するプログラムを作成しています。

Excelが非表示状態(Application.Visible = False)でデータ出力処理中に、
ユーザによって
1.Excelファイルを開いてExcelを起動
2.すぐにExcelを終了する
操作を行うと、データ出力プログラムの方で
以下のエラーメッセージが表示されてしまいます。

----------------
メッセージ内容:起動されたオブジェクトはクライアントから切断されました。(HRESULTからの例外: 0x80010108(RPC_E_DISCONNECTED))
----------------

ユーザがファイルを開いたときにデータ出力プログラムが使用しているプロセスの
Excelと同じExcelを使用してしまうのが問題だと思うのですが、
ユーザからファイルを開いてもデータ出力プログラムと同じプロセスのExcelを
使用しないようにする方法はありませんでしょうか?

ご教授のほど宜しくお願い致します。


[ メッセージ編集済み 編集者: BlueField 編集日時 2007-02-15 11:24 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-15 12:15
引用:

BlueFieldさんの書き込み (2007-02-15 11:22) より:

ユーザがファイルを開いたときにデータ出力プログラムが使用しているプロセスの
Excelと同じExcelを使用してしまうのが問題だと思うのですが、ユーザからファイルを開いてもデータ出力プログラムと同じプロセスのExcelを使用しないようにする方法はありませんでしょうか?


エクスプローラからの後出しとなると、普通の方法では難しいですね。

終了イベントを捉えてキャンセルしてしまえば良いと思います。
もちろん、閉じようとしている Workbook は閉じさせます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-15 13:05
引用:

じゃんぬねっとさんの書き込み (2007-02-15 12:15) より:
エクスプローラからの後出しとなると、普通の方法では難しいですね。

終了イベントを捉えてキャンセルしてしまえば良いと思います。
もちろん、閉じようとしている Workbook は閉じさせます。



やはり難しい、ですか^^;
しかし、イベントを捉えれば不可能ではないということですね。
(結構遭遇しそうなケースだと思うのにマイクロソフトめ・・・)

とても参考になりました。
じゃんぬねっとさん、素早いご回答ありがとうございます!
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-15 13:52
引用:

BlueFieldさんの書き込み (2007-02-15 13:05) より:

やはり難しい、ですか^^;
しかし、イベントを捉えれば不可能ではないということですね。


今確認したところ、可能のようです。
BeforeClose イベントで Cancel することができます。

引用:

(結構遭遇しそうなケースだと思うのにマイクロソフトめ・・・)


(遭遇しそうなケースかどうかは主観になるので言及しませんが)
今回は回避策がコードで普通に組めるレベルなので、まだ良い方です。
一部の HRESULT の例外などは回避すらできないのでもっと深刻でしょう。

このあたりは想定も何も当初からしていなかったのでしょうね。
Office の歴史も長いわけで、なかなか変えられない現状があります。

次期 Office + VSTO には期待していますが、それまでは VBA ベースで触る程度が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-15 14:23
引用:

じゃんぬねっとさんの書き込み (2007-02-15 13:52) より:
今確認したところ、可能のようです。
BeforeClose イベントで Cancel することができます。


すみません、わざわざ確認までして頂いて^^;

引用:

引用:

(結構遭遇しそうなケースだと思うのにマイクロソフトめ・・・)


(遭遇しそうなケースかどうかは主観になるので言及しませんが)
今回は回避策がコードで普通に組めるレベルなので、まだ良い方です。
一部の HRESULT の例外などは回避すらできないのでもっと深刻でしょう。

このあたりは想定も何も当初からしていなかったのでしょうね。
Office の歴史も長いわけで、なかなか変えられない現状があります。


軽いグチだと思って聞き流しておいてください^^;
何にせよ余計な発言でした。
今後は心に思うだけにしておくようにします^^

引用:

次期 Office + VSTO には期待していますが、それまでは VBA ベースで触る程度が良いでしょう。


VBAベースにできれば・・・・良かったのですが、
他システムとの同期など色々制限がありまして。
まぁ、一番の問題は己の知識不足ですが。。(精進します^^;)


じゃんぬねっとさん、ご回答ありがとうございます!
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-15 15:54
引用:

BlueFieldさんの書き込み (2007-02-15 11:22) より:

ユーザがファイルを開いたときにデータ出力プログラムが使用しているプロセスの
Excelと同じExcelを使用してしまうのが問題だと思うのですが、
ユーザからファイルを開いてもデータ出力プログラムと同じプロセスのExcelを
使用しないようにする方法はありませんでしょうか?


 ユーザが、どのようにエクセル ファイルを開くのでしょうか?エクスプローラから、ファイルをダブルクリックする、などであるなら、各クライアントで設定を変更してもらう必要があります。

 エクスプローラから、エクセル ファイルをダブルクリックします。同じファイルを、もう一度ダブルクリックします。すると、同じ名前のファイルは開けません、というメッセージが表示されます。
 スタートメニューからエクセルを起動し、そのエクセルのファイル メニューから、同じファイルを開きます。すると、編集中なので読み取り専用で開きますか、というメッセージが表示されます。

 なぜこの様な違いが発生するのでしょう?

 エクスプローラが、すでに起動しているエクセル プロセスに対してメッセージを送るからです。従って、新たにプロセスを起動したいなら、エクスプローラに対して指示を出さなければ(設定を変更しなければ)なりません。

 具体的には、[フォルダ オプション]の[ファイルの種類]タブから xls を選び、[詳細設定]、「開く」を選んで[編集]、[DDE を使う]チェックを外せば、別のプロセスを使うようになります。
_________________
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-15 16:43
引用:

Jittaさんの書き込み (2007-02-15 15:54) より:
 ユーザが、どのようにエクセル ファイルを開くのでしょうか?エクスプローラから、ファイルをダブルクリックする、などであるなら、各クライアントで設定を変更してもらう必要があります。


「エクスプローラからエクセルファイルを開く」という認識でOKです^^

引用:

 エクスプローラが、すでに起動しているエクセル プロセスに対してメッセージを送るからです。従って、新たにプロセスを起動したいなら、エクスプローラに対して指示を出さなければ(設定を変更しなければ)なりません。

 具体的には、[フォルダ オプション]の[ファイルの種類]タブから xls を選び、[詳細設定]、「開く」を選んで[編集]、[DDE を使う]チェックを外せば、別のプロセスを使うようになります。



既定値がDDEを使用になっているためプログラムで生成した
Excelが使用されてしまうということですか〜。
そうなるとプログラムだけでどうこうできる問題ではなさそうですね^^;

とても参考になりました、Jittaさんありがとうございます!
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-15 17:26
引用:

BlueFieldさんの書き込み (2007-02-15 16:43) より:

既定値がDDEを使用になっているためプログラムで生成したExcelが使用されてしまうということですか〜。
そうなるとプログラムだけでどうこうできる問題ではなさそうですね^^;


一応、起動中の Excel.ApplicationClass から、代替起動することで誤魔化しは可能です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)