教えて!ExcelVBA!

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

【ExcelVBA フォーム&コントロール】フォームを閉じる直前に処理を実行する方法を教えて!

構文

構文は以下の通りです。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' ここに処理を追加する
End Sub

解説

QueryCloseイベントは、フォームが閉じられる直前に発生するイベントであり、通常はユーザーがフォームを閉じる操作を行ったときにトリガーされます。このイベントを利用することで、フォームを閉じる前に特定の処理を行うことができます。

引数 内容
Cancel イベントが終了する前に設定できる特殊な変数です。Trueを設定するとフォームの閉じる処理がキャンセルされ、フォームが閉じられません。逆に、Falseを設定すると、フォームの閉じる処理が続行されます。
CloseMode

フォームがどのように閉じられたかを示す整数値です。主な値を以下で紹介します。

フォームの閉じられたかを示す整数値は以下の通りです。

定数 内容
vbFormControlMenu 0 フォームが通常の方法で閉じられたことを示します。
(例:[X]ボタンをクリック)
vbFormCode 1 フォームがVBAコードによって閉じられたことを示します。
vbAppWindows 2 フォームがWindowsオペレーティング環境セッションによって閉じられたことを示します。
vbAppTaskManager 3 フォームがWindowsタスクマネージャーによって閉じられたことを示します。

使い方

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

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        ' [x] ボタンが押された場合は閉じる動作をキャンセルする
        Cancel = 1
        MsgBox "閉じるボタンを使用してください。", vbExclamation, "操作エラー"
    End If
End Sub

これでフォームを閉じる際に、入力内容を保存するかどうかを確認するメッセージボックスが表示されるようになります。また、[x] ボタンをクリックして閉じようとした場合は、閉じる動作がキャンセルされ、代わりに「閉じるボタンを使用してください。」というエラーメッセージが表示されます。

プログラミング例

以下に、プログラミング例を紹介します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim response As VbMsgBoxResult
    ' ユーザーに保存するか確認するメッセージボックスを表示
    response = MsgBox("変更を保存しますか?", vbQuestion + vbYesNoCancel, "保存の確認")
    Select Case response
        Case vbYes ' 保存する
            ' 保存処理を実行
            ' SaveDataToFile
        Case vbNo ' 保存しない
            ' 何もしない
        Case vbCancel ' キャンセル
            ' フォームの閉じる処理をキャンセル
            Cancel = True
    End Select
End Sub

この例では、フォームが閉じられる直前に「変更を保存しますか?」というメッセージボックスを表示し、ユーザーがYes、No、またはCancelを選択することができます。Yesを選択した場合は保存処理を実行し、Noを選択した場合は何もしないでフォームを閉じます。Cancelを選択した場合はフォームの閉じる処理をキャンセルしてフォームが閉じないようにします。

まとめ

QueryCloseイベントを利用することで、フォームを閉じる直前に特定の処理を追加することができます。これは、データの保存確認や編集内容の確認など、重要な処理を実行する場合に非常に便利です。是非活用してください。