[[20181219101721]] 『ブックを閉じると他のブックで表示したフォームも』(もね) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ブックを閉じると他のブックで表示したフォームも閉じてしまう。』(もね)

【前提】
book1で以下のようにUserForm1を表示しています。
book1を起動するとbook1は最小化され、UserForm1が表示されます。

Private Sub Workbook_Open()

    Application.WindowState = xlMinimized
    UserForm1.Show vbModeless
End Sub

【問題事象】
まったく関係のないbook2を開いてから、book1を起動すると、book1は
最小化され、book2の上にUserForm1が表示されます。
ここで、book2を×ボタンで閉じると、UserForm1も閉じてしまいます。
(book1は最小化されたまま残ります。)

【解決したい内容】
book2を閉じてもUserForm1が閉じないようにするにはどのようにしたら
よいのかご教授ください。
因みに、book2を閉じる際、UserForm1にCloseMode=5でQueryClose
イベントが発生しますが、Cancel=1としてもUserForm1は閉じてしまいます。

book2はユーザの任意のブックを想定していますので、book2にコードを
書き込むことによる対処はできません。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


CloseModeに5が返っている、というのがよく判らないです。Excel2010までは3までしか無かったし、MSの今年の情報でも3までなんですよね。

そして、Book2を閉じようとして、Excel自体を終了させていたりしないでしょうか? または、Book2を閉じる際にもマクロを使っていて、中で End を使って強制終了していないでしょうか? End で終わらせると、QueryCloseイベントを通らずに、フォームは強制的に閉じられてしまいますよ。

あとは念のための確認ですが、QueryCloseイベントで対策したのは、閉じたくないフォームのある、book1のマクロですよね?
(???) 2018/12/19(水) 11:25


???様
ご返信ありがとうございます。

>CloseModeに5が返っている、というのがよく判らないです。Excel2010までは3までしか無かったし、MSの今年の情報でも3までなんですよね。


オブジェクトブラウザーでvbQueryCloseのメンバーを確認すると以下の5つが
定数定義されていますが、5はありません。
ただ、実際にMsgBoxでCloseModeを表示させたところ、5が表示されました。
vbFormControlMenu = 0
vbFormCode = 1
vbAppWindows = 2
vbAppTaskManager = 3
vbFormMDIForm = 4

>そして、Book2を閉じようとして、Excel自体を終了させていたりしないでしょうか? または、Book2を閉じる際にもマクロを使っていて、中で End を使って強制終了していないでしょうか? End で終わらせると、QueryCloseイベントを通らずに、フォームは強制的に閉じられてしまいますよ。


book2にマクロはありません。×ボタンで閉じています。book1は閉じず、book1で表示したUserForm1がとじてしまいます。

>あとは念のための確認ですが、QueryCloseイベントで対策したのは、閉じたくないフォームのある、book1のマクロですよね?


はい。

(もね) 2018/12/19(水) 11:48


補足です。
book1とbook2は別ウインドウで表示しています。
(もね) 2018/12/19(水) 13:50

Excel2013は、初めてMDI形式からSDI形式に切り替わった版なので、ウィンドウ制御に何かバグがある可能性もあります。 Book1を最小化せずにおけば、Book2に引きずられて閉じなくなったりしませんか? これだけで動きが変わってしまうようなら、バグっぽいので、お手上げかも。(最小化せずに裏に回すだけにして逃げる一手かと)
(???) 2018/12/19(水) 14:31

???様
おっしゃる通り、book1を最小化せずにおけば、book2に引きずられて閉じなくなります。
book1を最小化しない方向で検討致します。
ご助言ありがとうございました。
(もね) 2018/12/19(水) 14:53

 「ThisWorkbookモジュール」に

 Private Sub Workbook_Open()
     Application.WindowState = xlMinimized
     UserForm1.Show vbModeless
 End Sub

 Public Sub showAgain()
     Workbook_Open
 End Sub

 「Userformモジュール」に

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     If CloseMode = 5 Then
         Application.OnTime Now, ThisWorkbook.Name & "!ThisWorkBook.showAgain"
     End If
 End Sub

 ※ 将来、バグが修正された後、どうなるのか分かんないですけども・・

(半平太) 2018/12/19(水) 15:13


半平太様

ご返答ありがとうございます。
こんなやり方があるんですね。勉強になります。

(もね) 2018/12/19(水) 15:59


 役に立つかどうか、これに該当するか分からないけど、
 見つけたので4と5だけ貼っておきます

 QueryUnload Event
 https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/aa445536(v=vs.60)

 Return Values

 The unloadmode argument returns the following values:

 Constant	Value	Description
 vbFormMDIForm	4	An MDI child form is closing because the MDI form is closing.
 vbFormOwner	5	A form is closing because its owner is closing.

(2u) 2018/12/19(水) 18:53


2u様
コメントありがとうございます。

この説明を見ると、やっぱり今回の動作はちょっとおかしいかと思えます。
UserForm1のownerがbook2になっているような・・・

参考にさせていただきます。

みなさまありがとうございました。

(もね) 2018/12/20(木) 17:34


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.