« ■Word VBA(ツールの構成と配布方法について その1) | トップページ | ■Word VBA(カスタムツールバーの不具合?) »

2009年6月13日 (土)

■Word VBA(ツールの構成と配布方法について その2)

「ツールの構成と配布方法について」のその2です。

前回の続きとして、
two想定する動作環境
(1)Normal.dotは汚したくないのでマクロは記述しない
(2)E2000Tools.xlsのようにツール用.docにマクロを集約したい、これを配布したい
(3)ツール用.docにカスタムツールバーを作成し、全ドキュメントで共有したい
(4)ツール用.docはスタートアップで自動起動したい
(5)ツール用.docは非表示にしたい
(6)全ドキュメントに対して動作するマクロを記述したい
の実現を目指し、(1)~(5)まで達成できました。
今回は(6)について検討してみたいと思います。

ここでちょっと比較ですが、Excel VBAでは、
ツール用.xlsの
(1)VBEのクラスモジュールで、モジュール名XXXを新規作成します(例;class1)
(2)このクラスモジュールに全ブックに対する処理を記述しておきます(例:Sub App_WindowActivate)
(3)Thisworkbookモジュールにworkbook_openプロシージャを作成し、クラスとApplicationオブジェクトを関連付けます
これで、ツール用.xlsが起動した段階でクラスモジュールの設定が完了し、その後、全ブックがActiveになった時にApp_WindowActivateプロシージャが起動されるようになります。
詳細を知りたい方は、ヘルプで”Application オブジェクトでイベントを使用する”を検索してみてください。

この要領でいけば、Word VBAでは、
ツール用.docの
(1)VBEのクラスモジュールで、モジュール名XXXを新規作成します(例;class1)
(2)このクラスモジュールに全Docに対する処理を記述しておきます(例:Sub App_DocumentOpen)
(3)ThisDocumentモジュールにDocument_openプロシージャを作成し、クラスとApplicationオブジェクトを関連付けます
これでうまくいくと思いきや、残念ながらそうはいきません。

問題の本質は、ドキュメントやテンプレートの起動時に実行すべき(3)の処理であるDocument_openは、Docでは起動されますが、アドインテンプレート(.Dot)では起動しないということです。
これを解消するには、自動実行マクロ関数を用います。
ヘルプによると
    ・Docで起動されるのは、AutoOpen,AutoClose
    ・アドインで起動されるのは、AutoExec,AutoExit
ということで、Docとアドインでは起動されるプロシージャが違うので、同じ処理をそれぞれに記述する必要がありそうです。
さらに、マクロを隠蔽することがわたしの望むところなのですが、残念なことに自動実行マクロではそれができません。
マクロの隠蔽とは、プロシージャを”マクロの実行”ダイアログに表示しないようにすることを意味します。具体的には、PrivateやSub xxxxx(Optional Dummy)とするのですが、これをすると自動実行マクロは起動されなくなるので、Publicが必須となります。
とはいえ、なんとか自動実行マクロにすることで(6)が実現できました。

次回は、その1、その2を実現する中で、Wordの不具合と思われる事象が発見されたのでそれについて記述したいと思います。

« ■Word VBA(ツールの構成と配布方法について その1) | トップページ | ■Word VBA(カスタムツールバーの不具合?) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ■Word VBA(ツールの構成と配布方法について その1) | トップページ | ■Word VBA(カスタムツールバーの不具合?) »