イベントを使用して Microsoft Word を制御する

 

Bill Coan
Microsoft Word MVP

2003 年 5 月

適用対象 :
   Microsoft® Word 2000 以降のバージョン

要約 : Microsoft Word MV Most Valuable Professional (MVP) である Bill Coan が、Word の動作を変更する方法について説明します。Application イベント プロシージャがこれを行うための最も強力で柔軟な方法ですが、その他の方法も有効です。そこで、簡単な方法から始めて、Application イベント プロシージャまでを説明します。

目次

はじめに
組み込みルーチンを置き換える
"自動" マクロを利用する
"Document イベント" プロシージャを作成する
"Application イベント" プロシージャの機能を理解する
イベント ハンドラをテストする
イベント ハンドラおよび Application オブジェクトの短い名前
Word 2002 以降でサポートされる Application イベント
Application イベント プロシージャの実用的な例
著者紹介

はじめに

Microsoft Word 開発者が今までに行ったことの中で最も賢明なことは、限界を認めて受け入れたことです (人は謙虚でなければなりません)。

開発チームは、自身を全知全能ですべてを制御するソフトウェア実力者と見なすことなく、最初からパワー ユーザーおよび個人開発者が Word の動作の仕方に関する独自の考えを持っていることを認識していました。そのため、開発チームは、Word の新しいリリースごとにパワー ユーザーおよび個人開発者が Word の動作を変更する新しい方法を提供してきました。

この記事では、最初に Word の動作を変更するための最も古くからある簡単な方法を簡潔に紹介します。次に、私たちのお気に入りの文書処理アプリケーションを制御するための最も新しい方法をいくつか説明します。

組み込みルーチンを置き換える

Word の動作を変更する方法の 1 つは、マクロを作成して Word の組み込みルーチンの代わりに実行することです。たとえば、Word には "FilePrint" という、ユーザーが [ファイル] メニューの [印刷] を選択した場合に実行される組み込みルーチンがあります。"FilePrint" というマクロを作成した場合、Word では組み込みルーチンの代わりにこのマクロが実行されます (同様の名前のマクロで上書きできる組み込みルーチンの一覧を表示するには、[ツール] メニューの [マクロ] をポイントし、[マクロ] をクリックします。[マクロ] ダイアログ ボックスで、[マクロの保存先] リストを [コマンド マクロ] に設定します)。

"自動" マクロを利用する

Word の動作を変更するもう 1 つの方法は、ユーザーが特定のテンプレートをベースにして新しい文書を作成するとき (または既存の文書を開く/閉じるとき) に自動的に実行される "自動" マクロを作成することです。さらに、Word が全文書対象のテンプレートをロードまたはアンロードしたときに自動的に実行される自動マクロを作成できます。次の表は、Word でサポートされている自動マクロと、各マクロがどのようなときに実行されるかの説明です。

自動マクロ 実行される場合
AutoNew 存在する場合は、ユーザーがマクロを含むテンプレートから新しい文書を作成したときに実行されます (注: 技術的には、これはこの記事の後で説明する Document_New イベントによって置き換えられたレガシー機能ですが、依然としてサポートされていて、今後もサポートされる予定です)。
AutoOpen 存在する場合は、ユーザーがマクロを含むテンプレートをベースとした既存の文書を開いたときに実行されます (注: これはこの記事の後で説明する Document_Open イベントによって置き換えられたレガシー機能ですが、依然としてサポートされていて、今後もサポートされる予定です)。
AutoClose 存在する場合は、ユーザーがマクロを含むテンプレートをベースとした既存の文書を閉じたときに実行されます (注: これはこの記事の後で説明する Document_Close イベントによって置き換えられたレガシー機能ですが、依然としてサポートされていて、今後もサポートされる予定です)。
AutoExec 存在する場合は、マクロを含むテンプレートが全文書対象でロードされたときに実行されます (注: Normal.dot は、Word の起動時に全文書対象でロードされます。Word の起動時に Word の Startup フォルダまたは Office の Startup フォルダに保存されているテンプレートも全文書対象でロードされます。さらに、テンプレートは [ツール] メニューの [テンプレートとアドイン] をクリックし、[追加] をクリックするか、[アドインとして使用できるテンプレート] の一覧でテンプレートを選択することによって全文書対象でロードできます)。
AutoExit 存在する場合は、全文書対象でロードされていたマクロを含むテンプレートがアンロードされるときに実行されます (全文書対象でロードされたテンプレートは、Word の終了時にすべてアンロードされます。さらに、全文書対象でロードされたテンプレートは、[ツール] の [テンプレートとアドイン] をクリックし、[アドインとして使用できるテンプレート] の一覧のテンプレート チェック ボックスをクリアすることによってアンロードできます)。

"Document イベント" プロシージャを作成する

Word 97 以降、文書に VBA (Visual Basic for Applications) コード プロジェクトを保存する機能が追加されたときに Word 文書と Word テンプレートとの区別がややあいまいになりました。この変更の最も重要な面は、文書とテンプレートの両方が "Document イベント" プロシージャ (たとえば、特定の文書に影響を与えるイベントが発生したときに自動的に実行されるプロシージャ) を保存する機能を持つようになったことです。次の表は、Word 97 以降の Word でサポートされている Document イベント プロシージャと、各プロシージャがどのようなときに実行されるかの説明です。

Document イベント プロシージャ 実行される場合
Document_New 存在する場合は、ユーザーがこのプロシージャを含むテンプレートから新しい文書を作成したときに実行されます (ユーザーが既存の文書から新しい文書を作成したときには実行されません。したがって、文書の VBA コード プロジェクトに Document_New プロシージャを保存しても意味がありません。代わりに、プロシージャは常にテンプレートの VBA コード プロジェクトに保存する必要があります)。
Document_Open 存在する場合は、ユーザーがこのプロシージャを含む文書を開いたとき、またはこのプロシージャを含むテンプレートに添付された文書を開いたときに実行されます (注: 文書に Document_Open プロシージャが含まれていて、その文書に添付されたテンプレートにも Document_Open プロシージャが含まれている場合、両方のプロシージャが 1 つずつ順番に実行されます。テンプレートに保存されているプロシージャが最初に実行され、その直後に文書に保存されているプロシージャが実行されます)。
Document_Close 存在する場合は、ユーザーがこのプロシージャを含む文書を閉じたとき、またはこのプロシージャを含むテンプレートに添付された文書を閉じたときに実行されます (注: 文書に Document_Close プロシージャが含まれていて、その文書に添付されたテンプレートにも Document_Close プロシージャが含まれている場合、両方のプロシージャが 1 つずつ順番に実行されます。テンプレートに保存されているプロシージャが最初に実行され、その直後に文書に保存されているプロシージャが実行されます)。

注: ユーザーが新しい文書を作成したとき、または既存の文書を開いた/閉じたとき、最初に文書に添付されたテンプレートにそのイベントに対するプロシージャが含まれているかどうかがチェックされます。含まれている場合は、そのプロシージャが実行されます。次に、文書自体にそのイベントに対するプロシージャが含まれているかどうかがチェックされます。含まれている場合は、そのプロシージャが実行されます (テンプレートと文書の両方にそのイベントに対するプロシージャが含まれている場合、両方のプロシージャが順番に実行されます。テンプレートにも文書にもプロシージャが含まれていない場合は、プロシージャは実行されずにユーザーのアクションが実行されます)。

重要: 自動マクロと比較した場合の Document イベント プロシージャの利点の 1 つは、テンプレートに保存された Document イベント プロシージャが文書に保存された Document イベント プロシージャと共存できることです。つまり、文書とそれに添付されたテンプレートの両方に、特定の Document イベントに対するプロシージャが含まれている場合、テンプレートに保存されていたプロシージャから順に両方のプロシージャが実行されます。自動マクロの場合は、両方のマクロが実行されることはありません。文書に AutoOpen マクロが含まれていて、それに添付されたテンプレートにも AutoOpen マクロが含まれている場合、文書に含まれているマクロのみが実行されます。

VBA プロジェクトに Document イベント プロシージャを保存する

VBA コード プロジェクトに Document イベント プロシージャを保存するために特別な準備は必要ありません。反対に、各 VBA コード プロジェクトには、それがテンプレートに属していても文書に属していても、既定で、Document イベント プロシージャを保存するために特別に設計された特殊なモジュール (ThisDocument と呼びます) が含まれています。そのようなモジュールで Document イベント プロシージャを保存する方法は、以下のとおりです。

  1. Word を起動し、プロシージャを保存する文書またはテンプレートを開きます (プロシージャをテンプレートに保存する場合、必要に応じて、テンプレート自体を開くのではなくそのテンプレートをベースにした文書を作成するか、開くことができます)。

  2. Alt キーを押しながら、F11 キーを押して、Visual Basic エディタを起動します。

  3. [プロシージャ エクスプローラ] ペイン (画面の左上) で、自身の文書またはテンプレートの VBA プロジェクトを探します。

    注: Word で開いている文書ごとに、その文書のプロジェクトと、その文書に添付されたテンプレートのプロジェクトがあります。イベント プロシージャを保存するプロジェクトが選択されていることを確認します。

  4. プロジェクトの横にプラス記号 (+) が表示されている場合、それをクリックしてプロジェクト ツリーを展開します。これによって、そのプロジェクトに Microsoft Word Objects の分岐が含まれていることがわかります。分岐の横にプラス記号が表示されている場合、それをクリックして分岐を展開します。これによって、そのプロジェクトの ThisDocument モジュールが表示されます。

  5. プロジェクトの ThisDocument モジュールをダブルクリックし、画面の右側の [コード] ペインにモジュールの内容を表示します。

  6. [コード] ペインの上部で、オブジェクト ドロップダウン リストをクリックして [Document] を選択します。次にプロシージャ ドロップダウン リストで [Close] をクリックし、[New] をクリックして、最後に [Open] をクリックします。これによって Document_Close、Document_New、および Document_Open イベントの空のプロシージャが作成されます。各プロシージャにイベントが発生したときに実行するコードを入力します。たとえば、以下のコードを適切なイベント名に置き換えて入力し、どのイベントが発生したかを示すダイアログ ボックスを表示できます。

    Msgbox "<イベント名> が発生しました。"
    
  7. [ファイル] メニューの [<文書名> の上書き保存] をクリックし、[終了して Microsoft Word に戻る] をクリックして Microsoft Word に戻ります。

"Application イベント" プロシージャの機能を理解する

Word 97 では、Document イベント プロシージャが追加されただけでなく、Application イベント プロシージャ (パワー ユーザーおよび開発者が Word の動作を変更するためのもう 1 つの新しい方法) も追加されました。

Document イベント プロシージャと同様に、Application イベント プロシージャは、特定のイベントが発生したときに自動的に実行されます。その点までは、Application イベント プロシージャは、Document イベント プロシージャの場合と同じくらい簡単に理解できます。

Application イベント プロシージャについてより深く理解しようとすると、"長所"、"短所"、"さらなる長所" があることがわかります。長所は、Document イベント プロシージャよりも強力で柔軟性があることです。短所は、VBA コード プロジェクトでそれらを利用するにはある程度の準備が必要なことです。さらなる長所は、獲得できる機能と柔軟性に比べればその準備はとてもわずかな作業であることです。

注: Word 97 が販売開始された時点では、Word でサポートされる Application イベントは 2 つしかありませんでした。そのため、それらを活用しなくても失うものは多くはありませんでした。それ以後、Word の新しいバージョンごとに、サポートされる Application イベントの数は着実に増加しています。たとえば、Word 2002 SP-2 では 23 のさまざまな Application イベントがサポートされています。Word 2003 でサポートされる Application イベントはさらに増えると考えてよいでしょう。今までに Application イベント プロシージャの使用を試みていない場合は、始める機会を逃していたことになります。

Application イベント プロシージャを詳細に説明する前に、ここでこれまでに説明した Document イベント プロシージャに伴う疑問について考えてみるとわかりやすくなります。"VBA コード プロジェクトに Document イベント プロシージャを保存するときに特別な準備が必要ないのはなぜでしょうか。"

その理由の 1 つは、Word が、その Document イベント プロシージャがどこにあるのかを既に認識しているからです (存在する場合)。前に説明したように、設計によって、そのようなプロシージャは文書またはそれに添付されたテンプレートの VBA コード プロジェクトの ThisDocument モジュール内にあります。

Document イベント プロシージャに特別な準備が必要ないもう 1 つの理由は、ユーザーが新しい文書を作成するか、既存の文書を開くまたは文書を閉じるたびに、Word によって対応するイベント プロシージャが存在するかどうかが自動的に調べられるからです。Word にこれを実行するように指示する必要はありません。

Document イベント プロシージャの存在を常にチェックするために発生するわずかな遅延にユーザーが気付いたり、誰かが迷惑を被ることはないと Word の開発チームが考えていたことは明らかです。ユーザーが文書を作成したり、開いたり閉じたりする場合の、ディスクやネットワークにアクセスするときの遅延に比べれば、わずかな時間であるため、これは道理にかなっています。

これらの条件は、いずれも Application イベント プロシージャには当てはまりません。まず第一に、Application イベント プロシージャのための既定の場所が確立されていないので、その場所を指定しない限り、Word はチェックする場所を認識できません。

さらに、Application イベントは頻繁に発生し、またユーザーが速い応答に慣れているときに発生する場合もあります。したがって、それらのイベントが発生するたびにイベント プロシージャについて Word がチェックするのは、そのようなプロシージャが存在するとわかっていない限り、意味がありません。この問題を解決するために、Word は明示的に指示された場合にのみ、Application イベント プロシージャをチェックします。

では、Application イベント プロシージャの保存場所と、Application イベントが発生するたびにそれらをチェックするように Word に認識させるにはどうしたらよいでしょうか。答えは概念的にはとても簡単で、実行においてもほとんど同様に簡単です。概念的には、実行する必要があるのは以下の事項だけです。

  1. イベント プロシージャを内部に格納する "イベント ハンドラ" クラス モジュールを作成します。

注: クラス モジュールは、オブジェクトのカテゴリ、つまり "クラス" を記述すると言われています。作成するクラス モジュールでは、イベント ハンドラと呼ばれるオブジェクトのクラスを記述します。後で、このクラスに属するオブジェクトを作成します (技術的には、そのようなオブジェクトを複数作成できますが、おそらく 1 つで十分です)。クラス モジュールが行うことは、クラスの各メンバがどのようなものであるかを記述することだけです。これは、後で必要な数だけイベント ハンドラを作成できるようにイベント ハンドラの型を作成するようなものです。

  1. イベント ハンドラ クラス モジュールの記述に基づいて、イベント ハンドラ オブジェクトを作成します。

注: オブジェクトは、クラスのメンバまたは "インスタンス" と呼ばれることがあります。必要に応じて、1 つのクラスの複数のインスタンスを作成できます。各インスタンスは、そのクラスのクラス モジュールに格納された記述に従います。

この説明がすべて不可解に思えても心配する必要はありません。おそらく、それは単に聞き慣れない用語が含まれているためです。この後、何が行われているのかを検証しながら、これらの概念を実践に移してゆきます。

重要: 以下で使用する名前にはかなり長いものもありますが、これは Application イベントがどのように処理されるのかをわかりやすくするためです。後で、短い名前をお勧めしますが、この時点では長い名前を受け入れてください。

VBA プロジェクトに Application イベント プロシージャを保存する

Application イベント プロシージャは、文書、標準テンプレート、または全文書対象のテンプレートの VBA コード プロジェクトに保存できます。これらの場所のうち、最もよく使用される場所は全文書対象のテンプレートです。それは、Application イベント自体が全文書対象であるためです。つまり、それらはすべての文書に影響を与えます。したがって、以下の手順では、Application イベント プロシージャを EventHandlerAddin.dot というアドイン テンプレートに保存すると想定します。以下のように実行します。

  1. Word を起動し、新しいテンプレートを作成して、すぐに EventHandlerAddin.dot と名前を付けて保存します。
  2. Alt キーを押しながら、F11 キーを押して、Visual Basic エディタを起動します。
  3. [プロシージャ エクスプローラ] ペイン (画面の左上) で、EventHandlerAddin.dot の VBA プロジェクトを探します。

注: Word で開いている文書ごとに、その文書のプロジェクトと、その文書に添付されたテンプレートのプロジェクトがあります。EventHandlerAddind.dot のプロジェクトが選択されていることを確認します。

  1. プロジェクトを右クリックし、[挿入] メニューの [クラス モジュール] をクリックします。[プロパティ] ペイン (画面の左下) で、[オブジェクト名] フィールドをクリックし、クラス モジュールの名前を clsEventHandler に設定します。

  2. 画面の右側の [コード] ペインで、以下のように入力します。

    ...
    'Word のインスタンスのみがこの変数に割り当てられることと、
    '割り当てられたインスタンスに、Application イベント プロシージャについて
    'イベント ハンドラ内をチェックするように伝える必要があることを宣言します。
    Public WithEvents _
       AppThatLooksInsideThisEventHandler _
       As Word.Application
    ...
    
  3. [コード] ペインの上部で、オブジェクト ドロップダウン リストをクリックして [AppThatLooksInsideThisEventHandler] を選択します。次にプロシージャ ドロップダウン リストで、[DocumentBeforeClose] をクリックし、[DocumentBeforePrint] をクリックし、最後に [DocumentBeforeSave] をクリックします。これによって、これらのイベントそれぞれに対する空のプロシージャが作成されます。他のイベントについては後で説明します。

  4. そのイベントが発生したときに実行するコードを各プロシージャに入力します。この場合は、プロシージャが実行されたときに関連する Application イベントの名前を表示する簡単なメッセージ ボックスを入力します。たとえば、以下の最初の文は、DocumentBeforeClose イベント プロシージャに適用され、2 番目のセットは DocumentBeforePrint に、3 番目のセットはDocumentBeforeSave イベント プロシージャに適用されます。

    Private Sub AppThatLooksInsideThisEventHandler_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
       MsgBox "Event: DocumentBeforeClose"
    End Sub
    
    Private Sub AppThatLooksInsideThisEventHandler_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean)
       MsgBox "Event: DocumentBeforePrint"
    End Sub
    
    Private Sub AppThatLooksInsideThisEventHandler_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
       MsgBox "Event: DocumentBeforeSave"
    End Sub
    
  5. [ファイル] メニューの [<文書名> の上書き保存] をクリックします。

    ここで、これまでに行ったことを検証してみましょう。

    clsEventHandler というクラス モジュールを作成しました。このクラス モジュールは、イベント ハンドラ オブジェクトのクラスを記述しますが、そのオブジェクトの生成 (オブジェクトのインスタンス化ともいいます) は行いません。イベント ハンドラ オブジェクトは後で生成されます。クラス モジュール内に存在するのは、各イベント ハンドラがどのようなものであるかの記述のみです。

    イベント ハンドラ オブジェクトを作成すると、オブジェクトに Word Application オブジェクトとイベントが含まれ、さらに DocumentBeforeClose、DocumentBeforePrint、および DocumentBeforeSave の Application イベントに対するプロシージャも組み込まれます。

    注: ここでは、"Word Application オブジェクト" とは、Word アプリケーションのすべてのプロパティおよびメソッドを反映したメモリ内のデータ構造体を示し、"Word Application オブジェクトとイベント" というように "イベント" が含まれているのは、Application イベントが発生するたびにイベント ハンドラ オブジェクト内のイベント プロシージャに対するチェックが必要であることが、関連する Word のインスタンスに通知されることを意味しています。

    強調しますが、ここまでに行ったのは、イベント ハンドラ オブジェクトを定義することです。そのようなオブジェクトはまだ作成されていません。もう少しですので、先に進みましょう。

  6. コード プロジェクトを右クリックし、[挿入] メニューの [標準モジュール] をクリックします。[プロパティ] ペイン (画面の左下) で、[オブジェクト名] フィールドをクリックし、「modHandleEvents」と入力します。

  7. [コード] ペイン (画面の右側) に、以下のように入力します。

    ...
    ' objEventHandler 変数に格納されるオブジェクトのタイプを宣言します。
    Dim objEventHandler As clsEventHandler
    
    Sub CreateEventHandler()
       '新しいイベント ハンドラ オブジェクトを作成し、それを objEventHandler に割り当てます。
       Set objEventHandler = New clsEventHandler
       'Word の現在のインスタンスに
       'イベント ハンドラ オブジェクト内の
       'Application イベント プロシージャをチェックするように通知します。
       Set objEventHandler.AppThatLooksInsideThisEventHandler =   Word.Application
    End Sub
    
    Sub DestroyEventHandler()
       'イベント ハンドラ オブジェクトによって使用されていたメモリを解放します。
       Set objEventHandler = Nothing
    End Sub
    
    Sub AutoExec()
       'このテンプレートが全文書対象でロードされるときは常に
       'イベント ハンドラを自動的に作成します。
       CreateEventHandler
    End Sub
    
    Sub AutoExit()
       'このテンプレートがアンロードされるときは常に
       'イベント ハンドラを自動的に破棄します。
       DestroyEventHandler
    End Sub
    
  8. [ファイル] メニューの [<文書名> の上書き保存] をクリックし、[終了して Microsoft Word に戻る] をクリックして Microsoft Word に戻ります。

  9. Word を閉じます。

ここで、これまでに行ったことをもう一度検証してみましょう。

modHandleEvents というコード モジュールを作成し、その中で、clsEventHandler タイプの objEventHandler という変数を使用すると宣言しました。この宣言ではオブジェクトは作成されず、そのタイプのみが設定されます。つまり、この宣言は、コンパイラ (および Microsoft IntelliSense® 機能) が clsEventHandler に格納されたオブジェクトの記述に従った変数の使用を支援できるように、変数が参照するオブジェクトの種類をコンパイラに伝えます。

CreateEventHandler というサブルーチンを構築しました。このサブルーチンによって、clsEventHandler というクラスの新しいインスタンスが作成され、それが objEventHandler に割り当てられます。さらに、このサブルーチンによって、Word の現在のインスタンスが、objEventHandler の AppThatLooksInsideThisEventHandler プロパティに割り当てられます。

また、DestroyEventHandler というサブルーチンも構築しました。このサブルーチンは、objEventHandler に割り振られたメモリを解放することによってイベント ハンドラを破棄します。

最後に、このテンプレートが全文書対象でロードされたときに自動的に実行される AutoExec マクロと、テンプレートがアンロードされたときに自動的に実行される AutoExit マクロを作成しました。AutoExec マクロで、イベント ハンドラが自動的に作成されます。AutoExit マクロで、イベント ハンドラが自動的に破棄されます。

最後に、イベント ハンドラが存在しています。あるいは少なくとも、イベント ハンドラは、Word がテンプレートを全文書対象でロードし、CreateEventHandler サブルーチンを実行した直後に存在するようになります。

Word によって CreateEventHandler サブルーチンが実行されるときに行われるもう 1 つのことは、Word の現在のインスタンスがイベント ハンドラの AppThatLooksInsideThisEventHandler プロパティに割り当てられることです。その結果、Word には、Application イベントが発生するたびにイベント ハンドラ内のイベント プロシージャをチェックするように通知されます。

特定のイベント (DocumentBeforeClose、DocumentBeforePrint、DocumentBeforeSave) の場合、関連付けられたイベント プロシージャが検索され、それが実行されます。その他のイベントの場合、関連付けられたイベント プロシージャを検索しますが、見つけることができず、プロシージャを実行することなく通常のアクションが完了されます。

イベント ハンドラをテストする

イベント ハンドラのテストには、数秒しかかかりません。動作を確認するには、次の手順を実行します。

  1. Word を起動します。
  2. [ツール] メニューの [テンプレートとアドイン] をクリックし、[追加] をクリックします。次に EventHandlerAddin.dot をクリックして [OK] をクリックします。これで、Word によってアドイン テンプレートが全文書対象でロードされ、そのアドインの AutoExec マクロが実行され、それによって、メモリ内にイベント ハンドラ オブジェクトが作成されます (これは長い一連のイベントですが、この一連の流れを理解できたので、使い慣れない奇妙なものと感じることはないでしょう)。
  3. いくつかの文書を保存し、印刷し、閉じてみてください。これらの操作を行うたびに、Application イベントが発生したことと、Application イベント プロシージャの 1 つを実行することによって Word が応答したことを示すメッセージが表示されます。
  4. [ツール] メニューの [テンプレートとアドイン] をクリックします。[EventHandlerAddin.dot] チェック ボックスをオフにして [OK] をクリックします。これで、アドイン テンプレートがアンロードされ、そのアドインの AutoExit マクロが実行され、それによって、イベント ハンドラ オブジェクトが破棄されます (これはもう 1 つの一連の長いイベントですが、既になじみのあるものです)。
  5. いくつかの文書を保存し、印刷し、閉じてみてください。この操作を行っても、メッセージは表示されません。それは、Word によって Application イベント プロシージャがチェックされなくなったためです。また、いずれにしても Application イベント プロシージャは既にメモリに存在していません。

イベント ハンドラおよび Application オブジェクトの短い名前

この記事では、clsEventHandler というクラス モジュールを作成し、そのクラス モジュール内で、AppThatLooksInsideThisEventHandler という Word Application オブジェクト変数を宣言するようにお勧めしました。

これらの名前をお勧めしたのは、これらのイベント ハンドラ オブジェクトを作成して Word のインスタンスを割り当てるときに何が行われるかを理解しやすくするためでした。ただし、名前が明確かどうかは見る人によって変わることは認めます。

私自身のプロジェクトでは、clsEventHandler というクラス モジュールを使用することに何も不便を感じません。場合によっては、名前を clsAppEventHandler に変更して、そのイベント ハンドラが Application イベントのみを処理するように設計されたことを示すこともあります。また、cls プリフィックスを削除し、そのクラス モジュールを AppEventHandler と呼ぶこともあります。

クラス モジュール内の Word Application オブジェクト変数の場合、よく使用する名前は EventSource です。これは VBA の IntelliSense 機能で使用しやすい名前です。それは、後で、イベント ハンドラ オブジェクトを作成する標準のコード モジュール (modHandleEvents) で、ピリオドを入力するだけでイベント ハンドラに対して [IntelliSense] ドロップダウン リストから [EventSource] プロパティを選択できるためです。これによって、コードは以下のようになります。

Dim objEventHandler As clsEventHandler

Sub CreateEventHandler()
   Set objEventHandler = New clsEventHandler
   Set objEventHandler.EventSource = Word.Application
End Sub

Application イベント プロシージャの使用を続けていくと、自分にとって使いやすく、何が行われるのかがわかりやすい名前が見つかるまでいろいろな名前を試してみることになります。

Word 2002 以降でサポートされる Application イベント

前に説明したように、Word の新しいバージョンごとにサポートされる Application イベントの数は増加しています。次の一覧は、Microsoft Office 2002 Service Pack 2 の場合の Application イベント プロシージャです。使用している Word のバージョンでサポートされる Application イベントについては、VBA ヘルプで Application イベントを検索してください。

Application イベント プロシージャ 実行されるタイミング
DocumentBeforeClose 開いていた文書を閉じる直前。
DocumentBeforePrint 開いている文書を印刷する前。
DocumentBeforeSave 開いている文書を保存する前。
DocumentChange 新規文書を作成したとき、既存の文書を開いたとき、または別の文書をアクティブな文書にしたとき。
DocumentOpen ドキュメントが開いたとき。
EPostageInsert ユーザーが文書に電子切手を挿入したとき。
EPostagePropertyDialog ユーザーが [宛名ラベル作成] ダイアログ ボックスの [電子切手のプロパティ] ボタンまたは電子切手を印刷するためのツールバー ボタンをクリックしたとき。このイベントでは、サードパーティ製ソフトウェア アプリケーションがインターセプトし、それらのプロパティのダイアログ ボックスを表示することができます。
MailMergeAfterMerge 差し込み印刷のすべてのレコードのマージが正常に行われた後。
MailMergeAfterRecordMerge 差し込み印刷でデータ ファイルの各レコードのマージが正常に行われた後。
MailMergeBeforeMerge レコードのマージの前にマージが実行されたとき。
MailMergeBeforeRecordMerge マージ内の個別のレコードに対してマージが実行されたとき。
MailMergeDataSourceLoad 差し込み印刷のためにデータ ファイルが読み込まれたとき。
MailMergeDataSourceValidate ユーザーが [差し込み印刷の宛て先] ダイアログ ボックスで [確認] をクリックすることによってユーザーが住所の確認を実行するとき。
MailMergeWizardSendToCustom 差し込み印刷ウィザードの手順 6 でカスタム ボタンをクリックしたとき。
MailMergeWizardStateChange 差し込み印刷ウィザードで指定された手順から指定された手順にユーザーが変更したとき。
NewDocument 新規文書が作成されたとき。
Quit ユーザーが Word を終了したとき。
WindowActivate 文書ウィンドウがアクティブになったとき。
WindowBeforeDoubleClick 既定のダブルクリック アクションの前に、文書ウィンドウの編集領域をダブルクリックしたとき。
WindowBeforeRightClick 既定の右クリック アクションの前に、文書ウィンドウの編集領域を右クリックしたとき。
WindowDeactivate 文書ウィンドウが非アクティブになったとき。
WindowSelectionChange アクティブな文書ウィンドウで選択が変更されたとき。
WindowSize アプリケーション ウィンドウがサイズ変更されたか移動されたとき。

Application イベント プロシージャの実用的な例

この記事で提示したコードは、Word 内の Application イベント プロシージャの設定方法の習得以外にあまり有用ではありません。私と Word MVP の同僚が作成した Application イベント プロシージャの興味深い実用的な例が、以下の URL にあります。

How can I prevent users from editing the header of a document in Word 2000 or higher? (英語)

Writing application event procedures (英語)

How to create global event procedures similar to AutoOpen, AutoNew and AutoClose, without using Normal.dot (英語)

Running a macro automatically when Word starts or quits (英語)

Intercepting events like Save and Print (英語)

著者紹介

Bill Coan は、Word のテンプレート、ウィザード、アドイン、およびマクロを利用してより短い時間でより良い文書を作成できるよう組織を支援することを専門としています。彼は、Word の DataPrompter および Boilerplate アドインの開発者でもあります。彼の Web サイト も参照してください。連絡先は billcoan@wordsite.com です。