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

Excelを一度開くとMe.Close()が効かなくなる

1
投稿者投稿内容
ごろう
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 50
お住まい・勤務地: 神奈川県横浜市 横浜駅の海方面
投稿日時: 2007-10-22 19:38
よろしくお願いします。

5秒毎にページをロードしてDBから情報を取得して、
画面を再描画しているページがあります。

<<画面の詳細>>
Panelを設置。
Panel上にBottunを設置。
Panel上にはDBから取得したデータの数だけBottonを並べる。
Panel上のBottunのtextプロパティにはDBから取得した値を設定。
画面再描画時にはPanel上のBottunにフォーカスを合わせる。

タイマーは以下のように設定。

Private Sub BaseForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
indTimer = New Timer()
AddHandler indTimer.Tick, AddressOf TimerEventProc
indTimer.Interval = 5000
indTimer.Start()
end Sub


上記コードを記述したページ(WindowsForm)が開いた状態で以下の操作をするとMe.Closeが効かなくなってしまいました、
@すでに開いているExcelをActiveにする。
A対象のページに戻る。
Bボタン(画面遷移のみ実装)を押下する。
CMe.Close()が無視される。

ボタンのコードは以下のとおりです、Me.Closeを無視しますが、exには入りません。
Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
Try
Me.Close()
Catch ex As Exception
      'ログ出力
End Try
End Sub

よろしくお願いします。

[ メッセージ編集済み 編集者: ごろう 編集日時 2007-10-23 15:27 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-10-23 10:55
バージョン等が書かれていないので何とも言えませんが、私の所では再現しませんでした。(Excel2007 VS2005 デバッグ実行ではなくexe単独で実行)

新しくWindowsFormのプロジェクトを作って、btn1というボタンを張っただけのフォームを作って、ごろうさんの書いたbtn1のイベントハンドラをコピーしてきてください。
それで同じ現象が出ますか?

出ないのであれば、ごろうさんの書いたソースから少しずつソースをコピペして、どういったコードを追加したらそのような動きになるのかを調べてください。

特定のソースが分かったら、それ以前にコピペしてきていたソースを現象が無くならないようにしながらできるだけ消してください。

すると、現象の発生する最小限のソースが出来上がるので、それを教えてください。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-10-23 13:09
とにかく、まっさらから少しずつ処理を追加していき悪さをするステップを突き止めましょう。

1.Me.Closeのみ
2.+タイマのみ(タイマ内処理無し)
3.全処理

#っていうか、タイトルからするとExcelが原因と特定しているような。

あとは、FormClosingイベントが発生するか確認。

もし発生しているのなら、暗黙のフォームインスタンスを閉じる流れの中で参照しているとか。>あくまで考えられる予想。実際そのような挙動になるかは未確認。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-23 13:34
とりあえず Timer Tick に実装されている処理が見たいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ごろう
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 50
お住まい・勤務地: 神奈川県横浜市 横浜駅の海方面
投稿日時: 2007-10-23 15:26
ご返答ありがとうございます。

とりあえず、現在まででわかっている事は、

1.ExcelでなくてもMe.Close()が無視される
→一度最前面に他のファイルを持ってきて、WindowsFormに戻ると再現できる。
2.FormClosingイベントは発生していない
です。

以上です。

応急措置として、
再描画時にPanel外のBottunにフォーカスを合わせるようにしたら、
Me.Close()が無視される事がなくなりました。


<<画面の詳細>>
Panelを設置。
Panel上にBottunを設置。
Panel上にはDBから取得したデータの数だけBottonを並べる。
Panel上のBottunのtextプロパティにはDBから取得した値を設定。
画面再描画時にはPanel上のBottunにフォーカスを合わせる。

[ メッセージ編集済み 編集者: ごろう 編集日時 2007-10-23 15:28 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-10-23 15:35
引用:

ごろうさんの書き込み (2007-10-23 15:26) より:
ご返答ありがとうございます。

とりあえず、現在まででわかっている事は、

1.ExcelでなくてもMe.Close()が無視される
→一度最前面に他のファイルを持ってきて、WindowsFormに戻ると再現できる。
2.FormClosingイベントは発生していない
です。

以上です。

応急措置として、
再描画時にPanel外のBottunにフォーカスを合わせるようにしたら、
Me.Close()が無視される事がなくなりました。


<<画面の詳細>>
Panelを設置。
Panel上にBottunを設置。
Panel上にはDBから取得したデータの数だけBottonを並べる。
Panel上のBottunのtextプロパティにはDBから取得した値を設定。
画面再描画時にはPanel上のBottunにフォーカスを合わせる。

[ メッセージ編集済み 編集者: ごろう 編集日時 2007-10-23 15:28 ]


言いたいことはわかるんだけど「ファイル」じゃなくて「ウィンドウ」の間違いじゃない?
あと最近Buttonを「ぼっつん」って書くのが流行りなのかな。
それはそれとしてフォーカスを元のButtonっていうかウィンドウに戻せば良いってことなんだろうね。
そうだとしてWMも発生してなかったりするのかね。。。なんだろ?
MDIの場合は似たような問題があったと思うけど普通のフォームでは聞いたことがない。
タイマーによって動く処理が間に合ってなくて無視されているのとばかり思っていたが。。。

で問題なのは再現できないんだよな。俺んとこだと。最前面って関係あるのかな。
単にフォーカスを戻すことで処理を待ってくれてそれからCloseが働くとかそんなんじゃないのかな。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-23 21:17
他の人のところで再現できないと、あなたが思っている以外のところに原因がある、ということになるかと思います。
もう一度、コードを書いた意図と、コードに書かれている内容を照らし合わせてみることを勧めます
ごろう
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 50
お住まい・勤務地: 神奈川県横浜市 横浜駅の海方面
投稿日時: 2007-10-23 21:26
引用:

Jittaさんの書き込み (2007-10-23 21:17) より:
他の人のところで再現できないと、あなたが思っている以外のところに原因がある、ということになるかと思います。
もう一度、コードを書いた意図と、コードに書かれている内容を照らし合わせてみることを勧めます



了解です。
ちょっと今DataGrid関連でてこずっている仕事があるので、
終了後にもう一度整理してからまた質問させてください。

よろしくお願いします。
1

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