入力フォームや申請書としてExcelファイルを使っている際、「ユーザーが特定のセルへの入力を忘れたまま、ファイルを閉じてしまう」のを防ぎたい、という場面があります。
VBAの**Workbook_BeforeClose
イベントを利用すれば、ブックが閉じられる直前に最終チェックを行い、条件を満たさない場合はクローズ処理をキャンセル**して、ユーザーに入力を促す、といった制御が可能です。
この記事では、この「最後の関所」とも言えるイベントの基本的な使い方を解説します。
【重要】コードを記述する場所
このコードは、ブック全体の動作(今回は「閉じる」)を監視するイベントマクロであるため、ThisWorkbook
モジュールに記述する必要があります。
- Excelで
Alt
+F11
キーを押し、VBE(Visual Basic Editor)を開きます。 - 画面左側の「プロジェクトエクスプローラー」から、**
ThisWorkbook
**をダブルクリックします。 - 表示された右側の白いコードウィンドウに、以下のコードを貼り付けてください。
完成したVBAコード
以下が、「入力フォーム」シートのセルC5
が空欄の場合、ブックを閉じるのをキャンセルするVBAコードです。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' 変数を宣言します
Dim validationSheet As Worksheet
Dim requiredCell As Range
' チェック対象のシートとセルを設定
Set validationSheet = ThisWorkbook.Worksheets("入力フォーム")
Set requiredCell = validationSheet.Range("C5")
' --- 必須項目の入力チェック ---
' もしチェック対象のセルが空欄だったら
If IsEmpty(requiredCell.Value) Then
' 1. ユーザーにメッセージを表示
MsgBox "ブックを閉じる前に、セル「" & requiredCell.Address(False, False) & "」に氏名を入力してください。", _
vbExclamation, _
"入力が必要です"
' 2. 対象のシートとセルに移動して入力を促す
validationSheet.Activate
requiredCell.Select
' 3. ブックを閉じる処理をキャンセルする
Cancel = True
End If
End Sub
コードのポイント解説
① Workbook_BeforeCloseイベント
Private Sub Workbook_BeforeClose(Cancel As Boolean)
この特別なプロシージャは、ユーザーがウィンドウ右上の「×」ボタンをクリックしたり、「ファイル」>「閉じる」を選択したりして、ブックを閉じようとしたまさにその瞬間に、Excelによって自動的に呼び出されます。
② Cancel As Boolean 引数(核心部分)
このイベントが持つ引数Cancel
が、処理を中断させるための鍵となります。
- **
Cancel
**は、Excelから「このままブックを閉じて良いですか?」という意思表示を受け取るための変数(フラグ)です。 - イベント開始時点では、
Cancel
の値はFalse
(=閉じても良い)になっています。 - コードの中で**
Cancel = True
と設定すると、それは「待った!このブックを閉じるのはキャンセルします!」**という命令になり、Excelはクローズ処理を中断します。
③ 条件チェックとユーザーへのフィードバック
If IsEmpty(requiredCell.Value) Then
MsgBox "..."
requiredCell.Select
Cancel = True
End If
If
文で必須項目(requiredCell
)が空かどうかをチェックし、空であった(条件を満たさなかった)場合にのみ、以下の3つのアクションを実行しています。
MsgBox
: なぜ閉じられないのかをユーザーに伝えます。requiredCell.Select
: ユーザーがすぐに入力できるよう、該当セルにカーソルを移動させます。Cancel = True
: ブックが閉じてしまうのを防ぎます。
まとめ
Workbook_BeforeClose
イベントを利用して、ブックが閉じられるのを防ぐ手順は以下の通りです。
- **
ThisWorkbook
**モジュールにWorkbook_BeforeClose
プロシージャを作成する。 - プロシージャ内で、ファイルの保存条件(必須項目の入力チェックなど)を**
If
文で判定**する。 - 条件を満たさない場合に、
MsgBox
でユーザーに修正を依頼し、最も重要な命令である**Cancel = True
**を実行してクローズ処理を中断させる。
この仕組みは、ファイルの運用ルールを徹底させ、記入漏れなどのヒューマンエラーを防ぐための非常に強力なガード機能となります。