■ ActiveXオートメーション(OLEオートメーション)の概要
ActiveXオートメーションを使用すると、ExcelやAccessのようにActiveXオートメーション機能をサポートしているアプリケーションのオブジェクトを一時的に作成し、利用することが可能になります。
ActiveXオートメーションは、他のアプリケーションに対して自身のオブジェクトへの参照を公開し、オートメーションクライアント機能に対応したアプリケーションと、データ連携を可能にするためのインターフェイスを提供します。
このとき、外部公開されるオブジェクトモデルをオートメーションサーバー(オートメーションオブジェクト)と呼び、それを制御するクライアントをオートメーションクライアント(オートメーションコントローラー)と呼びます。
ActiveXオートメーションは、このオートメーションクライアントからオートメーションサーバーを操作し、異なるアプリケーション間でデータを共有させ、利用する技術のことを指します。
これを利用することで、AccessからExcelのグラフを利用したり、ExcelからWordの文書を編集したりすることが可能になります。
Officeでシステム開発をする上で、最もその恩恵にあずかることができるのがこのオートメーション機能の利用でしょう。Excelだけですべてを行うのではなく、Officeを巨大なアプリケーション群と捉えて開発を行うメリットが得られるはずです。
■CreateObject 指定した種類の新しいオブジェクトを一時的に作成する
指定したActiveXオブジェクトへの参照を作成します。戻り値をオブジェクト変数に代入することで、そのオブジェクトに対する操作を行うことができます。
書式:CreateObject(class,[servername])
class |
作成するオブジェクトのアプリケーションの名前とクラスを[アプリケーションの名前.オブジェクトの種類またはクラス]で指定します。 |
servername |
作成するオブジェクトを保存するネットワークサーバーの名前を指定します。ローカルマシンで使用する場合は、空の文字列を指定するか省略します。 |
CreateObjectを利用したいろいろな例を紹介します。
(例)
Sub test()
Dim xlApp As Object
Dim xlWkb As Object
Dim xlWks As Object
Set xlApp = CreateObject("Excel.Application")
Set xlWkb = xlApp.Workbooks.Add
Set xlWks = xlWkb.worksheets(1)
xlApp.Visible = True
xlWks.Cells(1, 1) = "ActiveX Automation Test"
xlWkb.SaveAs CurrentProject.Path & "\test.xls"
xlApp.Quit
Set xlApp = Nothing
Set xlWkb = Nothing
Set xlWks = Nothing
End Sub
AceessVBAからこのプロシージャを実行した場合、新しいExcelワークブックを作成し、A1セルに"ActiveX Automation Test"と入力したあと、実行したmdbファイルと同じ場所に保存し、Excelを終了します。また次のように記述することもできます。 |
Sub test()
Dim xlSht As Object
Set xlSht = CreateObject("Excel.Sheet")
xlSht.Application.Visible = True
xlSht.ActiveSheet.Cells(1, 1) = "ActiveX Automation Test"
xlSht.SaveAs CurrentProject.Path & "\test.xls"
xlSht.Application.Quit
Set xlSht = Nothing
End Sub
このように記述しても、先ほどのプロシージャと同じ動作をします。 |
(例)
Sub test()
Dim ieApp As Object
Const URL As String = "http://www4.plala.or.jp/gen2/excel/"
Set ieApp = CreateObject("InternetExplorer.Application")
ieApp.Navigate URL
ieApp.Visible = True
Set ieApp = Nothing
End Sub
Access、Excel等からこのプロシージャを実行した場合、InternetExplorerを起動しエクセル大事典のサイトを表示します。 |
(例)
Sub test()
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.Workbooks.Open FileName:=CurrentProject.Path & "\test.xls"
xlApp.Run "testExcelProc"
Set xlApp = Nothing
End Sub
Sub test()
Dim acApp As Object
Set acApp = CreateObject("Access.Application")
acApp.OpenCurrentDatabase ThisWorkbook.Path & "\test.mdb"
acApp.Visible = True
acApp.Run "testAccessProc", "Arg1", "Arg2"
Set acApp = Nothing
End Sub
上の例では、AccessVBAからExcelワークブックを開きマクロを実行させます。呼び出し側のMDBファイルと同一フォルダにあるtest.xlsを開き、その中にある"testExcelProc"プロシージャを実行させます。
下の例では、ExcelVBAからAccessのMDBファイルを開きマクロを実行させます。呼び出し側のワークブックと同一フォルダにあるtest.mdbを開き、その中にある"testAccessProc"プロシージャに"Arg1"を第1引数、"Arg2"を第2引数として渡し実行させます。 |
代表的なオートメーションサーバーに指定できるアプリケーション名とクラス、オブジェクトの種類
アプリケーション |
クラス |
オブジェクトの種類 |
エクセル |
Excel.Application |
Excel本体 |
エクセル |
Excel.Sheet |
Excelシート |
エクセル |
Excel.Chart |
Excelグラフ |
ワード |
Word.Application |
Word本体 |
ワード |
Word.Document |
Word文書 |
アクセス |
Access.Application |
Access本体 |
パワーポイント |
PowerPoint.Application |
PowerPoint本体 |
IE |
InternetExplorer.Application |
InternetExplorer本体 |
アウトルック |
Outlook.Application |
Outlook本体 |
■GetObject ファイルからオブジェクトへの参照を取得する
作成済みのファイルを使用してオブジェクトへの参照を取得します。戻り値をオブジェクト変数に代入することで、そのファイルに対する操作を行うことができます。
書式:GetObject([pathname] [, class])
pathname |
取得するオブジェクトが含まれているファイルの絶対パスとファイル名を指定します。ここで指定されたファイルに関連付けられているアプリケーションが起動され、オブジェクトがアクティブになります。引数pathnameに空文字列を指定するとclassに指定されたオブジェクトを新規作成します。その場合、必ずclassを指定する必要があります。 |
class |
オブジェクトのクラスを表す文字列を指定します。 |
(例)
Sub test()
Dim xlApp As Object
Set xlApp = GetObject(CurrentProject.Path & "\test.xls")
xlApp.Application.Visible = True
xlApp.Parent.Windows(1).Visible = True
Set xlApp = Nothing
End Sub
AceessVBAからこのプロシージャを実行した場合、呼び出し側のMDBファイルと同一フォルダにあるtest.xlsを開きます。
GetObject(CurrentProject.Path & "\test.xls")の部分をGetObject("", "Excel.Sheet")にした場合、新規のワークブックとして開きます。 |
■事前バインディングと実行時バインディング(遅延バインディング)
上記のサンプルコードは、すべて実行時にバインディングを行う総称オブジェクト型の変数(Objectキーワード)としてオブジェクト変数を宣言していました。この場合、オブジェクト変数がどのアプリケーションのオブジェクトなのかはコード実行時にはじめて解釈されるため、オーバーヘッドが生じてコードの実行速度が落ちます。
これに対して、コードを実行する前にあらかじめ外部オブジェクトに対する参照を設定する事前バインディングを行うことが可能です。
例えば、参照設定でMicrosoft Word 9.0 Object Libraryにチェックを入れると、コンパイラはコードが実行される前にWord2000オブジェクトライブラリ(.OLB)を使用するためのメモリの割り当てと最適化処理を行います。これによって実行時バインディング(遅延バインディング)に比べて高速な処理を行うことが可能になります。
また事前バインディングでは、自動コード補完や自動メンバ表示といったコーディング支援機能が有効になり、コンパイルエラーも返すためプログラミングの省力化につながります。
(例)
Dim wrdApp As Word.Application
Set wrdApp = CreateObject("Word.Application")
この例では、Objectキーワードを使用せず、固有オブジェクト型で変数を宣言し事前バインディングしています。Microsoft Word 9.0 Object Libraryを参照設定する必要があります。
次のように記述することも可能です。 |
(例)
Dim wrdApp As New Word.Application
この場合、Newキーワードを用いることでCreateObject関数を使わずに事前バインディングを行っています。 |
■OLEオートメーションとActiveXオートメーション
OLE(Object Linking and Embedding)は、Windows 3.1の時代に採用されたアプリケーション間連携を行う機能です。本来、別のアプリケーションを利用して作られたデータ(オブジェクト)を利用するためにサポートされた機能だったのですが、その後機能を大幅に強化し、OLEはコンポーネント技術そのものを表す用語になっていきました。1996年初頭にMicrosoftはOLEの中でインターネットに関連するいくつかの技術をActiveXとして名称変更しました。その後、OLEとして公開されていた技術は順次ActiveXに統合されていきました。
オートメーションは文字通り"自動化"を表します。ActiveX(OLE)の機能を利用して他のアプリケーションの機能を利用したり、自分の機能を他のアプリケーションに公開したり、データをアプリケーション間で相互利用できるようにする技術をActiveX(OLE)オートメーションと呼びます。
当サイトでは、OLEオートメーションとActiveXオートメーションを区別しません。従来のOLEオートメーションをActiveXオートメーションまたは単にオートメーションとして紹介しています。
VBAとActiveXオートメーションを組み合わせることで、大規模なシステム開発がぐんと身近なものになります。皆さんのシステム開発にも、ぜひオートメーションを採用してください。
Excel VBAだけではできなかった、多くのことが可能になるはずです。
|