VBAで他のブックを開く際、そのブックにWorkbook_Open
イベントが設定されていると、ファイルを開いた瞬間に意図せずそのマクロが実行されてしまいます。データを読み書きしたいだけなのに、メッセージボックスが表示されたり、想定外の処理が始まったりしては困ります。
この記事では、Application.EnableEvents
プロパティを使い、こうしたイベントマクロを一時的に無効化して、安全にブックを開くための必須テクニックを解説します。
Application.EnableEvents とは?
Application.EnableEvents
は、Excelアプリケーション全体のイベント(Workbook_Open
やWorksheet_Change
など、何らかの操作をきっかけに自動実行されるマクロ)を有効にするか無効にするかを制御する、**「イベントのマスターイッチ」**のようなものです。
Application.EnableEvents = False
: すべてのイベントを一時的に無効にします。この状態では、ブックを開いてもWorkbook_Open
は実行されません。Application.EnableEvents = True
: イベントを再び有効にし、Excelを通常の状態に戻します。
このスイッチは非常に強力ですが、False
にした後、必ずTrue
に戻さないと、ボタンのクリックなどが効かなくなり、Excelが応答しなくなったように見えるため、取り扱いには注意が必要です。
完成したVBAコード(エラー処理を含む推奨パターン)
イベントを無効化する際には、万が一処理中にエラーが発生しても、必ずイベントを有効に戻すための**「エラーハンドリング」**を組み込むのが鉄則です。
Sub OpenBookWithEventsDisabled()
' 変数を宣言します
Dim bookToOpenPath As String
Dim openedBook As Workbook
' 開きたいブックのパスを指定
bookToOpenPath = ThisWorkbook.Path & "\EventDrivenWorkbook.xlsm"
' 念のため、ファイルの存在を確認
If Dir(bookToOpenPath) = "" Then
MsgBox "指定されたファイルが見つかりません。", vbExclamation
Exit Sub
End If
' --- 1. イベントを無効化 ---
Application.EnableEvents = False
' エラーが発生しても必ずイベントを有効に戻すための準備
On Error GoTo ErrorHandler
' --- 2. イベントを発生させずにブックを開く ---
Set openedBook = Workbooks.Open(bookToOpenPath)
'--- 開いた後の処理 ---
MsgBox "「" & openedBook.Name & "」をイベントを発生させずに開きました。"
openedBook.Close SaveChanges:=False
'----------------------
' --- 3. イベントを再度有効化(【重要】必ず実行される) ---
ExitRoutine:
Application.EnableEvents = True
Set openedBook = Nothing
Exit Sub
ErrorHandler:
' エラー発生時にここへジャンプし、メッセージを表示
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
' イベントを有効に戻すため、ExitRoutineへ進む
Resume ExitRoutine
End Sub
コードのポイント解説
① イベントの無効化: Application.EnableEvents = False
Application.EnableEvents = False
Workbooks.Open
など、イベントを発生させる可能性のある処理の直前にこのコードを記述します。これにより、Excelは「イベントのスイッチ」をオフにし、ブックを開いてもWorkbook_Open
などのマクロは実行されません。
② イベントの再有効化: Application.EnableEvents = True
ExitRoutine:
Application.EnableEvents = True
処理の最後に、必ずイベントをTrue
に戻します。 これを忘れると、マクロが終了した後もExcelのイベントが無効のままになり、手作業での操作に支障が出ます。
③ なぜエラーハンドリングが重要なのか?
On Error GoTo ErrorHandler
...
Resume ExitRoutine
もしWorkbooks.Open
の処理で「ファイルが見つからない」などのエラーが発生すると、通常はマクロがその場で停止してしまいます。すると、Application.EnableEvents = True
の行が実行されず、イベントはずっと無効のままになってしまいます。
On Error GoTo
構文を使ったエラーハンドリングを組み込むことで、処理が正常に終わった場合でも、途中でエラーが発生した場合でも、必ずExitRoutine:
以下の処理(イベントを有効に戻す処理)が実行されることを保証しています。これは、EnableEvents
を安全に使うための必須の構造です。
まとめ
Workbook_Open
などのイベントを発生させずにブックを開くための、安全で確実な手順は以下の通りです。
Application.EnableEvents = False
でイベントを無効化する。On Error GoTo
で、エラー発生時にも必ず処理が継続されるように設定する。- 目的のブックを開く(
Workbooks.Open
)。 - 正常終了時もエラー発生時も、必ず
Application.EnableEvents = True
が実行されるよう、コードの出口(ExitRoutine
)を設ける。
Application.EnableEvents
は非常に便利な機能ですが、その影響範囲の広さから、必ずこのエラーハンドリングとセットで使うことを強くお勧めします。