入力用シートを作成した際、「ユーザーが必須項目を記入し忘れたまま、他のシートに移動してしまうのを防ぎたい」という場面があります。
VBAの**Worksheet_Deactivate
イベント**を使えば、特定のシートからフォーカスが外れた(=ユーザーが別のシートを選択した)瞬間を検知して、入力チェックなどの処理を自動で実行できます。
この記事では、この「シートから離れる時」というタイミングを捉えて、入力漏れをユーザーに知らせる方法を解説します。
【重要】コードを記述する場所
このコードは、特定のシートの動作を監視するイベントマクロであるため、**チェックを行いたいシートの「シートモジュール」**に記述する必要があります。
- Excelで
Alt
+F11
キーを押し、VBE(Visual Basic Editor)を開きます。 - 画面左側の「プロジェクトエクスプローラー」から、チェック処理を埋め込みたいシート(例:
Sheet1 (入力フォーム)
)をダブルクリックします。 - 表示された右側の白いコードウィンドウに、以下のコードを貼り付けてください。
完成したVBAコード
以下が、「入力フォーム」シートのセルC5
が空欄のまま、ユーザーが他のシートへ移動しようとした場合に、メッセージを表示して入力を促すVBAコードです。
' Sheet1 (入力フォーム) のシートモジュールに記述します
Private Sub Worksheet_Deactivate()
' --- 必須項目の入力チェック ---
' Meキーワードは、このコードが書かれているシート自身を指します
If IsEmpty(Me.Range("C5").Value) Then
' 1. 対象のセルに移動して、ユーザーの注意を引く
Application.GoTo Me.Range("C5")
' 2. ユーザーにメッセージを表示
MsgBox "シートを移動する前に、セル「C5」に担当者名を入力してください。", _
vbExclamation, _
"入力が必要です"
End If
End Sub
コードのポイント解説
① Worksheet_Deactivateイベント
Private Sub Worksheet_Deactivate()
この特別なプロシージャは、このコードが記述されているシートがアクティブでなくなった瞬間に、Excelによって自動的に呼び出されます。ユーザーが他のシートのタブをクリックしたり、別のブックのウィンドウをアクティブにしたりしたタイミングで実行されます。
② Me キーワード
If IsEmpty(Me.Range("C5").Value) Then
シートモジュール内で**Me
というキーワードを使うと、「このコードが書かれているシート自身」**を指すことができます。Worksheets("入力フォーム")
のようにシート名を直接書くよりも簡潔で、ユーザーがシート名を変更してもコードが影響を受けないという利点があります。
③ ユーザーへのフィードバック
Application.GoTo Me.Range("C5")
MsgBox "..."
もし必須項目が未入力であった場合、Application.GoTo
でユーザーのカーソルを強制的に入力が必要なセルに移動させ、MsgBox
で何を入力すべきかを伝えることで、スムーズな入力を促します。
この方法の限界
Deactivate
イベントには、BeforeClose
イベントなどが持つCancel
引数がありません。そのため、このイベントでユーザーが他のシートへ移動することを完全に禁止することはできません。
あくまで、メッセージを表示して入力を「お願いする」ことしかできませんが、ユーザーの入力漏れを減らすためのリマインダーとしては非常に有効な機能です。
まとめ
Worksheet_Deactivate
イベントは、特定のシートからユーザーが離れる際の「出口チェック」として機能します。
- チェックしたいシートのシートモジュールに
Worksheet_Deactivate
プロシージャを作成する。 Me
キーワードを使って、自シート内のセルの状態をチェックする。- 条件を満たさない場合に、**
MsgBox
やApplication.GoTo
**でユーザーに入力を促す。
このイベントを活用することで、入力フォームなどの操作性を向上させ、データの入力漏れを防ぐ仕組みを構築できます。