|
|
VBAではじめるAutoCADカスタマイズ |
|
|
第13回 Microsoft Excelとの連携(1) |
|
|
■ はじめに
CAD図面に含まれるデータを利用して集計作業を行ったり、すでに存在するデータをもとにCAD図面を作成する場合には、すべての作業をAutoCADだけで行うより、それぞれの作業に適したアプリケーションと併用しながら進める方が効率的です。AutoCAD VBAなら別のアプリケーションとの連携作業を簡単に自動化できます。今回と次回の2回に分けて、AutoCADとExcelが互いに連携して動作するプログラムの作成に挑戦してみましょう。
■ ActiveXオートメーション
連載第2回で説明したように、ExcelやWordのようなActiveXオートメーションに対応したアプリケーション(以下ActiveXアプリケーション)であれば、AutoCAD VBAから簡単にアプリケーションの操作や情報の交換などを行うことができます。このようなActiveXオートメーションの仕組みにより、AutoCADの図面や図形、属性などの情報をAutoCAD以外のアプリケーションで利用したり、これらの情報をそのアプリケーションで加工した後、再びAutoCADに読み込んで利用したりするような処理を容易に実現することができます。
ActiveXオートメーションの概念 |
|
これまでの連載で、AutoCAD VBAからAutoCADのオブジェクトモデルを利用してプログラムを作成する方法についてはすでに学習しました。それと同様に、AutoCAD VBAからActiveXアプリケーションを操作したり情報の受け渡しを行なったりするためには、操作対象のアプリケーションが公開するオブジェクトモデルを参照し、それらのオブジェクトを利用するためのプログラムコードを記述していくことになります。
■ 参照設定とタイプライブラリ
AutoCAD VBAからActiveXアプリケーションが公開するオブジェクトを利用するには、まず、そのアプリケーションのタイプライブラリに対して参照設定を行ないます。VBエディタの[ツール]メニューから[参照設定]を選択すると[参照設定]ダイアログが表示され、コンピュータに登録されているすべてのタイプライブラリのリストが表示されます。そして、操作対象のアプリケーションのタイプライブラリにチェックを付けると参照設定が行われます。
参照設定ダイアログ |
|
タイプライブラリとは、ActiveXアプリケーションがActiveXの仕様にもとづいて公開しているすべてのオブジェクトやプロパティ、メソッドの戻り値や定数などの情報が記述されたファイルです。AutoCAD VBAからタイプライブラリを参照設定すると、そのアプリケーションがどのようなオブジェクトやメソッド、プロパティを持っているかをオブジェクトブラウザで一覧表示できるようになります。また、VBエディタ上でインテリセンス機能が働くようになり、プログラムコードの入力支援も受けることができるようになります。
タイプライブラリは、通常ActiveXアプリケーションのインストール時にコンピュータに登録されます。[参照設定]ダイアログを見ると非常に多くのタイプライブラリが登録されていること、また、初めからAutoCADやVBA自身などに対して参照設定が行われていることがわかります。AutoCAD VBAでAutoCADのオブジェクやメソッドなどに対してインテリセンス機能が働くのは、デフォルトでこれらのタイプライブラリに対して参照設定されているからです。
■ Applicationオブジェクトの作成と取得
ActiveXアプリケーションのタイプライブラリに対して参照設定を行ったら、そのアプリケーションのインスタンスを取得します。インスタンスとは、クラス(オブジェクトの設計図)をもとにコンピュータのメモリ中にロードされた(実体化された)オブジェクトのことで、言い換えれば、そのアプリケーションを起動するか、または、すでに起動しているアプリケーションからそのアプリケーション自身を表わすオブジェクトへの参照を取得するということです。
アプリケーション自身を表わすオブジェクトは、通常はオブジェクトモデルの最上位にあるApplicationオブジェクトで、その作成や取得にはVBAのCreateObject関数やGetObject関数を使用します。CreateObject関数はクラス名をもとにアプリケーションを起動し、その結果作成されたオブジェクトへの参照を返します。また、すでに起動しているアプリケーションからオブジェクトを取得する場合はGetObject関数を使用します。
CreateObjectとGetObject関数の書式
CreateObject(クラス名[, サーバ名]) |
クラス名からActiveXオブジェクトを作成してその参照を返す。 |
GetObject([ファイル名][, クラス名]) |
ファイル名やクラス名から取得したActiveXオブジェクトへの参照を返す。 |
CreateObjectやGetObject関数で取得したApplicationオブジェクトへの参照は、通常はSetキーワードを使用してそのアプリケーションに固有のオブジェクト型として宣言されたオブジェクト変数に格納します。そしてAutoCAD VBAからは、AutoCADの各オブジェクトを操作する時と同様、そのオブジェクト変数を通して操作対象のアプリケーションのオブジェクトやメソッド、プロパティなどを利用することになります。
ただし、CreateObject関数でアプリケーションを起動した場合は、それだけでは画面上に表示されません。起動したアプリケーションを画面上に表示するには、以下に示すサンプルコードの最後の行に記述しているように、ApplicationオブジェクトのVisibleプロパティをTrueに設定する必要があります。
ExcelのApplicationオブジェクトを作成して(Excelを起動して)利用する例
クラス名と固有オブジェクト型
クラス名とは、ActiveXオートメーションの仕様にもとづいて他のアプリケーションなどに公開されているオブジェクトを識別するための名前のようなもので、アプリケーションごとに決められています。ActiveXアプリケーション自身を表わすオブジェクトモデルの最上位のオブジェクトのクラス名には決まりがあり、そのクラス名は下表に示すように通常は「アプリケーション名.Application」となっています。
主要なアプリケーションのクラス名
アプリケーション名 |
クラス名 |
Microsoft Excel |
Excel.Application |
Microsoft Word |
Word.Application |
AutoCAD |
AutoCAD.Application |
またクラス名と同様、ActiveXアプリケーションに固有のオブジェクト型も決められていて、主要なアプリケーションのApplicationオブジェクトのオブジェクト型は下表に示す通りです。アプリケーションに固有のオブジェクト型は、オブジェクトブラウザやヘルプなどに掲載されているオブジェクトモデルなどにより確認することができます。
主要なアプリケーションのオブジェクト型
アプリケーション名 |
オブジェクト型 |
Microsoft Excel |
Excel.Application |
Microsoft Word |
Word.Application |
AutoCAD |
AutoCAD.AcadApplication |
|
■ Excelとの連携
それでは、いよいよ今回の本題であるAutoCADとExcelが連携して動作するプログラムを作成してみましょう。作成するプログラムは、ユーザーがAutoCAD上で選択した複数のポリラインの頂点座標とその面積をExcelのワークシートに書き出すというものです。またこの時、Excelが起動していない場合はExcelを起動します。
プログラムコードを記述する前にExcelのタイプライブラリに対して参照設定を行う必要があります。VBエディタの[ツール]メニューから[参照設定]を選択し、[参照設定]ダイアログでExcelのタイプライブラリにチェックを付けます。Excelのタイプライブラリ名はバージョンによって異なり、下表のようになっています。
参照設定ダイアログ |
|
Excelのタイプライブラリ名
バージョン |
タイプライブラリ名 |
Microsoft Excel 2000 |
Microsoft Excel 9.0 Object Library |
Microsoft Excel 2002 |
Microsoft Excel 10.0 Object Library |
Microsoft Excel 2003 |
Microsoft Excel 11.0 Object Library |
Excelのタイプライブラリに対して参照設定ができたら、今回はThisDrawingのコードウィンドウに以下のプログラムコードを記述していきます。
● 宣言セクションとエントリーポイント
プログラムの先頭部分には、宣言セクションやプログラム実行の起点となるプロシージャ(エントリーポイント)を記述します。
3行目
ExcelSheetはExcelのワークシート(Worksheetオブジェクト)を格納するオブジェクト変数で、複数のプロシージャで使用するためにモジュールレベルの変数として宣言しています。
5行目〜12行目
AcadToExcelプロシージャはこのプログラムのエントリーポイントで、GetExcelとGetLwPolylineプロシージャを呼び出します。
● GetExcelプロシージャ
GetExcelはExcelのApplicationオブジェクトを取得して新規ワークシートなどを作成するプロシージャです。
5行目〜11行目
まず、GetObject関数でExcelのApplicationオブジェクトの取得を試み、エラーが発生(Err.Number <> 0)したらCreateObject関数でExcelを起動して、そのApplicationオブジェクトを取得します。
13行目〜16行目
ExcelのApplicationオブジェクトが取得できたらAddメソッドでワークブックとワークシートを作成し、ワークシートの名前を"AcadToExcel"に設定します。
18行目
最後に、ApplicationオブジェクトのVisibleプロパティをTrueに設定し、Excelを画面上に表示します。
● GetLwPolylineプロシージャ
GetLwPolylineはAutoCADの作図ウィンドウ上でポリラインを選択し、選択したポリラインの頂点座標リストと面積を取得するプロシージャです。
6行目〜11行目
選択セット(SelectionSetオブジェクト)のSelectOnScreenメソッドの引数にフィルタを指定し、ユーザーが作図ウィンドウ上で選択できる図形をポリラインに限定します。
20行目〜23行目
For Eachループで選択セットに格納されている図形を1つずつ取り出し、Excelワークシートへの出力開始行を表わす変数rowおよびポリラインの頂点座標リストと面積を引数としてWriteExcel関数を呼び出します。
ここでは、フィルタで選択できる図形をポリラインに限定しているため、選択セットに格納されている図形(ポリライン)を直接AcadLWPolyline型のオブジェクト変数に取り出しています。
● WriteExcelプロシージャ
WriteExcelはGetLwPolylineプロシージャからワークシートの出力開始行およびポリラインの頂点座標リストと面積を受け取り、出力開始行のセルから各頂点のX, Y座標と面積の値を出力し、次の出力開始行を返す関数です。
11行目〜15行目
ポリラインの頂点座標は、倍精度浮動小数点型の1次元配列に各頂点のX, Y座標が連なって格納されているので、Forループで1組ずつX, Y座標値を取り出しながら、Excelのワークシートに出力しています。
なお、
"UBound"は指定した配列の添字の最大値を取得するVBAの関数です。
フィルタの使用
SelectionSetオブジェクトのSelect, SelectAtPoint, SelectByPolygon, SelectOnScreenメソッドは、AutoCADのFILTER[オブジェクト選択フィルタ]コマンドのように、色や画層、図形の種類などのフィルタリストによって選択セットに格納することのできるオブジェクトを制限することができます。
フィルタリストはこれらのメソッドの2つの引数の組み合わせで構成され、最初の引数には適用するフィルタのタイプ、2番目の引数にはその値を指定します。フィルタタイプには制限したいフィルタの種類を示すDXFグループコードを整数型の1次元配列に格納し、フィルタ値には設定する値をバリアント型の1次元配列に格納して引き渡します。以下に示すサンプルコードのように、配列の要素数を2以上にして複数のフィルタ条件を指定することもできます。
フィルタの使用例
フィルタで使用される主なDXFグループコードには下表に示すようなものがあります。選択セットのフィルタはDXFの知識が必要でAutoCAD VBAからは利用しにくい面もありますが、特定の種類の図形を処理するプログラムを作成する場合、ユーザーの選択する図形を制限することができるので、誤った選択を防止できるとともに選択後の処理も簡潔に記述できるというメリットがあります。
フィルタで使用される主なDXFコード
フィルタタイプ |
フィルタ値 |
DXFコード |
内容 |
0 |
オブジェクトタイプ(図形の種類) |
文字列: "LINE"、"CIRCLE"、"ARC"など |
2 |
オブジェクト名(属性名称など) |
文字列: オブジェクトに付けた名前 |
8 |
画層名 |
文字列: "0"など |
60 |
オブジェクトの可視性 |
整数: 0=可視、1=不可視 |
62 |
色番号 |
整数: 0〜256のカラーインデックス
0=BYBLOCK、256=BYLAYER |
|
■ まとめ
現実の業務では、ただ単にAutoCADで図面を描いて終わりということはほとんどないと思います。今回紹介したように、ユーザー自身の手で異なるアプリケーション同士を連携させ、煩雑な作業を効率よくこなしていくための手段を提供することこそ、ActiveXオートメーションの目指したところであり、また、多くのユーザーに支持されてきた理由であると思います。皆さんも是非AutoCAD VBAによるExcelやWordとの連携プログラムに挑戦してみてください。 |
|
|
|