VBA Workbook_OpenとAuto_Openの違い

スポンサーリンク

UserFormPW設定ツール」を Excelブックの起動時に自動実行させたかったのでその方法を調べました。Workbook_OpenAuto_Open の二つの方法がありましたが、その違いについて検証しました。

くるみこ
くるみこ

Workbook_Open」と「Auto_Open」の二つの方法の違いについて勉強しましょう(^^)/

今回は UserForm「PW設定ツール」をブックを開いたときに実行させる方法の検証ということですが、いったいどんな違いがあるんでしょうか。よろしくお願いしますm(__)m

【この記事でわかること
・Workbook_Openイベントプロシージャの使用方法がわかります
・Auto_Openプロシージャの使用方法がわかります

・二つの違いがわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は「PW設定ツール」の設定データ保存時に登録日時を追加するように追加設定しました。あわせて「設定シート」からも登録データを削除できるように調整しました。是非覗いてみてね(^^)/

スポンサーリンク

Workbook_Open と Auto_Openの違い

・どちらも、Excelブックを開いたときにVBAマクロを実行させるために用意されています。
Auto_Open は互換性を保持するために残っている(古い)方法のようです。
Workbook_OpenイベントプロシージャはExcel5.0のころにはまだなかったようです。
・というわけで「Workbook_Open」の方が新しいということです。

・「Workbook_Open」「Auto_Open」の両方が設定されていた場合は「Workbook_Open」が先に実行され「Workbook_WindowActivate」の次に「Auto_Open」が実行されます。

Workbook_Open と Auto_Open を比較します

モジュール名プロシージャ名動作等の説明
ThisWorkbookWorkbook_Openワークブックを開くときに発生するイベント
※Application.EnableEvents=False状態では実行されない
(これは他のブックからVBAで起動させる場合です)
標準モジュールAuto_Open起動時に自動実行されます
※Application.EnableEvents=False状態でもイベント
 ではないので実行されます

※どちらも引数・戻り値はありません。
※表内の「Application.EnableEvents」は他のブックなどから起動された場合を指します。
※「Auto_Open」を他ブックからの起動で実行させるには、実行を指定する必要があります。
  【起動例】Application.Run “SampleBook.xlsm!Auto_Open”
※実行順は「Workbook_Open」が優先実行されます。

「Workbook_Open」の使用例

・「Workbook_Open」イベントは「ThisWorkbook」のモジュールにあります。

UserForm を起動させるだけの簡単な例

Private Sub Workbook_Open()
    fmPW_Make.Show
End Sub

・特定のシートを表示させるようにしたり、特定のセルに何かを書き込むようにしたりなど、利用方法はいろいろ考えられます。
・では次の例では、条件によって起動させるようにしてみます。

条件によって UserForm を起動させる例

Private Sub Workbook_Open()
    If Worksheets("設定値").Range("A12") = 1 Then
        fmPW_Make.Show
    End If
End Sub

・ワークシートのセルの値によって起動させるかどうかを設定している例です。
・Range(“A12”) = 1 ならば UserForm を起動します。

「Workbook_Open」をステップ実行したい場合

・「Workbook_Open」「Aut_Open」のデバッグでステップ実行させて動作確認を行いたい場合、ブレイクポイントは設定できないんですよね。(それは、ブレイクポイントを設定しておいても、ブックを閉じてしまえば ブレイクポイント設定は解除されてしまうからです
・そんな場合は、Stopステートメントを使いましょう

Workbook_Open」をデバッグしたい場合の例

'こんな感じにすれば自動起動を制御できるか検証したい
Private Sub Workbook_Open()
    Stop   'ここで実行がストップしてVBEが開きます!
    If Worksheets("設定値").Range("A12") = 1 Then
        fmPW_Make.Show
    End If
End Sub

Stopステートメントで、コード実行がストップしてVBEが開きデバッグ状態になります。
※確認が終わったら、Stopステートメントは削除するかコメントアウトしてね(^^;

「Auto_Open」の使用例

・「Workbook_Open」と書き方は同じです。
・標準モジュールの「Sub Auto_Open()」プロシージャを作成してコードを入れます。

Sub Auto_Open()
    Stop   'ここで実行がストップしてVBEが開きます!
    If Worksheets("設定値").Range("A12") = 1 Then
        fmPW_Make.Show
    End If
End Sub

Stopステートメントで、コード実行がストップしてVBEが開きデバッグ状態になります。
※確認が終わったら、Stopステートメントは削除するかコメントアウトしてね(^^;
・「Workbook_Open」に Stopステートメントがあった場合は「Auto_Open」が実行されませんでした。
Stopステートメントで一旦実行が中断されると Auto_Open が実行されないので注意!

どちらの方法を使えばいいの?

・「Workbook_Open」と「Auto_Open」どちらを使ったら良いのでしょうか。
・特別な理由がないのであれば「Workbook_Open」を使用することをおすすめします。
・わたしが「Workbook_Open」の使用を推奨する理由を簡単に列挙して終わりにします。

  • Auto_Open」はバージョン互換性を保持のために残っている(古い)方法
  • Workbook_Open」の方が実行順が早い
  • Workbook_Open」の方が他ブックからの起動を制御しやすいと思う
    (Application.EnableEvents = False で制御)

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
今回の記事で使用したコードのサンプルファイルは登録していません!
・コードを利用したい場合は、コピペで対応してください。

まとめと感想など

互換性保持のために方法が二つある場合は、古いExcelで使用しないのであれば古い方は使わない方がいいということですか?

くるみこ
くるみこ

Excelブックの起動時にVBAマクロを自動実行させたい場合どうすればよいのかがわかりましたね。特別な理由が無ければ「Workbook_Open」イベントを使用するようにしましょう(^^)
互換保持は、何時まで保持が継続するかわからないですよね。突然互換されなくなったら困っちゃいますから、なるべく最新の方法を使うようにしましょう!

【今回わかったことは】
Workbook_OpenイベントプロシージャとAuto_Openプロシージャの使用方法の違いと注意点などがわかりました。

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回記事のサンプルファイルは登録していません
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください