AutoCAD VBAでExcelを操作する方法|AutoCAD VBAマクロの作成方法
本ページではAutoCAD VBAでExcelを操作する方法を解説していきます。
AutoCADとExcelと連携することで作業内容によっては非常に効率を上げることができます。
Excel操作のコードを作成するにはExcel VBAの知識が必要になってくるので、Excel VBAに知見の無い方はある程度Excel VBAの知識を付けてから始めることをおすすめします。
本ページで学ぶことのできる内容は以下のとおりです。
AutoCAD VBAでExcelを操作する方法
AutoCAD VBAの事前準備
AutoCAD VBAでExcelを操作するには以下の2つの準備をする必要があります。
① AutoCAD VBAにExcel VBAのライブラリを読み込む
② AutoCAD VBAにExcelを呼び出すための構文を書く
このうち①のライブラリ読み込みは必須ではありませんが、読み込むとコードを作成する際にExcel VBA関連の型宣言(WorksheetやCells等)や入力候補の表示を行うことができるようになるので、深く理解できるまでは基本的に読み込ませておくことをおすすめします。
AutoCAD VBAにExcel VBAのライブラリを読み込む
AutoCAD VBAでExcelを操作するには大前提として「参照設定」というものでExcel VBAのオブジェクト認識することができるように「ライブラリ」を読み込ませる必要があります。
デフォルトの場合、AutoCAD VBAではAutoCAD専用のオブジェクト(AcadDoLine,ModelSpaceなど)のみを、Excel VBAではExcel専用のオブジェクト(WorkSheet,Cellsなど)のみしか読み込むことができません。これをAutoCAD VBAからAutoCAD専用のオブジェクトだけでなくExcel専用のオブジェクトも読み込むことができるようにすればAutoCAD VBAでExcelを操作することができるようになります。
「ライブラリ」とは簡単にいうとVBAのオブジェクトがまとめられた本のようなものです。
AutoCADはAutoCAD VBAに関する本、ExcelはExcel VBAに関する本しか読んでいないため、AutoCADはExcel VBAに関する知識が一切ありません。そのためAutoCADに対してWorksheetの名前を変更したいと指示しても「Worksheetって何?」となりエラーが発生してしまいます。
しかし、AutoCADにAutoCAD VBAに関する本だけでなくExcel VBAに関する本も読ませてあげることで、AutoCADはWorksheetが何ものなのかを理解することができるようになります。
この、アプリケーションに何の本(ライブラリ)を読ませるのかを指定するのが参照設定です。
Excel以外にも本が用意されているアプリケーションであれば、その本をAutoCADに読ませてあげることでそれらのアプリケーションを操作することも可能になります。
※厳密にいえば参照設定はあくまでもAutoCADのVBE上で外部アプリケーションのオブジェクトの型を認識できるようにするためのものであり、参照設定がされていなくても正しいコードが書けていて、必要なライブラリが同端末内に存在していれば外部アプリケーションの操作自体は可能です。
ライブラリの設定
VBEのメニューバー>[ツール]>[参照設定]を押下して参照設定ウィンドウを表示させます。
参照可能なライブラリファイルのリストからExcel VBAライブラリにチェックを付けます。
Excel VBAライブラリは「Microsoft Excel ○○.○ Object Library」です。
チェックの付与ができたらウィンドウ右上の[OK]ボタンを押下することで参照設定完了です。
参照設定の情報はプロジェクトファイル(.dvb)に格納されるため、新規プロジェクトファイルを作成するとデフォルトの参照設定に戻ります。Excel(およびその他のアプリケーション)をAutoCAD VBAで使用する場合はプロジェクト毎に参照設定を見直す必要があります。
AutoCAD VBAにExcelを呼び出すための構文を書く
ライブラリの設定ができたら以下のコードを記載します。
コードを書かないとライブラリを読み込んでいいても、Excelは使えないので注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub main() Dim oExcel As Excel.Application Dim wb As Workbook Dim ws As Worksheet 'Excelアプリケーション作成 Set oExcel = CreateObject("Excel.Application") 'Excel新規ブックを作成して1つ目のシートを取得 Set wb = oExcel.Workbooks.Add Set ws = wb.Sheets.Item(1) '【Excelを使った処理】 'Excelを表示 oExcel.Visible = True 'Excel解放 Set oExcel = Nothing End Sub |
このコードに関してはあまり深く考えずに「Excelを使うときにはこのコードを書く」と丸暗記しておけば大丈夫です。(詳しく知りたい方は「GetObject」や「CreateObject」で検索してみて下さい)
これによりExcelの最上位オブジェクトであるExcel.Applicationを変数oExcelに格納することができます。これによりoExcelからWorkbookやWorksheet、Cellsなどにもアクセスすることができるようになります。たとえば以下のコードを書くとExeclのA1に「Macro」と書き出すことができます。
ws.Cells(1, 1).Value = “Macro”
サンプルコード
ここではサンプルとして「アクティブドキュメントのモデル空間内にある、すべての線分の始終点座標をExcelに書き出すマクロ」を紹介します。コードは以下のとおりです。参照設定はしていなくても動くようにExcelアプリケーションやシートを格納する変数の型はObjectとしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Sub main() Dim oExcel As Object 'Excel.Application Dim wbExport As Object 'Workbook Dim wsExport As Object 'Worksheet Dim mdlSpace As AcadModelSpace Dim oEntity As AcadEntity Dim oLine As AcadLine Dim r As Long r = 2 'Excelアプリケーション作成 Set oExcel = CreateObject("Excel.Application") 'Excel新規ブックを作成して1つ目のシートを取得 Set wbExport = oExcel.Workbooks.Add Set wsExport = wbExport.Sheets.Item(1) 'シート1行目にラベルを記入 wsExport.Cells(1, 1).Value = "始点X座標" wsExport.Cells(1, 2).Value = "始点Y座標" wsExport.Cells(1, 3).Value = "終点X座標" wsExport.Cells(1, 4).Value = "終点Y座標" 'アクティブドキュメントのModelSpace取得 Set mdlSpace = ThisDrawing.ModelSpace 'アクティブドキュメントのモデル空間内の要素ループ For Each oEntity In mdlSpace '要素のタイプが線分かを判定 If TypeName(oEntity) = "IAcadLine" Then Set oLine = oEntity wsExport.Cells(r, 1).Value = oLine.StartPoint(0) wsExport.Cells(r, 2).Value = oLine.StartPoint(1) wsExport.Cells(r, 3).Value = oLine.EndPoint(0) wsExport.Cells(r, 4).Value = oLine.EndPoint(1) r = r + 1 End If Next 'Excelを表示 oExcel.Visible = True 'Excel解放 Set oExcel = Nothing End Sub |
モデル空間内の要素はModelSpace内のItemをFor~Each文でループしていけば網羅することができます。このときループ変数をAcadEntity型とすることで形状やハッチング、寸法、テキスト等のすべてを包含したループを行うことが可能です。(さらに上位の型であるAcadObjectやObjectでも可)
上記コードでは線分のみを処理の対象としているので、TypeName関数を使ってAcadEntity型の中でもAcadLine型である、つまりは線分である要素のみに処理が行われるよう条件分岐をしています。
線分の始点終点の座標はそれぞれAcadLine型のStartPointプロパティとEndPointプロパティで取得可能です。両プロパティはDouble型の配列で要素0番目がX座標、1番目がY座標、2番目がZ座標となっています。ここでは2次元線分を想定しているので2番目要素は無視しています。
まとめ
今回の内容をまとめると以下のとおりです。
AutoCAD VBAでExcelを操作するには以下の2つを行う必要がある
① AutoCAD VBAにExcel VBAのライブラリを読み込む
② AutoCAD VBAにExcelを呼び出すための構文を書く
AutoCAD VBAでもExcelを操作する書き方はExcel VBAと同じ
本ページのサンプルコードではExcelに値を出力しただけで罫線や色の設定等は何も行っていません。ここに「罫線を引く」「中央揃えにする」「小数点第2位を四捨五入する」等の処理を追加することで、出力の体裁を整えることができますが、それはExcel VBAの分野になります。
Excel VBAの書き方は調べればほとんど出てきます。AutoCADとつなげることでより効率よく作業を行える場面も多々あると思うので、ぜひこの機会にExcel VBAもあわせて勉強してみて下さい。