- PR -

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

投稿者投稿内容
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-02-16 19:58
引用:

Jittaさんの書き込み (2007-02-16 07:22) より:
引用:

じゃんぬねっとさんの書き込み (2007-02-15 19:29) より:
まあ、最初の回答にあった BeforeClose イベントで解決した方が楽ですが。


これだと、ユーザーが何時終了していいのか、分からなくないですか?
または、プログラムで Exit していると思いますが、ユーザーが操作中に終了してしまわないですか?



 そうですね。

 1プロセスにタイプの異なるユーザーの意思(アプリでの帳票出力と手作業でのEXCEL編集)を同居させるとやっかいです。
 アプリの方はBeforeCloseイベントで武装できますが、手作業の方はできないので先にアプリでEXCELを終了させるとアウトです。プロセス分ける等にした方がよさそうですね。

 アプリでEXCELをつかんでいる間にユーザーが手作業でのEXCEL編集等を完了できてしまうというのはEXCELをつかんでいる時間が長すぎるかもしれないので、そのあたりを短くする工夫があってもよいかもしれませんね。
 ま、開いて「間違えた」といって閉じるだけなら大した時間じゃないですけど。

 そもそもアプリでEXCEL編集している間にユーザーがそのプロセスをインタラクティブに使える状態になっているのかなあ?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-16 22:44
引用:

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

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


これより、次のことがわかります。

  • 自作アプリが、Excel を使用する
  • 自作アプリは、Excel を非表示で起動する
  • 自作アプリが Excel を起動中に、ユーザが Excel ファイルを編集できる

また、次のことが想像されます。

  • ユーザは、自作アプリが Excel を起動していることを知らない
  • または、自作アプリが Excel を起動している期間を知らない
  • 自作アプリは、ユーザが Excel を操作することに対して制限をしていない
  • 自作アプリは、Excel.Application クラスを New している
  • 自作アプリは、すべきことを終えると、Excel.Application.Exit をしている


 ここで、ユーザと自作アプリが Excel を起動し、操作し、終了する組合せを考えると、4パターンあります。
コード:
  ユーザ                      自作アプリ
----------------------------------------
    (1)
 Excel 起動
    ↓                        Excel 起動
 Excel 終了                       ↓
    (2)          (3)              ↓
 Excel 起動   Excel 起動          ↓
    ↓           ↓               ↓
 Excel 終了      ↓               ↓
                 ↓           Excel 終了
              Excel 終了


パターン4は、パターン1の終了が自作アプリが起動した Excel が終了した後になります。しかし、自作アプリが後から起動させるパターンでは Excel プロセスは複数起動しますから、パターン1と4は問題とはなりません。

 今回の質問内容は、パターン2に相当します。しかし、パターン3の場合も考えなければならないのではないでしょうか。おそらく、パターン3の場合は、「保存しますか?」の問い合わせがあり、ここで「キャンセル」することで回避できるので、問題と認識されなかったのではないかと思います。

 いま、じゃんぬさんの方法では、パターン2で、自作アプリが非表示で起動した Excel を、ユーザ指示で表示した後、終了をキャンセルしました。すると、自作アプリの処理が終了するまで、ユーザは使用しない Excel が画面上に残ることになります。これが「ユーザーが何時終了していいのか、分からなくないですか?」。もちろん、ユーザが開いた WorkBook を閉じたときに、自作アプリが使用している以外の WorkBook がないか調べ、なければ非表示に戻せば、ユーザには終了したように見えます。
 パターン3の場合、単にパターン2の対策しかしていなければ、「保存しますか?」が表示されるか、あるいは編集していなければ、勝手に閉じてしまわれることになります。これが「ユーザーが操作中に終了してしまわないですか?」。

 もちろん、質問はパターン2だけですので、パターン3については対策済みなのかもしれません。しかし、質問内容からはそれはわかりません。考慮しなければならないケースとして、提示しました。

 ちなみに、パターン4とパターン2,3の組合せ(エクスプローラからの起動が、自作アプリが Excel プロセスを起動する前後にある)というのも考えられますが、この場合、PID がより若いプロセスが使われると思います(未確認)。
_________________
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-02-16 23:57
引用:

じゃんぬねっとさんの書き込み (2007-02-16 08:49) より:

たとえば、プロセスごと Kill された時のことを考えると、弊害のない手段を選びたいと思います。
"かならず、後始末" できる手段があれば良いとは思います。



そういうための保険なら、発想を転換して XLSTART に Workbook_Open で IgnoreRemoteRequests を制御する addin を入れておけばよいような気がします。

1回目はこけますが、2回目以降は開けるでしょう。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-02-17 00:03
引用:

ラフィンさんの書き込み (2007-02-16 19:58) より:

 そもそもアプリでEXCEL編集している間にユーザーがそのプロセスをインタラクティブに使える状態になっているのかなあ?



そういう前提なら、.NET で制御するんじゃなくて、基本 VBA で制御した方がいいと思いますねぇ。

.NET 使いたい部分は COM 化してやって VBA から呼び出すとか。
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-22 10:54
回答遅れて申し訳ありません(^^;

引用:

じゃんぬねっとさんの書き込み (2007-02-15 20:06) より:
IgnoreRemoteRequests = True の場合、Workbook 自体が Open できなくなることがあります。





例えばどのようなケースでしょうか?

ちなみに以下のコード中、
コード:
Dim L_XLApp As Excel.Application = Nothing

Try
  'Excel起動
  L_XLApp = New Excel.Application()
  L_XLApp.IgnoreRemoteRequests = True 'DDE要求を無効
  L_XLApp.DisplayAlerts = False       '保存確認ダイアログを非表示

  '***************************************
  'データ出力処理(約30秒)(※1)
  '***************************************

  'Excel表示
  L_XLApp.DisplayAlerts = True         '保存確認ダイアログを表示
  L_XLApp.Visible = True               'Excel表示
  L_XLApp.IgnoreRemoteRequests = False 'DDE要求を有効
  Marshal.ReleaseComObject(L_XLApp)
  L_XLApp = Nothing

Finally
  'Excel参照開放
  If Not L_XLApp Is Nothing Then
    L_XLApp.DisplayAlerts = False '保存確認ダイアログを非表示
    L_XLApp.Quit()                'アプリケーション終了
    Marshal.ReleaseComObject(L_XLApp)
    L_XLApp = Nothing
  End If

End Try


※1のデータ処理中にエクスプローラから
---->
手順1.Excelファイルを開いて、Excelアプリケーションを起動する。
手順2.[手順1]のExcelアプリケーションを終了する。
手順3.Excelファイルを開いて、Excelアプリケーションを起動する。
手順4.[手順3]のExcelアプリケーションを終了する。
----<
の操作を行ったのですが、ワークブックは問題なく開きました。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-22 11:02
'***************************************
'データ出力処理(約30秒)(※1)
'***************************************

でずっこけた時とかだろ。多分。
finnalyにIgnoreRemoteRequests=false入れておけばまだマシだろうけど。
有無を言わさずずっこけた時はOpenできなくなると思われ。多分だけどね。

BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-22 12:28
引用:

ぶさいくろうさんの書き込み (2007-02-22 11:02) より:
有無を言わさずずっこけた時はOpenできなくなると思われ。多分だけどね。


Try〜Catch句でキャッチできないエラーですか?
さすがにそこまで想定外の対応は良いかなと思ってます^^;
BlueField
会議室デビュー日: 2007/02/15
投稿数: 12
お住まい・勤務地: 茨城
投稿日時: 2007-02-22 12:36
引用:

BlueFieldさんの書き込み (2007-02-22 12:28) より:
引用:

ぶさいくろうさんの書き込み (2007-02-22 11:02) より:
有無を言わさずずっこけた時はOpenできなくなると思われ。多分だけどね。


Try〜Catch句でキャッチできないエラーですか?
さすがにそこまで想定外の対応は良いかなと思ってます^^;




追記 ----------------------------------------------
というより、IgnoreRemoteRequestsをTrueにしても
別プロセスでワークブックが開けたのですが、
※1でExceptionが発生するとになると開けなくなる
可能性があるという理由が分かりませぬ^^;

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