【Excel VBA】Workbook_Openなどの自動実行マクロを無効にしてブックを開く方法

VBAで他のブックを開く際、そのブックにWorkbook_Openイベントが設定されていると、ファイルを開いた瞬間に意図せずそのマクロが実行されてしまいます。データを読み書きしたいだけなのに、メッセージボックスが表示されたり、想定外の処理が始まったりしては困ります。

この記事では、Application.EnableEventsプロパティを使い、こうしたイベントマクロを一時的に無効化して、安全にブックを開くための必須テクニックを解説します。


目次

Application.EnableEvents とは?

Application.EnableEventsは、Excelアプリケーション全体のイベント(Workbook_OpenWorksheet_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などのイベントを発生させずにブックを開くための、安全で確実な手順は以下の通りです。

  1. Application.EnableEvents = False でイベントを無効化する。
  2. On Error GoTo で、エラー発生時にも必ず処理が継続されるように設定する。
  3. 目的のブックを開く(Workbooks.Open)。
  4. 正常終了時もエラー発生時も、必ず Application.EnableEvents = True が実行されるよう、コードの出口(ExitRoutine)を設ける。

Application.EnableEventsは非常に便利な機能ですが、その影響範囲の広さから、必ずこのエラーハンドリングとセットで使うことを強くお勧めします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次