教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA フォーム&コントロール】フォームの[X]ボタンでフォームを閉じられない様にする方法を教えて!

構文

構文は以下の通りです。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' フォームが閉じられる直前に呼び出されるイベント
    ' CloseModeパラメータは、フォームを閉じる方法を示す定数を取ります
    If CloseMode = vbFormControlMenu Then
        ' [X]ボタン(Closeボタン)による閉じる動作
        ' このブロック内の処理が実行されます
    ElseIf CloseMode = vbFormCode Then
        ' コードからのフォームの閉じる動作
        ' このブロック内の処理が実行されます
    ElseIf CloseMode = vbAppTaskManager Then
        ' タスクマネージャーからのフォームの閉じる動作
        ' このブロック内の処理が実行されます
    End If
End Sub

解説

CloseModeは、UserFormのクローズ(閉じる)イベントで使用される引数(パラメータ)です。UserFormを閉じるときに、ユーザーに確認を求めるかどうかを制御するために使われます。CloseModeには、以下の3つの定数があります。
●vbFormControlMenu(0):[×]ボタンをクリックした場合や、システムメニューの[閉じる]を選択した場合など、フォームがユーザーによって閉じられるときに使用される定数です。デフォルトで設定されています。
●vbFormCode(1):VBAコード内でUserFormを閉じる際に使用される定数です。これを指定すると、VBAコードによってUserFormを閉じる際に、Closeイベントが発生しません。
●vbAppTaskModal(2):他のアプリケーションのウィンドウがUserFormを隠している場合に使用される定数です。この場合、UserFormを閉じることができません。

使い方

具体的な使い方について紹介します。

If CloseMode = vbFormControlMenu Then
    Dim response As VbMsgBoxResult
    response = MsgBox("フォームを閉じますか?", vbYesNo + vbQuestion, "確認")
    If response = vbNo Then
        Cancel = True ' フォームを閉じないようにキャンセル
    End If
End If

上記の例では、フォームが[×]ボタンをクリックされた時に、確認ダイアログを表示してユーザーに閉じるかどうかの選択を促します。vbFormControlMenuの場合にのみ、確認ダイアログが表示されるようになっています。

プログラミング例

以下に、QueryCloseイベント使った[X]ボタンを無効化する例を紹介します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        MsgBox "フォームを[X]ボタンで閉じることはできません。", vbExclamation, "警告"
        Cancel = True
    End If
End Sub

まとめ

UserFormで、フォームを閉じる際にユーザーに確認を求めるためのCloseModeについて紹介しました。vbFormControlMenuを利用することで、ユーザーがフォームを閉じる際に確認ダイアログを表示することができます。これにより、誤ってフォームを閉じることを防止し、より安全なユーザーエクスペリエンスを提供することができます。是非活用してください。