AutoCAD VBAを掌握する極限の知見
【初心者向け】AcadApplication.Documents.Addのテンプレート指定:社内標準DWTを強制適用する新規図面作成マクロ
こんにちは。チーフアーキテクトの私だ。
これまで数多のCAD自動化プロジェクトを統括してきたが、現場から最も多く寄せられる悲鳴のような相談は決まってこうだ。
- 「新人がマクロで図面を作ると、決まってデフォルトの`acad.dwt`が読み込まれ、社内標準の画層(レイヤ)や文字スタイルが綺麗さっぱり消え失せる」
- 「後から全員分の図面を一括修正するのに、何十時間もドブに捨てることになった」
……いいかね?
AutoCAD VBAにおいて、ただ「新規図面を作る」だけのコードを書くのは素人だ。実務の世界では、「どのテンプレートを強制して図面を生み出すか」までをコントロールできなければ、自動化とは呼べない。ゴミを量産するだけのスクリプトになってしまう。
今回は、`AcadApplication.Documents.Add` メソッドを極め、社内標準DWT(テンプレート)を確実に適用した堅牢な新規図面作成マクロの設計思想と実装を伝授しよう。
—
1. なぜ「無引数での新規作成」は実務で地雷なのか?
初学者がよく書くコードがこれだ。
‘ 【アンチパターン】絶対に真似してはいけないコード
Sub BadExample_CreateDrawing()
Dim acadDoc As AcadDocument
‘ 引数を省略すると、AutoCAD内蔵のデフォルト設定(または最後に使われた設定)で開く
Set acadDoc = ThisDrawing.Application.Documents.Add
End Sub
このコードの何が問題か?
AutoCADの環境設定(`QNEW`コマンドのデフォルトテンプレートなど)は、ユーザーのローカル環境やPCの個体差によってバラバラだ。このコードを実行すると、ある人のPCでは綺麗に作れたのに、別の人のPCでは画層名が英語だったり、線種スケールが狂っていたりする「環境依存のバグ」の温床になる。
プロのエンジニアであれば、「コード側で強制的に社内標準DWTを指定する」のが鉄則である。
—
2. 堅牢な設計:パスのハードコーディングを排除する
実務でコードを書く際、テンプレートのパスを `C:\AutoCAD\Templates\CompanyStandard.dwt` などと直書き(ハードコーディング)する愚か者はいないだろう。ネットワークドライブの変更や、ユーザーごとのフォルダ構成の違いで一瞬で破綻するからだ。
ここでは、保守性を極限まで高めるための3つの設計原則を提示する。
1. パスの動的取得:アドインやマクロブックの相対パス、またはAutoCADのサポートパスからDWTの場所を特定する。
2. 存在確認(Error Guard):指定したDWTファイルが本当に存在するかを事前にチェックする。
3. エラーハンドリング:万が一の例外発生時にもAutoCADがフリーズしないクリーンな終了処理。
—
3. 【プロダクションコード】社内標準DWT強制適用マクロ
それでは、現場の第一線でそのまま使えるプロダクション品質のコードを公開しよう。このままVBAエディタ(IDE)に貼り付けて即座に活用してほしい。
Option Explicit
‘ ==============================================================================
‘ モジュール名: modCreateStandardDrawing
‘ 概要 : 社内標準テンプレートを強制適用した新規図面作成プロシージャ
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Public Sub CreateNewDrawingWithStandardDWT()
‘ 1. オブジェクト変数の宣言(メモリリークを防ぐため厳密に型指定)
Dim oApp As AcadApplication
Dim oDocs As AcadDocuments
Dim oTargetDoc As AcadDocument
‘ テンプレートファイルのパス設定
‘ ※実運用では、共有サーバーのパスや環境変数から取得するロジックに置き換えてください
Dim templatePath As String
‘ 例として、マクロ実行ブックと同じ階層にある「Standard_2024.dwt」を指定する場合
‘ ThisPath = ThisWorkbook.Path (ExcelVBAの場合) ですが、AutoCAD VBAでは ThisDrawing.Path を利用します
‘ ※未保存の図面の場合は ThisDrawing.Path が空になるため注意が必要です。
On Error GoTo ErrorHandler
‘ AutoCADアプリケーションインスタンスの取得
Set oApp = ThisDrawing.Application
Set oDocs = oApp.Documents
‘ テンプレートのフルパスを決定(環境に合わせて書き換えてください)
‘ ここではCドライブの直下を例示しますが、実際はネットワークパス等を推奨
templatePath = “C:\CAD_Standards\Templates\Company_Standard_A1.dwt”
‘ 2. テンプレートファイルの存在確認(極めて重要)
If Not FSO_FileExists(templatePath) Then
MsgBox “致命的なエラー: 社内標準テンプレートが見つかりません。” & vbCrLf & _
“パスを確認してください: ” & templatePath, vbCritical, “テンプレート異常”
Exit Sub
End If
‘ 3. Documents.Add メソッドにテンプレートパスを渡して新規図面作成
‘ ※ここが本テーマの核心です。引数にDWTのフルパスを渡します。
Set oTargetDoc = oDocs.Add(templatePath)
‘ 4. アクティブウインドウを新図面に切り替え
oApp.ActiveDocument = oTargetDoc
‘ 成功ログ(実務ではステータスバー表示やログ出力に置き換え)
oApp.Caption = “AutoCAD – [標準テンプレート適用済み新規図面]”
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合のハンドリング
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
‘ オブジェクトの解放
Set oTargetDoc = Nothing
Set oDocs = Nothing
Set oApp = Nothing
End Sub
‘ ==============================================================================
‘ 補助関数: ファイルの存在確認(FileSystemObjectを使用)
‘ ==============================================================================
Private Function FSO_FileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
FSO_FileExists = fso.FileExists(filePath)
Set fso = Nothing
End Function
—
4. コードの解説とアーキテクトからの助言
`oDocs.Add(templatePath)` のメカニズム
このメソッドの引数にDWT(またはDWG)ファイルのフルパスを渡すと、AutoCADはそのファイルをベースにして新しいデータベース(図面空間)をメモリ上に構築する。
結果として、画層(Layers)、文字スタイル(Text Styles)、寸法スタイル(Dimension Styles)、ブロック定義などが最初から完璧に整った状態で図面が立ち上がる。これによって、設計者が手動で初期設定を行う無駄な工数を「完全ゼロ」にすることが可能だ。
メモリ管理とオブジェクト参照の作法
VBAにおいて、`AcadApplication` や `AcadDocument` などのCOMオブジェクトは、明示的に解放しないとAutoCADのプロセス内にゴミ(参照カウントの残り)を残し、最悪の場合はAutoCAD自体の強制終了やメモリリークを引き起こす。
プロダクションコードでは、エラー時も含めて適切にオブジェクト変数を管理し、インスタンスの暴走を防ぐ設計にしている点を読み取ってほしい。
—
5. おわりに
たった1行、`Documents.Add` に引数を渡すという小さな違い。
しかし、この「こだわり」の積み重ねこそが、プロのエンジニアとアマチュアを分ける境界線だ。
社内標準を強制するこのマクロを導入するだけで、画層の消し忘れや規格外のフォント使用による手戻りは劇的に減少し、組織全体の生産性は確実に跳ね上がる。
ぜひ、あなたの現場のワークフローにもこの堅牢な設計を取り入れ、真の自動化を成し遂げてほしい健闘を祈る。
