教えて!ExcelVBA!

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

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

構文

構文は以下の通りです。

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

解説

UserForm_QueryCloseイベントは、UserForm(ユーザーフォーム)が閉じられる際に発生するイベントです。このイベントは、ユーザーフォームが閉じられる前に特定のアクションを実行するために使用されます。具体的には、UserFormが閉じられる前にユーザーに確認メッセージを表示したり、フォームを閉じる操作を中止したりすることができます。UserForm_QueryCloseイベントには引数があります。

引数 内容
Cancel この引数を使用してユーザーフォームの閉じる操作を中止するかどうかを制御します。「True」に設定することによって、フォームの閉じる操作を中止し、「False」に設定することによってフォームを閉じます。
CloseMode フォームがどの方法で閉じられたかを示す値を格納します。この値によって、フォームの閉じられ方を判別できます。幾つかの値が格納されますが、フォームの [×]ボタンをクリックした場合や、システムメニューの[閉じる]を選択した場合などには、「vbFormControlMenu」が設定されます。

使い方

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

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

まとめ

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