Developer

【ExcelVBA】ブックのイベント①「Workbook_BeforeClose」
2022.01.13
Lv1

【ExcelVBA】ブックのイベント①「Workbook_BeforeClose」

ブックのイベント①「Workbook_BeforeClose」

ブックのイベントを利用したマクロを作成するには、VBEのプロジェクトエクスプローラーで「ThisWorkbook」をダブルクリックします。
今回は「Workbook_BeforeClose」を紹介します。

このイベントは、ブックを閉じようとしたときに必ず実行され、プロパティ(正確には引数)を操作することでその閉じようとした操作を取りやめることができます。
使用例としては、ブックが閉じられる前に保存済みか確認する(保存していなければ自動で上書き保存する)といったことや、特定の項目が入力されていない場合はブックを閉じれなくするといったことができるようになります。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    '' ここに処理を書く
End Sub

引数のCancelはこのブックを閉じるという処理をキャンセルするかどうかを表すフラグで、デフォルトではFalseとなっています。
プロシージャの中でTrueを設定することでブックを閉じる処理をキャンセルし、閉じようとした操作を取りやめることが可能となります。

サンプルプログラム

「Workbook_BeforeClose」イベントを使用したサンプルプログラムです。
これは簡単なアンケートフォームで名前とメールアドレス、フリー入力の意見を記入する欄があるExcelです。
このフォームに必要事項を入力してもらい、担当者あてにメール送付してもらうことを想定しています。

担当者はこのプログラムを作る上で、だれが記入したものかを確実に知る必要がありました。そこで、名前とメールアドレスを必須入力にしました。
また、保存し忘れを防ぐために自動保存する仕組みも取り入れることにしました。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    '' 名前は必須入力
    If Range("C3") = "" Then
        MsgBox "名前を入力して下さい。", vbExclamation
        Cancel = True
        Exit Sub
    End If
    
    '' メールアドレスは必須入力
    If Range("C4") = "" Then
        MsgBox "メールアドレスを入力してください", vbExclamation
        Cancel = True
        Exit Sub
    End If
    
    '' 上書き保存
    ActiveWorkbook.Save

End Sub

シートはこのようになります。

例えば、名前を未入力のままExcelを閉じようとすると、「名前を入力してください。」という警告がでてしまい閉じることができません。
メールアドレスに関しても同様に警告がでるようになっています。
プログラムを見ると、警告が出てしまった場合は「Cancel = True」となり、ブックを閉じる処理をキャンセルしていることがわかります。
「Exit Sub」と記述されている点にも注目してください。ここでプロシージャが終了し、以降の処理は実行されることはありません。

また、最後に「ActiveWorkbook.Save」と記述していることで仮に保存せずに閉じようとした場合も、自動的に上書き保存する仕組みとなっています。

まとめ

「Workbook_BeforeClose」はブックのイベントのうちの1つで、ブックを閉じる前に実行される
引数のCancelにTrueを設定することで閉じる操作を取りやめることができる

確認問題

次のプログラムはブックを閉じる前に実行されるイベントプロシージャです。
誤っている個所が2か所さがしてください。

Private Sub Workbook_AfterClose(Cancel As Integer)
    '' ここに処理を書く
End Sub
答え
[vb] Private Sub Workbook_BeforeClose(Cancel As Boolean)
” ここに処理を書く
End Sub
[/vb]

1.プロシージャ名が「After」ではなく「Before」が正しい
2.引数のCancelは「Boolean」型が正しい

次回は、引き続き「ブックのイベントについて」です。