HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > UserFormの[×]ボタンで閉じられなくする

UserFormの[×]ボタンで閉じられなくする|Excel VBA

ユーザーフォーム関連のテクニック

UserFormの[×]ボタンで閉じられなくする

(Excel 2000/2002/2003/2007/2010/2013)

一般的なUserFormでは、[閉じる]ボタンを用意しておきます。
UserFormを閉じるタイミングで、何らかの処理を行うには[閉じる]ボタンのイベントプロシージャに終了処理を組み込んでおけばよいでしょう。

しかし、ひとつ問題があります。
UserFormを閉じるとき、ユーザーが[閉じる]ボタンをクリックしてくれればいいのですが、UserForm右上の[×]ボタンをクリックされると、[閉じる]ボタンに仕込んだ終了処理が実行されないまま閉じられてしまいます。これは、困ります。

このとき、「[×]ボタンを消すにはどうしたらいいのだろう・・・」 と考えるかもれしれません。ですが、[×]ボタンを非表示にするプロパティを探しても、UserFormにそんなプロパティはありません。
[×]ボタンを消すWindows APIを使うと非表示にできますが、[Alt]+[F4]キーを押すと閉じてしまいます。それでは[閉じる]ボタンの終了処理が行われません。
今度は「[Alt]+[F4]キーを無効にするには・・・」と、話がどんどん難しくなります。

こんなときは発想を変えましょう。
「[×]ボタンを非表示にする」のではなく、「[×]ボタンで閉じられないように」すればいいのです。これなら、VBAの標準機能で可能です。

■UserFormのQueryCloseイベント

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]キーでも閉じられなくなります。