Application.EnableEvents
は、Excel VBA における Application
オブジェクトの イベント(Workbook_Open、Worksheet_Change など)を有効または無効にするプロパティです。マクロ実行中にイベントがトリガーされるのを防ぎたいときに非常に有用です。
🔷 基本構文
Application.EnableEvents = False ' イベントを無効化
Application.EnableEvents = True ' イベントを再度有効化
🔷 何のために使うのか?
✅ 主な目的は「マクロ中のイベント暴走の防止」
Worksheet_Change
などのイベントプロシージャが、マクロの変更によって 意図せず再び発火することを防ぐ
- 再帰的にイベントが繰り返される事態(無限ループ)を回避
- 処理速度の最適化:イベントのトリガーを止めることで、余計なイベント処理を減らす
🔷 使用例①:セル変更イベントの再帰防止
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo 終了処理
Application.EnableEvents = False ' ここでイベント停止
' イベント中にセルを変更
If Not Intersect(Target, Range("A1")) Is Nothing Then
Range("B1").Value = "変更されました"
End If
終了処理:
Application.EnableEvents = True ' 忘れずに再有効化
End Sub
🔷 使用例②:マクロ全体で一時的にイベント無効化
Sub 大量変更処理()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
' イベント発火を気にせずセル変更
Range("A1:A1000").Value = "処理中"
' 各種設定を戻す
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub
🔷 よく使われるイベント例(止める対象)
イベントプロシージャ | 説明 |
---|
Workbook_Open | ブックを開いた時 |
Workbook_SheetChange | シートが変更されたとき |
Worksheet_Change | セルの値が変更されたとき |
Workbook_BeforeClose | ブックを閉じる前 |
🔷 注意点・落とし穴
項目 | 内容 |
---|
False にしたまま終了するとイベントが動作しなくなる | マクロ終了前に必ず True に戻す |
エラーで途中終了しても元に戻らないことがある | On Error で必ず EnableEvents = True を保証すること |
グローバル設定 | Application.EnableEvents はすべてのブック・シートに影響する |
🔷 安全なテンプレート(エラー対応付き)
Sub 安全なイベント制御マクロ()
On Error GoTo エラー処理
Application.EnableEvents = False
' ここに処理を書く
Range("A1").Value = "イベント無効中に書き込み"
正常終了:
Application.EnableEvents = True
Exit Sub
エラー処理:
MsgBox "エラー発生: " & Err.Description
Resume 正常終了
End Sub
🔷 他の制御系プロパティとの組み合わせ
プロパティ | 目的 |
---|
Application.ScreenUpdating = False | 画面更新を停止(高速化) |
Application.Calculation = xlCalculationManual | 再計算を手動化(高速化) |
Application.EnableEvents = False | イベント発火を停止(暴走防止) |
これらをまとめて制御すると、高速で安全な処理が実現できます。
🔷 まとめ
項目 | 内容 |
---|
プロパティ名 | Application.EnableEvents |
型 | Boolean(True / False) |
既定値 | True (イベントは通常有効) |
目的 | マクロ実行中のイベント発火を一時停止 |
使用例 | Application.EnableEvents = False |
注意点 | マクロ終了前に必ず True に戻すこと |
✅ よくある使い方(定型パターン)
Sub マクロ処理()
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
' 重たい処理
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub