【AutoCAD VBA 掌握への道】第1回:Documents.Addによる「社内標準テンプレート」からの堅牢な新規図面作成自動化
こんにちは。AutoCADの自動化設計において、数々の泥臭いトラブルと向き合ってきたチーフアーキテクトの私だ。
業務効率化の第一歩として、マクロで新しい図面を開く処理を書いたことはないだろうか?
多くの初心者が最初に直面するのが、「まっさらな(設定のない)図面が開き、気づけば画層も文字スタイルもバラバラのゴミ図面が量産される」という悪夢だ。
今回は、AutoCAD VBAにおける図面ファウンデーションの要、`Documents.Add` メソッドを完全掌握し、社内標準が完璧に適用された状態の新規図面をノーミスで立ち上げる「プロダクション品質」のコードを授けよう。
—
なぜ `Workbooks.Add`(Excel)の感覚で書くと失敗するのか?
Excel VBAの感覚で `Workbooks.Add` と叩くと、Excel側が勝手にデフォルトのブックを作ってくれる。
しかし、AutoCADの世界はそう甘くない。CAD図面には「図面テンプレート(DWT)」という概念があり、これが欠落した新規作成は、「家具のないコンクリートむき出しの部屋」に住み始めるようなものだ。
画層(Layer)、文字スタイル(Text Style)、寸法スタイル(Dimension Style)、線種(Linetype)。これらが定義されていない図面から作図を始めると、後工程の自動化スクリプトがすべて破綻する。
だからこそ、「どのテンプレートファイルを読み込んで新規作成するか」をコードで完全に統制しなければならない。
—
堅牢な設計の要件定義
実務で耐えうるコードを書くために、以下の3点を担保する。
1. ハードコーディングの排除
テンプレート(.dwt)のパスをコードにベタ書きしない。PC環境が変わるだけで即死するためだ。
2. パス存在確認の厳格化
指定したDWTファイルが存在しない場合、サイレントエラーで勝手にデフォルト図面が開くのを防ぎ、即座にユーザーへ警告を飛ばす。
3. エラーハンドリングの網羅
AutoCAD特有のCOM例外を捕捉し、アプリケーションの状態をクリーンに保つ。
—
プロダクションコード:社内標準テンプレートからの新規作成
以下のコードを、あなたのVBAエディタ(IDE)の標準モジュールに貼り付けてほしい。実務でそのまま使える、堅牢性と美しさを兼ね備えたコードだ。
Option Explicit
‘ ==============================================================================
‘ 処理名 : CreateNewDrawingFromTemplate
‘ 概要 : 指定された社内標準テンプレートから新しい図面を生成する
‘ 備考 : AutoCAD VBA / Documents.Add メソッドの堅牢なラッパー
‘ ==============================================================================
Public Sub CreateNewDrawingFromTemplate()
‘ 1. 宣言セクション
Dim targetDoc As AcadDocument
Dim templatePath As String
Dim fso As Object
‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler
‘ 2. テンプレートパスの定義
‘ ※実務ではINIファイルやレジストリ、あるいは固定のネットワークパスから取得することを推奨
‘ ここでは例として、ユーザーのドキュメントフォルダ内にあるテンプレートを指定
templatePath = “C:\CAD_Standards\Templates\Company_Standard_2024.dwt”
‘ 3. ファイルシステムオブジェクトによる存在確認(極めて重要)
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(templatePath) Then
MsgBox “致命的なエラー: 社内標準テンプレートが見つかりません。” & vbCrLf & _
“パスを確認してください: ” & templatePath, _
vbCritical, “テンプレート異常”
GoTo Finally
End If
‘ 4. Documents.Add メソッドによる図面生成
‘ 引数にDWTファイルのフルパスを渡すことで、設定済み図面としてインスタンス化される
Set targetDoc = ThisDrawing.Application.Documents.Add(templatePath)
‘ 5. 成功ログ(必要に応じてデバッグ出力)
Debug.Print “新規図面が正常に作成されました: ” & targetDoc.Name
‘ 正常終了ルート
GoTo Finally
ErrorHandler:
‘ AutoCAD特有の予期せぬCOMエラーをキャッチ
MsgBox “図面の新規作成中に予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, _
vbCritical, “システムエラー”
Finally:
‘ オブジェクトの解放(メモリリーク防止の鉄則)
Set fso = Nothing
Set targetDoc = Nothing
On Error GoTo 0
End Sub
—
コードの急所:プロのエンジニアが解説するポイント
1. `Documents.Add` の引数の魔力
`Documents.Add()` の括弧の中に文字列(DWTのフルパス)を渡すか渡さないかで、挙動が劇的に変わる。
- 引数なし:AutoCAD内蔵のデフォルト(味気ない)設定で新規作成。
- 引数あり(DWT):指定したテンプレートの全リソース(画層やブロック定義など)を継承して新規作成。
後者の実装こそが、「社内標準の統一」における絶対条件なのだ。
2. 事前イグニッションチェック(FSOの活用)
AutoCADのCOM APIは、存在しないパスを渡されたときに独自のダイアログを出して処理を止めてしまうことがある。これではバックグラウンドでの自動化や、一括処理の際にプログラムがフリーズしたように見えてしまう。
あらかじめ `Scripting.FileSystemObject` でファイルの存在を担保してから `Documents.Add` を叩く。これがプロのディフェンシブ・プログラミングだ。
3. 明示的なオブジェクト解放と `Finally` 構文の模倣
VBAには標準で `Try-Catch-Finally` 構造がないため、`On Error GoTo` を使って疑似的な終了処理ブロック(`Finally:`)を構築している。メモリリークやCOMオブジェクトの参照残りによるAutoCADの不安定化を防ぐため、オブジェクト変数の `Nothing` 代入は必ず通る動線にしておかなければならない。
—
次のステップへ向けて
このコードをベースに、次は「新規作成した図面に自動でタイトルブロック(表題欄)を挿入する」「指定フォルダに自動保存する」といったビジネスロジックを積み上げていくことになる。
基礎の土台が歪んでいれば、その上に築く自動化システムはすべて崩壊する。
まずは今回の `Documents.Add` によるテンプレート制御をマスターし、あなたの現場の図面品質をワンランク上のステージへと引き上げてほしい。
