【AutoCAD VBA極意】テンプレート管理から解放される!「擬似テンプレート」作成術
こんにちは。現場の自動化を支えるエンジニアの皆さん。
AutoCAD VBAの世界へようこそ。
「マクロの記録」ボタンを押して、記録されたコードを眺めては「……で、これをどう組み合わせて実務に使うんだ?」と立ち止まってしまう。そんな経験はありませんか?
実は、プログラミングの醍醐味は「記録された動作」をなぞることではなく、「オブジェクトの動きをコントロールすること」にあります。
今日は、初学者が最初につまずきやすく、かつ実務でめちゃくちゃ重宝するテクニックを伝授しましょう。テーマは、「既存図面の設定を丸ごと引き継いだ新しい図面を作る」、いわゆる『擬似テンプレート』オープン術です。
なぜ「テンプレートファイル(.dwt)」だけでは足りないのか?
通常、新しい図面を作る時は `Documents.Add(“C:\Template\Standard.dwt”)` のように、用意されたテンプレートファイルを指定します。これは正しい方法です。
しかし、現場ではこんな要望がよく飛び出します。
> 「今開いているこの図面、画層(レイヤー)の設定や文字スタイルがすごく使いやすいんだ。これと同じ設定で、新しい図面をサッと作りたいんだけど……」
テンプレートファイルを毎回更新して保存し直すのは面倒ですよね。
そこで、「今開いている図面(ActiveDocument)を、プログラム上で『型(テンプレート)』として扱い、その設定を新しい図面にコピーする」という手法をとります。これが「擬似テンプレート」です。
核心:オブジェクトの「参照」を意識せよ
ここが、凡庸なプログラマーと、一歩先を行くエンジニアの分かれ道です。
AutoCAD VBAにおいて、図面は `Document` オブジェクトとして管理されています。
新しい図面を作成した瞬間、AutoCADの「操作対象(ActiveDocument)」は、古い図面から新しい図面へと切り替わります。
ここで初心者がやりがちなミスがこれです:
「新しい図面を作ったから、そのまま `ThisDrawing.Layers.Add` と書けば、新しい図面に画層が追加されるはずだ!」
……残念ながら、それは間違いです。
`ThisDrawing` は、マクロが書き込まれている(あるいは実行を開始した)その図面を指し続けます。
新しい図面を操作するには、「新しい図面を、変数として明確に捕まえておく」必要があるのです。
実践:擬似テンプレート作成コード
では、実際に「現在の図面の画層設定をコピーして、新しい図面として保存する」コードを見てみましょう。
Option Explicit
' =================================================================
' プログラム名:PseudoTemplateCreator
' 概要:現在の図面の画層(Layer)設定を、新規作成した図面にコピーする
' ターゲット:プログラミング初学者・マクロ脱却を目指す方
' =================================================================
Sub CreatePseudoTemplate()
Dim currentDoc As AcadDocument
Dim newDoc As AcadDocument
Dim layerObj As AcadLayer
Dim newLayer As AcadLayer
Dim savePath As String
' 1. 現在の図面(コピー元)を確実に変数に格納する
' これを忘れると、操作対象が迷子になります
Set currentDoc = ThisDrawing
On Error GoTo ErrorHandler
' 2. 新しい図面を作成する
' 引数を空にすると、デフォルトのテンプレートで新規作成されます
Set newDoc = currentDoc.Application.Documents.Add
' 【重要】ここからは newDoc に対して操作を行います
Debug.Print "新しい図面を作成しました。"
' 3. 画層(Layer)のコピー処理
' コピー元(currentDoc)の画層を一つずつ見て、コピー先(newDoc)に作る
For Each layerObj In currentDoc.Layers
' 0番画層やDefpointsなど、システム標準の画層はスキップするか、
' エラーを回避するために慎重に扱う必要があります。
' ここではシンプルに「名前が同じものがなければ作る」ロジックにします。
On Error Resume Next ' 同名の画層がある場合のエラーを一時的に無視
Set newLayer = newDoc.Layers.Add(layerObj.Name)
If Err.Number = 0 Then
' 画層の色をコピーする
newLayer.color = layerObj.color
' 線種をコピーする
newLayer.Linetype = layerObj.Linetype
Debug.Print "画層をコピーしました: " & layerObj.Name
Else
' すでに存在する場合は、色だけ更新するなどの処理が可能
Set newLayer = newDoc.Layers.Item(layerObj.Name)
newLayer.color = layerObj.color
newLayer.Linetype = layerObj.Linetype
End If
On Error GoTo ErrorHandler ' エラーハンドリングを元に戻す
Next layerObj
' 4. 保存処理
' 保存先パスを構築(デスクトップに「New_Drawing_XXXX.dwg」として保存)
savePath = Environ("USERPROFILE") & "\Desktop\New_Drawing_" & Format(Now, "yyyymmdd_hhnnss") & ".dwg"
' 新しい図面を保存
newDoc.SaveAs savePath
MsgBox "擬似テンプレートによる新規作成が完了しました!" & vbCrLf & _
"保存先: " & savePath, vbInformation, "成功"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub
コードの解説:エンジニアの視点
このコードには、実務で生き残るための「知恵」が詰まっています。
① `Set currentDoc = ThisDrawing`
これが「設計図」の第一歩です。新しい図面を作ると、AutoCADの「意識」は新しい図面に向いてしまいます。だからこそ、「コピー元はこっちだよ!」と変数に記憶させておくのです。
② `On Error Resume Next` の使いどころ
画層のコピーでは、必ず「すでに存在する画層」にぶつかります。`Layers.Add` は、同じ名前の画層を作ろうとするとエラーを吐いて止まってしまいます。
ここで「エラーを無視して次へ進む」というテクニックを使い、「エラーが出たら既存のものを取得する」という柔軟な動きを実現しています。
③ `Environ(“USERPROFILE”)`
保存先を `C:\Users\…` と直接書くと、他の人のPCで動かした時にエラーになります。`Environ` 関数を使って、実行しているユーザーの環境に合わせてパスを動的に生成するのが、プロの作法です。
陥りやすいエラーと回避策
皆さんがこれから開発を進める中で、必ず遭遇する壁を先回りして教えておきますね。
1. 「画層が見つかりません」エラー
AutoCADには、システムが予約している画層(`0` 画層や `Defpoints` など)があります。これらを無理に操作しようとするとエラーになることがあります。今回のコードでは `On Error Resume Next` で回避していますが、より高度なプログラムでは「特定の名前を除外する」ロジックを組み込みます。
2. メモリの解放(ライフサイクル)
非常に大量の図面をループで処理する場合、`Set newDoc = Nothing` のように、使い終わったオブジェクトを明示的に解放する習慣をつけましょう。これは、AutoCADが突然クラッシュするのを防ぐための「おまじない」のようなものです。
おわりに:ここをクリアすれば、基本はバッチリ!
いかがでしたか?
「テンプレートファイルを用意する」という物理的な作業を、「プログラムによるオブジェクトの複製」という論理的な作業に置き換える。これができると、AutoCAD VBAの視界が一気に開けます。
「記録されたマクロ」は、あくまで「動かし方」のヒントです。
今回のように「どのオブジェクトが、どの図面に属しているのか」を意識してコードを書けるようになれば、あなたはもう立派な自動化エンジニアの仲間入りです。
一歩ずつ、楽しみながらコードを書いていきましょう。応援していますよ!
