教えて!ExcelVBA!

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

ExcelVBAでフォームを閉じる直前に自動処理する方法

構文

構文は以下の通りです。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' 処理内容をここに書きます
End Sub

解説

UserForm_QueryCloseは、ユーザーフォームが閉じられる直前に実行されるイベントです。このイベントを使って、フォームが閉じられる直前に何か特定の処理を自動的に行うことができます。Cancelは、閉じる動作をキャンセルするかどうかを制御します。Cancel = Trueにすると、フォームは閉じられません。CloseModeは、フォームがどのように閉じられたかを示します。例えば、vbFormControlMenuは、フォームの[×]ボタンが押されたことを意味します。

【CloseModeの種類】

定数 内容
vbFormControlMenu 0 フォームの[×]ボタンがクリックされて閉じられた場合
vbFormCode 1 コードからフォームが閉じられた場合
vbAppTaskManager 2 タスクマネージャーからフォームが終了させられた場合
vbFormMDIForm 3 MDI親フォームが閉じられた場合

プログラミング例

具体的なプログラミング例を紹介します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim 確認 As Integer
    確認 = MsgBox("本当にこのフォームを閉じますか?", vbYesNo + vbQuestion, "確認")
    If 確認 = vbNo Then
        Cancel = True
        MsgBox "フォームの閉じる動作がキャンセルされました。", vbInformation
    Else
        ' 必要な自動処理をここに追加
        MsgBox "フォームを閉じる前に自動処理が実行されました。", vbInformation
    End If
End Sub

上記のプログラムでは、ユーザーがフォームを閉じようとしたときにメッセージボックスを表示し、「いいえ」が選ばれた場合はフォームの閉じる動作をキャンセルします。逆に「はい」が選ばれた場合は、フォームを閉じる前に自動処理を行います。

まとめ

UserForm_QueryCloseイベントは、ユーザーフォームが閉じられる直前に実行されるため、フォームを閉じる前に何かを確認したり、特定の処理を行うために非常に便利です。Cancel引数を使って、フォームの閉じる動作をキャンセルできるため、ユーザーの誤操作を防ぐことができます。