SeaGate HomePage 別館
本館 別館 ブログ
 
トップページ
第01回
第02回
第03回
第04回
第05回
第06回
第07回
第08回
第09回
第10回
第11回
第12回
第13回
第14回
おまけ
VBAではじめるAutoCADカスタマイズ VBAではじめるAutoCADカスタマイズ
第14回 Microsoft Excelとの連携(2)

■ はじめに

前回は、AutoCADとExcelが互いに連携して動作するプログラムの例として、ユーザーがAutoCAD上で選択した複数のポリラインの頂点座標とその面積をExcelのワークシートに書き出すプログラムを作成してみました。連載最終回となる今回は、操作する側とされる側を交代し、Excel VBAからAutoCADを操作するプログラムを作成してみます。ActiveXオートメーションに対応したアプリケーション同士であれば、操作する側がExcel VBAに代わってもほとんど同じ手順、プログラムコードで作成できることがわかると思います。

■ プログラムの概要

今回作成するプログラムは、AutoCADのモデル空間にExcelのワークシート上に入力されたX, Y座標値を頂点とするポリラインを作図するというものです。前回とは異なり、すべてのプログラムコードをExcelのVBエディタ上で入力し、Excel VBAからAutoCADを操作します。また、Excelのワークシート上にチェックボックスやコマンドボタンを配置し、作図条件の指定やVBAプログラムの実行をチェックボックスやコマンドボタンで行なえるようにします。

■ コントロールの配置

ExcelはAutoCADとは異なり、ちょうどVBAのユーザーフォームと同じようにワークシートの上に直接テキストボックスやコマンドボタンなどのコントロールを配置し、VBAのプログラムコードから制御したりイベントプロシージャを利用して任意のプログラムコードを実行させたりすることができます。

ワークシート上にコントロールを配置するには、まず、Excelの[表示]メニューから[ツールバー] - [コントロールツールボックス]を選択してコントロールツールボックスを表示させます。そして、コントロールツールボックスの[デザインモード]ボタンを選択状態にしてから貼り付けたいコントロールを選択し、ワークシート「Sheet1」上でドラッグして下図のように配置します。

すべてのコントロールが配置できたら、コントロールツールボックスの[プロパティ]ボタンをクリックして[プロパティ]ウィンドウを表示します。そして、連載第11回で説明したユーザーフォームの時と同様に、[プロパティ]ウィンドウで各コントロールのオブジェクト名とプロパティの値を下表のように設定します。Excel VBAプログラムからはここで設定したオブジェクト名で各コントロールを識別することができます。

コントロールツールボックスと[プロパティ]ウィンドウ
コントロールツールボックスと[プロパティ]ウィンドウ


コントロール オブジェクト名 プロパティ
名前 設定値
コマンドボタン CommandPlot Caption 「作図」
チェックボックス(1) CheckClose Caption 「閉じる」
Value 「True」
チェックボックス(2) CheckZoom Caption 「ズーム」
Value 「True」

■ 参照設定とタイプライブラリ

各コントロールの配置とオブジェクト名、プロパティ値の設定が完了したら、Excelの[ツール]メニューから[マクロ] - [Visual Basic Editor]を選択してVBエディタを起動します。

前回は、AutoCAD VBAからExcelのタイプライブラリに対して参照設定を行いましたが、今回はExcel VBAからAutoCADを操作するので、AutoCADのタイプライブラリに対して参照設定を行います。VBエディタの[ツール]メニューから[参照設定]を選択し、[参照設定]ダイアログでAutoCADのタイプライブラリにチェックを付けます。AutoCADのタイプライブラリ名はバージョンによって異なっていて、下表のようになっています。

参照設定ダイアログ
参照設定ダイアログ

AutoCADのタイプライブラリ名
バージョン タイプライブラリ名
AutoCAD 2000, 2002 AutoCAD 2000 タイプライブラリ
AutoCAD 2004 AutoCAD 2004 Type Library
AutoCAD 2005 AutoCAD 2005 Type Library

■ プログラムコードの記述

AutoCADのタイプライブラリに対して参照設定ができたら、VBエディタのプロジェクトエクスプローラで「Sheet1」を選択し、プロジェクトエクスプローラの[コードの表示]ボタンをクリックします。今回は、このワークシート「Sheet1」のコードウィンドウにすべてのプログラムコードを記述します。なお、今回は使用しませんが、Excel VBAでもAutoCAD VBAと同様に標準モジュールやユーザーフォームの作成を行うことができます。

プロジェクトエクスプローラとコードウィンドウ
プロジェクトエクスプローラとコードウィンドウ

● 宣言セクションとエントリーポイント

プログラムの先頭部分には、宣言セクションやプログラム実行の起点となるプロシージャ(エントリーポイント)を記述します。

> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

3行目
AcadDocはAutoCADの図面(Documentオブジェクト)を格納するオブジェクト変数で、複数のプロシージャで使用するためにモジュールレベルの変数として宣言しています。

5行目〜12行目
ExcelToAcadプロシージャはこのプログラムのエントリーポイントで、GetAcadとGetCellプロシージャを呼び出します。

● GetAcadプロシージャ

GetAcadプロシージャは、AutoCADのApplicationオブジェクトを取得して新規図面を作成するプロシージャです。

> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

5行目〜11行目
まず、GetObject関数でAutoCADのApplicationオブジェクトの取得を試み、エラーが発生(Err.Number <> 0)したらCreateObject関数でAutoCADを起動して、そのApplicationオブジェクトを取得します。

13行目
AutoCADのApplicationオブジェクトが取得できたらAddメソッドで新規図面を作成します。

15行目
最後に、ApplicationオブジェクトのVisibleプロパティをTrueに設定し、AutoCADを画面上に表示します。

● GetCellプロシージャ

GetCellプロシージャは、Excelのワークシート上に入力されたX, Y座標値のリストを取得するプロシージャです。

> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

14行目〜28行目
For...Nextループでワークシートの2行目から65536行目(ワークシートの最大行数)までにある1列目のセルの値を読み取ります。

17行目〜27行目
現在の行の1列目のセルにデータがない(IsEmpty(cell)がTrue)場合はFor...Nextループを脱出し、それ以外の場合は1列目と2列目のセルの値を倍精度浮動小数点型の変数x, yに格納します。

23行目〜24行目
ReDimステートメントを使用してポリラインの頂点座標リストを表わす動的配列pの要素数を変更し、セルから読み取ったX, Y座標の値を追加します。

"Redim"は指定した配列の要素数を変更するVBAのステートメントです。"Preserve"キーワードとともに使用すると、既に配列に格納されている値を保持したまま要素数を変更することができます。

30行目〜34行目
ワークシートから読み取ったX, Y座標が3組以上の場合は頂点座標リストpを引数としてPlotAcad関数を呼び出し、それ以外の場合はメッセージを表示してプロシージャを終了します。

● PlotAcadプロシージャ

PlotAcadプロシージャは、GetCellプロシージャから頂点座標リストを受け取り、AutoCADのモデル空間にポリラインを作図するプロシージャです。

> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

6行目
チェックボックス「CheckClose」がチェックされている場合は作図したポリラインを閉じます。

8行目〜10行目
チェックボックス「CheckZoom」がチェックされている場合は、ApplicationオブジェクトのZoomExtentsメソッドを呼び出して現在のビューポートを図面範囲までズームします。

なお、チェックボックスのValueプロパティはチェックボックスがチェックされているとTrueを返し、チェックされていない場合はFalseを返します。

今回のプログラムでは、Excelのワークシート上に配置したコマンドボタンを押すことによりVBAプログラムを実行できるようにしたいので、コマンドボタン「CommandPlot」のClickイベントプロシージャを作成します。

連載第11回で説明したユーザーフォームの時と同様に、「Sheet1」のコードウィンドウ上部左側にある[オブジェクト]ボックスで[CommandPlot]を選択し、右側の[プロシージャ]ボックスで[Click]イベントを選択するとコマンドボタン「CommandPlot」のClickイベントプロシージャの雛形がコードウィンドウに挿入されます。そして挿入された「Private Sub CommandPlot_Click()」から「End Sub」の間に以下のコードを記述します。

[オブジェクト]ボックスと[プロシージャ]ボックス
[オブジェクト]ボックスと[プロシージャ]ボックス

● CommandPlot_Clickプロシージャ

CommandPlot_Clickプロシージャは、コマンドボタン[CommandPlot]がクリックされた時に呼び出されるイベントプロシージャです。

> プログラムコードを別ウィンドウで表示 ※ 行番号を入力する必要はありません

1行目〜5行目
コマンドボタン「CommandPlot」をクリックすると、このプログラムのエントリーポイントである「ExcelToAcad」プロシージャが呼び出され、プログラムの実行が開始されます。

■ プログラムの実行

すべてのプログラムコードを入力したらVBエディタを閉じ、コントロールツールボックスの[デザインモード]ボタンの選択を解除します。そして、ワークシートにポリラインの頂点となるX, Y座標値を3組以上入力し、コマンドボタンをクリックすると、プログラムの実行が開始され、AutoCADのモデル空間に指定したポリラインが作図されます。また、AutoCAD VBAと同様に、作成したプログラムはExcelの[マクロ]メニューの[マクロ…]から「ExcelToAcad」を選択して実行することもできます。

Excel VBAからAutoCADを操作する場合でも、AutoCADのApplicationオブジェクトを取得して図面(Documentオブジェクト)を作成した後は、AutoCAD VBAでAutoCAD自身を操作する時とほぼ同じプログラムコードで記述できることがわかると思います。このように一度VBAでオブジェクトを操作する方法を習得してしまえば、AutoCAD VBAであろうとExcel VBAであろうとその習得したスキルを活用することができるのです。

[マクロの警告]ダイアログ

[マクロの警告]ダイアログ
[マクロの警告]ダイアログ

ExcelやWordのVBAプログラムは、ワークブックや文書ファイルに埋め込まれて保存されます。しかし、以前VBAを悪用したマクロウィルスが流行したため、ExcelやWordのセキュリティ機能が強化され、既定ではファイルに埋め込まれたVBAプログラムを実行することができなくなってしまいました。

ExcelやWordでファイルに埋め込まれたVBAプログラムを実行できるようにするには、[ツール]メニューの[マクロ] - [セキュリティ...]でセキュリティレベルを「中」に設定します。セキュリティレベルを「中」に設定すると、信頼のおける発行元リストに載っていない発行元が作成したVBAプログラムが埋め込まれたファイルを開くたびに、上図に示すような[マクロの警告]ダイアログが表示され、VBAプログラムを有効にするか無効にするかを選択できるようになります。

なお、AutoCADでもVBAプログラムが埋め込まれた図面ファイルを開いたり、AutoCAD VBAプロジェクトファイル(拡張子dvb)をロードしたりした時に、同様のダイアログが表示されます。

■ まとめ

この連載もいよいよ今回で最終回となりました。説明が足りない部分も数多くあったと思いますが、AutoCAD VBAプログラミングの世界を感じていただけたでしょうか。AutoCAD VBAの教科書はAutoCADの開発者用ヘルプの中にあります。わからないことがあったら、まずは開発者用ヘルプをよく読んでみてください。そして、ヘルプに掲載されているサンプルプログラムを実際に動かしてみてください。それがAutoCAD VBA習得の一番の近道です。
SeaGate
コレクション



inserted by FC2 system