Wordの未知なる可能性を探る
プロジェクトA代表
大村あつし OOMURA,Atsushi
現在、ExcelやAccess VBAを取り巻く環境は極めて充実しています。初心者はもちろん、開発者も、プログラミングに関する情報に不自由することはないでしょう。もちろんこれは歓迎すべきことなのですが、もうひとつの主要なOffice製品、Word VBAを忘れてはいないでしょうか。
本稿では、明らかに情報不足の感があるWord VBAを最大限に活用する方法を通して、ActiveXオートメーションというテクノロジーに触れてみたいと思います。

 みなさんは、「OLE(Object Linking and Embedding)」についてはご存知ですね。たとえば、Excelの表はWordの文書に「リンク貼り付け」することができます。この場合、元のExcelの表を変更すれば、その変更はWordに貼り付けた表にも、リアルタイムで反映されます。これがOLEの「L(Linking)」の意味するところになります。また、Excelの表をWordの文書に「埋め込み」した場合、その文書に埋め込まれた表をダブルクリックすると、Wordのアプリケーションウィンドウ内にExcelが起動します。もちろん、その逆のパターン、ExcelのワークシートにWordの文書をリンク貼り付けたり、また埋め込むことも可能です。
 このように、Officeのアプリケーション間でデータ(オブジェクト)を共有するテクノロジーは、長い間OLEと呼ばれてきました(余談ですが「OLE」は“オーレイ”と発音します。「SQL」の正式な発音が“シーケル”みたいなものです)。しかし、1996年にMicrosoftは、このオブジェクトの共有という概念をインターネットの世界にまで拡大し、OLEに代わる用語として「ActiveX」という用語を誕生させたのです。
 しかし、ブラウザというクライアント側に依存するこのテクノロジーに対応したのは、結局自社ブラウザInternet Explorerのみでした。そこでMicrosoftは、ActiveXを拡大解釈し、COM(Component Object Model)をもとに構築されるすべてのコンポーネント技術と位置づけました。MSDNのライブラリには、「OLEはActiveXではない」と明記されていますが、一般ユーザーはActiveXはOLEのテクノロジーを踏襲したもの、と受けとめていることでしょう。今回のOffice 2000のリリースは、そういったMicrosoftのブラウザの主導権争いに関する、事実上の勝利宣言のような気がしてなりません。数年前から、ドキュメントの共有に最適なテクノロジーはHTMLとXMLであることは、一部の人にはわかっていました。しかし、ブラウザのマーケットで遅れをとったMicrosoftは、自社ブラウザがデファクトスタンダードになるまでは、OLEで対抗せざるを得なかったのではないでしょうか。つまり、Office 2000でHTMLを標準のファイル形式に採用したのは、言うなれば、Internet Explorerがデファクトスタンダードと認知された、という自信の裏返しであると解釈できるかもしれません。
 さて、話を元に戻しますが、本稿では非常に幅広い概念であるActiveXの中の「ActiveXオートメーション」に注目します。たとえば、Excel VBAで作成されたマクロは、Wordを起動したり、さらには文書や段落といったWordのオブジェクトをも操作することができます。同様にAccessのオブジェクトも操作できます。
 このように、ActiveXは、ソフトウェアコンポーネントの相互利用をオープンに管理する側面を併せもちます。そして、外部のアプリケーションのオブジェクトを操作するテクノロジーを「ActiveXオートメーション」と呼ぶのです。
 ActiveXオートメーションでは、オートメーションクライアントがオートメーションサーバーを制御するという図式になります。「クライアントがサーバーを制御」と言うと、逆のような気もしますが、サーバーはそもそも自身の資産を外部公開するものです。つまり、「外部公開されたオブジェクトモデルをクライアントが利用する」と考えれば、納得できるのではないでしょうか。もっとも、この用語が紛らわしいということで、オートメーションクライアントのことを「オートメーションコントローラー」、オートメーションサーバーのことを「オートメーションオブジェクト」と呼ぶこともあります。私には、後者の言い回しの方がしっくりきます。
 2年半前になりますが、Wordはバージョン8.0(Word 97)になり、VBAが搭載され、そのオブジェクトも外部公開されました。みなさんは、Wordを業務の中でどのぐらい有効活用しているでしょうか。ExcelとAccessを時々連携させることがある、という方が大半ではないでしょうか。しかしこれだけでは、何のためのActiveXオートメーションで、何のためのWord VBAなのかがかわかりません。それこそ宝の持ち腐れです。
 そこで本稿では、Excelをクライアントにして、WordをVBAでリモートコントロールする方法を紹介します。もちろん、Wordもオートメーションクライアントになることができるアプリケーションですから、WordでExcelやAccessを制御した方が、よりWordの機能が前面に出てくるのかも知れません。しかし、どちらをクライアントに、またサーバーにしたとても、基本的なプログラミングテクニックは変わりません。また、Wordはサーバーとして利用される機会が圧倒的に多いアプリケーションです。こうした事情を考慮すると、ExcelがWordを制御する事例の方が、より現実的であろうと判断できます。