和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Workbook_OpenとAuto_Openの違い

Workbook_Openイベントと、
Auto_Openプロシージャの違いを解説します。

同じところ

どちらも「ブックを開いた際にマクロを自動実行する」仕組みです。

以下のコードはどちらもブックを開いた際にメッセージを表示します。

Private Sub Workbook_Open()
    MsgBox "ブックが開かれました。"
End Sub
Sub Auto_Open()
    MsgBox "ブックが開かれました。"
End Sub

 
と、「ブックを開いた際に実行」と説明しましたが、
実際には「マクロの有効化」を行った直後に実行されることになります。

マクロの有効化オプション


厳密に「ブックを開いた直後」に実行することはできない点も、
どちらのプロシージャも同じ仕様になっています。

違うところ

まずはコードを記載するところが違います。


Workbook_Openはイベントプロシージャであるため、
ThisWorkbookモジュールに記載する必要があります。

対してAuto_Openプロシージャは特殊な(昔の)機能で、
標準モジュール内に記載しないと動きません。
(ThisWorkbookモジュールでは動かない)


続いての違いは「マクロからブックを開いたときの挙動」で、
Workbook_Openはマクロから開いても実行されるのに対し、
Auto_Openはマクロから開いた場合は実行されません。

' Workbook_Openは実行されるがAuto_Openは実行されない。
Workbooks.Open "~~\○○.xlsm"

 
最後は「両方とも記載した場合の挙動」で、
両方記載した場合はまずWorkbook_Openが先に実行され、
その後にAuto_Openが実行されます。

使い分け

基本的にWorkbook_Openを使用しておけばOKです。

両者に機能面での差はありませんので、
重要なのはコードのわかりやすさや管理のしやすさになります。


となると「他のイベントプロシージャ同様ThisWorkbookに書ける」という点で、
Workbook_Openの方が圧倒的にわかりやすく管理もしやすいですね。


Auto_Openは標準モジュールのどこにでも書けるためどこにあるかがわかりづらく、
Open時の処理があることも一目ではわかりません。


Auto_Openを使用するのは、

  • マクロからブックを開いた場合は発火しないイベントを実装したい
  • 標準モジュールで作るライブラリ・アドインの一部に組み込みたい

あたりの特殊な仕様を実装したいときだけと捉えておけばOKです。