【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
UserFormの[×]ボタンで閉じられなくする|Excel VBA |
一般的なUserFormでは、[閉じる]ボタンを用意しておきます。
UserFormを閉じるタイミングで、何らかの処理を行うには[閉じる]ボタンのイベントプロシージャに終了処理を組み込んでおけばよいでしょう。
しかし、ひとつ問題があります。
UserFormを閉じるとき、ユーザーが[閉じる]ボタンをクリックしてくれればいいのですが、UserForm右上の[×]ボタンをクリックされると、[閉じる]ボタンに仕込んだ終了処理が実行されないまま閉じられてしまいます。これは、困ります。
このとき、「[×]ボタンを消すにはどうしたらいいのだろう・・・」 と考えるかもれしれません。ですが、[×]ボタンを非表示にするプロパティを探しても、UserFormにそんなプロパティはありません。
[×]ボタンを消すWindows APIを使うと非表示にできますが、[Alt]+[F4]キーを押すと閉じてしまいます。それでは[閉じる]ボタンの終了処理が行われません。
今度は「[Alt]+[F4]キーを無効にするには・・・」と、話がどんどん難しくなります。
こんなときは発想を変えましょう。
「[×]ボタンを非表示にする」のではなく、「[×]ボタンで閉じられないように」すればいいのです。これなら、VBAの標準機能で可能です。
UserFormのQueryCloseイベントは、ユーザーがUserFormを「閉じようとした」とき(閉じる前)に発生します。
そして、引数CloseModeには 「どのような方法で閉じようとしているか」 が格納され、引数CancelにTrueを設定すると「閉じる操作」をキャンセルできます。
引数CloseModeには、ユーザーの動作に応じて次の値が格納されます。
vbFormControlMenu:[×]ボタンがクリックされた vbFormCode:コードからUnloadステートメントが実行された
UserFormのQueryCloseイベントで引数CloseModeの値を調べて、もしvbFormControlMenuだったら、引数CancelにTrueを設定すれば、ユーザーは、UserFormを[×]ボタンで閉じられなくなります。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox "[閉じる]ボタンを使用してください" Cancel = True End If End Sub
もちろん、[×]ボタンだけでなく、[Alt]+[F4]キーでも閉じられなくなります。