読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

主にVBAネタを扱っているブログです。

VBA オートメーション、参照設定、ライブラリ、タイプライブラリ、DDE、COM、OLE、ActiveXなどの用語整理。ついでに.NETも。

VBA プログラミング

VBAには外部オブジェクトを操作するために参照設定という機能が用意されている。そういう機能だと割り切って使用する分には何ら問題はないのだが、参照設定の仕組みなどに興味を持ってしまうと、高い確率でタイプライブラリやCOM、ActiveXなどのの単語に出くわすので、混乱しないようにここでまとめておこうと思う。

【目次】

オートメーション

これはMicrosoftにより策定された、アプリケーションのオブジェクトを操作する為の手法である。たとえば、Excel VBAからWordやIEを操作することができるが、あれがオートメーションだ。

一般的には外部のオブジェクトを操作するときにオートメーションという用語が使われているようだが、厳密に言えば、Excel VBAExcelを操作するのもオートメーションの仕組みを利用している。その証拠にExcel VBAで特にIEやWordなどの外部オブジェクトを使用しなくても、「オートメーションエラー」が発生することがある。

オートメーションエラーは単に「オブジェクトの操作に失敗した」という意味に過ぎず、何がどう失敗したのか非常に曖昧である。従って対処方法もまちまちで、ネットで調べてもなかなか答えにたどりつけない。非常に厄介である。

ちなみにVBAエキスパートの試験ではOLEオートメーションという用語が出てくるが、これは今説明したオートメーションのことである。OLEオートメーションはやや古い呼び方で、Microsoftによると現在では単にオートメーションと呼ぶのが正しいようだ。

参照設定

VBAでオートメーションを使用するための事前準備のことで、具体的にはVBEのツール→参照設定で使用するライブラリにチェックを入れる操作を指す。

例)
f:id:t-hom:20160103053811p:plain

参照設定を行うと、対象アプリケーション専用の型を宣言でき、インテリセンス(オブジェクト変数に続けてドットを入力するとプロパティとメソッドの一覧が表示されるアレ)が有効になるため、コーディングがしやすい。

例)
f:id:t-hom:20160103053914p:plain

ちなみに、CreateObject関数を使用すると参照設定をしなくてもオートメーションを利用できるが、参照設定をした場合に比べてやや低速で、専用型も使用できず、インテリセンスも使えない。

例)
f:id:t-hom:20160103054155p:plain

ライブラリ

一般用語としてのライブラリ(Library)は図書館・蔵書などを表す英単語である。本には先人の知恵がつまっている。自己流であれこれ考えなくても、本を読めばそこに先人がたどり着いた答えが書いてあったりするものだ。

プログラミングにおけるライブラリは再利用可能な部品を集めたものである。ライブラリを使用すれば、すべて自前で開発しなくても先人が作った部品を流用できる。

ライブラリは部品集の総称であって、特定の技術を指すものではない。従って汎用コード集としてソースコードの形で提供されることもあれば、バイナリー形式で提供されることもある。

プログラミングをしていると、DLLという単語、あるいはDLLファイルを見たことがあると思うが、あれもライブラリの一種で、(Dynamic Link Library)の略である。動的リンクライブラリと訳すことができる。DLLはExeファイルから動的に呼び出されて実行されるバイナリである。

DLLと相対するものに、SLL(Static Link Library)がある。これは静的リンクライブラリと訳すことができ、Exeファイルが作成されるときに一緒に埋め込まれてしまうので、ソフトウェア開発者の方以外はあまり見たことが無いと思う。

※バイナリーについてはこちら
thom.hateblo.jp

タイプライブラリ

参照設定で参照できるライブラリは、正式にはタイプライブラリと呼ばれ、すべてバイナリー形式だ。
単体のタイプライブラリはtlbという拡張子を持つファイルであるが、DLLやEXEの中に埋め込まれている場合もある。
タイプライブラリはWindowsレジストリで一覧管理されており、VBEからの参照設定はレジストリから一覧を得ている。このレジストリ上の一覧は、VBAからの使用に限定されたものではない。
例えばAdobe AcrobatEvernoteなどのアプリケーションをインストールすると、レジストリのタイプライブラリに登録される仕組みになっており、実際にExcel VBAからも一応参照できるが、情報に乏しいのでVBAからAcrobatEvernoteを活用するのは困難である。

例)オブジェクトブラウザでAcrobatのライブラリの中身が確認できる。
f:id:t-hom:20160103064719p:plain

まあ、無いこともないので、一応参考までに。
【参考】PDF | VBA(Excel)からAcrobat経由でPDFをプログラミング操作(OLE:IAC)する
【参考】EvernoteをVBAとかVBSから操作する

DDE、COM、OLE、ActiveX

タイプライブラリの実態は、COMインターフェースである。と言っても何のことかわからないかと思うので、一つずつ説明する。

インターフェースは、境界とか接点という意味で、例えばPCにハードディスクを接続するインターフェースはIDESerialATAなどがある。物理的な形状のほか、電気信号のやりとりのルールが定められているが、内部の処理までは干渉しない。たとえばディスクが時計回りだろうが、反時計回りだろうが、まったく回らないSSDであろうが、インターフェースさえ合致すれば接続し、データのやりとりが可能だ。

ソフトウェアのインターフェースもこれと似たようなもので、あらかじめ取り決めを作っておくことで異なるソフトウェア同士がお互いにデータをやりとりできる。

COMはComponent Object Modelの略で、Microsoftが策定した、オブジェクトを部品として扱うための技術仕様である。

ひとくちにオブジェクトと言っても、VBのオブジェクトとC++のオブジェクトでは互換性が無く、そのままでは相互運用が難しい。そこで、共通のインターフェースを定め、それに従って作成することでVBで作ったソフトウェア部品をC++から利用したり、逆にC++で作ったソフトウェア部品をVBから利用したりできる。そのための仕様がCOMである。

COM以前はDDE(Dynamic Data Exchange)が使用されていた。


以下、歴史的な流れに沿って各用語を解説していく。

まず1987年にDDEが登場し、ソフトウェア同士がメッセージをやり取りできるようになった。
f:id:t-hom:20160103074642p:plain


1991年にはOLE(Object Linking and Embedding)のバージョン1が登場した。
OLEはソフトウェア同士の連携や埋め込みをサポートする技術で、WordやPowerPointExcelの表やグラフを埋め込んだりするのにも使用される。またボタンやテキストボックスなどのコントロールやデータベース、ネットワークアクセスなどMicrosoftのオブジェクト連携に関するものは殆どOLEが使用されていた。
OLEの基底技術として、DDEによるメッセージのやり取りが使用されていた。
f:id:t-hom:20160103075904p:plain


1992年にはOLE2が登場した。この時に基底技術がDDEからCOMに一新された。
f:id:t-hom:20160103080313p:plain


1996年に、OLEはActiveXというブランド名に変更されたが、Office製品の連携に関するものだけ名称がOLEとして残った。
f:id:t-hom:20160103083331p:plain

つまり、IEActiveXコントロール(プラグイン等)もExcelActiveXコントロール(ボタンやテキストボックス等)も、データベースを操作するADO(ActiveX Data Object)も、前身はOLEであり、その基底技術はCOMである。

まぁ、COM、OLE、ActiveXの3つは、混乱による誤用も多々あると思うので、だいたい同じようなものを指しているという認識で構わないと思う。要はオブジェクトの再利用技術なのだ。

DDEについてはすでに殆ど使用されていないので、きれいさっぱり忘れてしまって問題ない。

ちなみに前項でアプリケーションをインストールするとレジストリのタイプライブラリ一覧に登録されると書いたが、これはそのアプリがCOMインターフェースを公開している場合に限る。

.NET Framework(関係ないけど)

ドットネットフレームワークは2002年に登場した基盤技術である。COMとの相互運用性が確保されており、.NETからCOMを呼び出したり、COMから.NETで作成したライブラリを呼び出せるようにCOMインターフェースを作成したりできる。

複雑肥大化したCOMを置き換えるために作成されたものと見るのが自然だが、そのような記述は特に見当たらない。

根気があれば.NETでVBA用のライブラリを作成することもできるが、わざわざVBAから呼び出さなくても最初から.NETでプログラミングした方がはるかに楽なので、VBAにとって.NETはあまり関係ない。

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。