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は非常に便利な機能ですが、その影響範囲の広さから、必ずこのエラーハンドリングとセットで使うことを強くお勧めします。
【AI×就労支援】Neuro Dive(ニューロダイブ)で先端ITを学び、スペシャリストとしての就職を目指しませんか?
最後に宣伝をさせてください。
「AIやデータサイエンスを仕事にしたい」 「でも、独学には限界が…」
そんな方に知ってほしいのが、日本初の”先端IT特化型”就労移行支援『Neuro Dive』です。
IT職種への就職率80%超、職場定着率95%超という実績は、信頼の証。「学びたい」を「仕事」に繋げるプロフェッショナルです。
ご興味があれば、ぜひ公式サイトをチェックしてみてください。
