VBA(Visual Basic for Applications)では、「Workbookイベント」を利用することで、Excelブック全体に対する操作やアクションに応じた処理を自動化することができます。Workbookイベントは、特定のワークブックを開いたとき、保存したとき、印刷したときなどに発生し、それらに対応するプロシージャを記述することで、高度な自動化が実現できます。
◆ Workbookイベントとは?
Workbookイベントは、Excelブック(.xlsmなど)のライフサイクル(開く、閉じる、保存、印刷など)やユーザー操作(シートの切り替え、アクティブ化など)に反応して、自動的にVBAコード(Subプロシージャ)を実行させる仕組みです。
代表的な使用例:
- ファイルを開いた瞬間に初期設定を行う
- 保存前に入力チェックを実施する
- ブックが閉じられるときに自動バックアップを作成する
- シート移動時に権限チェックを行う
◆ 記述場所(Workbookイベントを書く場所)
Workbookイベントは、ThisWorkbookモジュールに記述します。標準モジュールでは機能しません。
手順:
- ExcelでAlt + F11を押してVBAエディタを起動。
- 左の「Microsoft Excel Objects」から「ThisWorkbook」をダブルクリック。
- 上部のドロップダウンで「Workbook」を選択すると、右側に選べるイベント一覧が表示されます。
◆ 主なWorkbookイベント一覧と用途
イベント名 | 説明 |
---|---|
Workbook_Open | ブックが開かれたときに実行 |
Workbook_BeforeClose | ブックが閉じられる直前に実行(キャンセル可能) |
Workbook_BeforeSave | 保存直前に実行(キャンセル可能) |
Workbook_SheetActivate | シートがアクティブになったときに実行 |
Workbook_SheetDeactivate | シートが非アクティブになったときに実行 |
Workbook_SheetChange | シート内のセルが変更されたときに実行 |
Workbook_NewSheet | 新しいシートが挿入されたときに実行 |
Workbook_SheetSelectionChange | シートでセルの選択が変更されたときに実行 |
Workbook_BeforePrint | 印刷が行われる直前に実行(キャンセル可能) |
Workbook_Deactivate | ブックから別のブックに移動したときに実行 |
Workbook_Activate | ブックがアクティブになったときに実行 |
◆ 各イベントの使用例と解説
1. Workbook_Open
Excelブックを開いた直後に実行されます。
Private Sub Workbook_Open()
MsgBox "ブックが開かれました。"
Sheets("ホーム").Activate
End Sub
用途:
- 初期化処理
- セルやシートの保護
- ログ記録の開始
2. Workbook_BeforeClose
ブックが閉じられる直前に実行され、キャンセル可能です。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("本当に閉じますか?", vbYesNo) = vbNo Then
Cancel = True
End If
End Sub
用途:
- 保存確認
- 閉じるのを条件付きで制限
- ログ保存・バックアップ作成
3. Workbook_BeforeSave
保存直前に実行され、保存処理を中止することも可能です。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Sheets("入力").Range("A1").Value = "" Then
MsgBox "A1が空白です。保存できません。"
Cancel = True
End If
End Sub
4. Workbook_SheetActivate / Workbook_SheetDeactivate
シートの切り替え時に処理を行うイベントです。
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name & " シートがアクティブになりました"
End Sub
5. Workbook_SheetChange
任意のシート内でセル内容が変更されたときに反応します。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Column = 1 Then
MsgBox "A列が変更されました: " & Target.Address
End If
End Sub
注意:
- ワークシート単位ではなく、全シートを対象に動作。
6. Workbook_BeforePrint
印刷直前にカスタム処理を行います。
Private Sub Workbook_BeforePrint(Cancel As Boolean)
MsgBox "印刷前に最終確認をお願いします。"
End Sub
7. Workbook_NewSheet
新しいシートが追加された瞬間に実行されます。
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox "新しいシートが作成されました:" & Sh.Name
End Sub
◆ 応用例:Workbookレベルのセキュリティ・監視
- シート切り替え時にユーザー名を記録
- シート追加を検知して権限をチェック
- 保存前に自動バックアップを実行
- 閉じる際に自動送信やログ出力
◆ イベントの制御:Application.EnableEvents
Workbookイベント内でセル操作などを行うと、他のイベントが連鎖的に発生する場合があります。無限ループや想定外の動作を防ぐため、Application.EnableEvents
を使ってイベントを一時的に無効化します。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
' セル書き換えなど
Application.EnableEvents = True
End Sub
◆ 注意点
- イベントは「ThisWorkbook」に書く必要がある。
- イベントが複雑化するとパフォーマンス低下を招く。
- エラーが出てもイベントは無効になったままになることがあるので、エラーハンドリングが重要。
Application.EnableEvents
の使い忘れに注意(イベント停止のままになる)。
◆ まとめ
Workbookイベントは、Excelブック全体に対する操作に反応して、自動的に処理を実行できる非常に強力な仕組みです。システム的な初期化処理、ユーザー操作の制御、データ保全の補助など、業務効率化や品質保証に役立ちます。
項目 | 説明 |
---|---|
使用場所 | 「ThisWorkbook」モジュール |
トリガー | ブックの開閉、保存、印刷、シート操作など |
主なイベント | Workbook_Open , BeforeClose , BeforeSave など |
用途例 | 初期化、保存チェック、セキュリティ監視、自動通知など |
注意点 | EnableEvents の適切な使用、標準モジュールには不可 |