Office VBA: 自動実行マクロ

Office VBA では、いくつかのオブジェクトにイベントが定義されている。例えば Excel ではApplication、Workbook、Worksheet の各オブジェクトでイベントが定義されており、「ファイルが開かれた時にフォームを表示させる」といった記述ができる。
一方、イベントという枠組みとは別に、特定のタイミングで「自動実行」されるマクロを書く方法がある。

Word の自動実行マクロ

名称 タイミング
AutoExec Word 起動時、全文書対象のテンプレートが読み込まれた時
AutoNew 文書が新規作成された時
AutoOpen 既存の文書が開かれた時
AutoClose 文書が閉じられた時
AutoExit Word 終了時、全文書対象のテンプレートが読み込み解除された時

Word の場合、以下のいずれかの方法で自動実行マクロを定義することができる。

  • 上記の名前の標準モジュールを作り、その中に Main という名前のプロシージャを作る
  • 適当な名前の標準モジュールを作り、その中に上記の名前のプロシージャを作る

テンプレートと開いた文書の両方に AutoOpen があったらどうなるのか、といった細かいルールは、以下のヘルプトピックに記載されている (Word 2002)。

  • Microsoft Word Visual Basic ヘルプ
    • プログラミングコンセプト
      • マクロを使う
        • 自動実行マクロ」

Excel の自動実行マクロ

名称 タイミング
Auto_Open 既存のブックが開かれた時
Auto_Activate ブックがアクティブになった時
Auto_Deactivate ブックがアクティブでなくなった時
Auto_Close ブックが閉じられた時

Excel では、以下の方法で自動実行マクロを定義することができる。

  • 適当な名前の標準モジュールを作り、その中に上記の名前のプロシージャを作る

Excel 2002 のヘルプには、自動実行マクロについての説明が見つからなかった。関連するサポート技術情報としては、以下のものが見つかった。

213532 - [XL2000]Application.Quit を使用すると Auto_Close が実行される
http://support.microsoft.com/default.aspx?scid=kb;ja;213532

PowerPoint の自動実行マクロ

名称 タイミング
Auto_Open 既存のブックが開かれた時
Auto_Close ブックが閉じられた時

PowerPoint では、以下の方法で自動実行マクロを定義することができる。

  • 適当な名前の標準モジュールを作り、その中に上記の名前のプロシージャを作る

PowerPoint 2002 のヘルプには、自動実行マクロについての説明が見つからなかった。関連するサポート技術情報としては、以下のものが見つかった。

909079 - PowerPoint 2002 のアドイン内の Auto_Open で Application.Quit を実行するとアプリケーションが異常終了する
http://support.microsoft.com/default.aspx?scid=kb;ja;909079
163461 - [PP97] アドインを作成する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;163461

自動実行マクロの用途

引用したサポート技術情報のタイトルにもちらちら見えているが、Microsoft 的には、これらの自動実行マクロの主な用途はアドインの作成、らしい。「らしい」というのは、実際には、「Excel VBA で簡易アプリケーションを作成するときに、Auto_Open でフォームを表示する」といった使い方も多く見られるためだ。
アドインの作成については、下記のページに解説があり、その中に自動実行マクロの利用例も載っている。

Microsoft Office XP Developer - アプリケーション固有のアドインを作成する
http://www.microsoft.com/JAPAN/developer/library/modcore/deovraddingremovingcommandbarsforwordexcelpowerpointaddins.htm

なお、この解説ページによれば、同じ Office アプリケーションでも、Access はアドインの作成方法がまったく違うものになっており、したがって自動実行マクロという機能もない。

定義が重複した場合の注意

自動実行マクロを使う場合、同じ種類の自動実行マクロが複数の場所に定義すると、罠にはまる場合がある。

  • Word で、文書とテンプレートの両方に AutoOpen があると、テンプレート側の AutoOpen は呼び出されない
  • Word で、文書に関連付けられたテンプレートと標準テンプレートの両方に AutoNew があると、標準テンプレートの AutoNew は呼び出されない。
  • ひとつのファイル内で同じ自動実行マクロを複数作ると、エラーになる

他のコードと絡む場合の注意

自動実行マクロは、オブジェクトモデルに定義されたイベントと、役割が近いことがある。例えば、Excel の Auto_Open は、Workbook オブジェクトの Open イベントに似ている。両方定義するような場合には、どちらが先に実行されるのかを確認しておいた方がよさそう。
また、他の処理がトリガーとなって自動実行マクロが実行されるような場合には、記述した自動実行マクロが正常に処理されるか注意する必要もある (上記で引用したサポート技術情報 909079 あたり)。
例えば、下記の解説ページでは、Excel で Application.Quit メソッドを呼び出した場合の様子が調査されている。

Excel でお仕事! - Application.Quitの誤解
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html

別プログラムからファイルを開いたときの注意

他のプログラムからファイルを開いた場合は、自動実行マクロは呼び出されない。具体的には、

  • 別の Office ファイルから、VBA 経由でファイルを開いた (例えば、Excel VBA から Workbooks.Open を使って別のブックを開いた場合)
  • 別のアプリケーションから、COM 経由でファイルを開いた (例えば、VB のプログラムから Excel.Application を生成し、Application.Workbooks.Open を使って Excel ファイルを開いた場合)

こういった場合には、開いた側から Appliction オブジェクトの RunAutoMacro メソッドを呼び出せば、手動で実行させることはできる (ただし、Word と Excel のみ)。
また、こういった場合でもイベント (Excel なら Workbook オブジェクトの Open イベント、Word なら Document オブジェクトの Open イベント) は有効なので、イベントハンドラに処理を移せば、上記のような場合にも処理を実行させることができる。
ちなみに、

  • Office 自体を介さずにファイルを開いた場合 (例えば、Jet や Excel ODBC Driver で Excel ファイルを開いた場合や、Jakarta POI を使ってファイルを開いた場合)

というパターンもある。この場合どうなるかは各アプリケーションの実装によるが、たいていの場合は、自動実行マクロもイベントハンドラも無視されることになりそう。