こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩抜け出し、「自分の手で図面を意のままに操りたい」と願うあなたなら、きっと今日のテーマにワクワクするはずです。
現場でこんな悩みを持ったことはありませんか?
「数十枚もある図面の画層(レイヤー)のON/OFFやフリーズ状態を、一括でピタッと揃えたい……。1枚ずつ開いて設定を変えるなんて、気が遠くなる!」
そう、人間が手作業でやればミスも起きるし、何より時間の無駄です。
今回は、AutoCADの根幹である `AcadApplication` オブジェクト をフル活用し、複数図面の画層状態を華麗に、そして一瞬で自動同期させるプロフェッショナルなテクニックを伝授します。
ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に次のステージへ到達します。さあ、一緒に本質を紐解いていきましょう!
—
1. なぜ「AcadApplication」なのか?(オブジェクトモデルの核心)
AutoCAD VBAを書き始めると、まずは現在開いている図面を操作する `ThisDrawing`(これは `AcadDocument` です)をよく使いますよね。
しかし、複数の図面をまたいで一括処理をしたい場合、`ThisDrawing` だけでは太刀打ちできません。
ここで登場するのが、AutoCADそのものを統括する最高司令官、`AcadApplication` です。
[AcadApplication (AutoCAD アプリケーション)]
┣━ Documents コレクション (開いているすべての図面)
┃ ┣━ AcadDocument (図面A:同期の「お手本」)
┃ ┣━ AcadDocument (図面B:同期先)
┃ ┗━ AcadDocument (図面C:同期先)
`AcadApplication` を経由することで、現在画面に表示されていない図面すら背後で開かせ、メモリ上で自在に料理することができるようになります。この「アプリケーション全体を俯瞰する視点」こそが、業務自動化エンジニアの第一歩なのです。
—
2. 画層同期の全体像と設計思想
今回は、次のようなシナリオを想定します。
1. 基準となる図面(お手本)を開いておく。
2. マクロを実行すると、特定のフォルダ内にある他の図面を次々とバックグラウンド(またはアクティブ)で開く。
3. お手本図面の「画層のON/OFF」「フリーズ」「色」などの状態を読み取り、同期先の図面の同名画層に強制適用する。
4. 変更を保存して閉じる。
プログラミングにおいて最も重要なのは、「エラーが起きたときに図面が開きっぱなしにならないようにする(後始末)」ことです。ここを妥協すると、実務で痛い目を見ます。
—
3. 実装コード:複数図面の画層を同期するマクロ
それでは、現場でそのままコピペして使える実用コードを公開します。VBAの標準モジュールに貼り付けて実行してください。
Sub SyncLayersAcrossDocuments()
Dim acadApp As AcadApplication
Dim masterDoc As AcadDocument
Dim targetDoc As AcadDocument
Dim folderPath As String
Dim fileName As String
Dim masterLayers As Object ‘ 画層状態を保持する辞書(Dictionary)
Dim lay As AcadLayer
‘ 1. AcadApplication の取得(AutoCADの根幹オブジェクト)
Set acadApp = ThisDrawing.Application
Set masterDoc = acadApp.ActiveDocument
‘ 【重要】基準となる図面が保存されているかチェック
If masterDoc.Path = “” Then
MsgBox “基準となる図面を一度保存してから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. 基準図面の画層状態をメモリ(Dictionary)に記憶する
Set masterLayers = CreateObject(“Scripting.Dictionary”)
For Each lay In masterDoc.Layers
‘ 画層名義をキーにして、[表示(On), フリーズ(Freeze)] の配列を格納
Dim state(0 To 1) As Boolean
state(0) = lay.LayerOn
state(1) = lay.Freeze
masterLayers.Add lay.Name, state
Next lay
‘ 3. 同期対象のフォルダを指定(今回は基準図面と同じフォルダとする)
folderPath = masterDoc.Path & “\”
fileName = Dir(folderPath & “.dwg”)
‘ 4. ループ処理:フォルダ内の図面を次々と開いて同期
acadApp.Documents.Open (folderPath & fileName) ‘ 最初の1つ目(自分自身が含まれる可能性を考慮)
Do While fileName <> “”
Dim targetFullPath As String
targetFullPath = folderPath & fileName
‘ 基準図面自分自身はスキップ
If UCase(targetFullPath) <> UCase(masterDoc.FullName) Then
‘ 図面を開く(裏で開く場合はVisibleプロパティの制御が必要だが、今回は確実性を重視しアクティブで開く)
Set targetDoc = acadApp.Documents.Open(targetFullPath)
‘ — 同期ロジックの実行 —
For Each lay In targetDoc.Layers
‘ お手本図面に存在する画層であれば、状態を合わせる
If masterLayers.Exists(lay.Name) Then
Dim masterState As Variant
masterState = masterLayers(lay.Name)
‘ 画層のON/OFF設定(現在層はOFFにできない仕様等があるためエラー対策を考慮)
On Error Resume Next
lay.LayerOn = masterState(0)
lay.Freeze = masterState(1)
On Error GoTo 0
End If
Next lay
‘ 保存して閉じる
targetDoc.Close True ‘ True = 変更を保存する
End If
‘ 次のファイルへ
fileName = Dir()
Loop
‘ 後片付け
Set masterLayers = Nothing
MsgBox “すべての図面の画層同期が完了しました!”, vbInformation, “処理終了”
End Sub
—
4. コードの深掘りポイントと「プロの知見」
このコードには、現場で生き残るためのテクニックがいくつか詰められています。
① `Scripting.Dictionary` による高速メモリキャッシュ
毎回図面を開閉して画層のプロパティを比較するのは非効率です。最初に `masterDoc` の画層状態をメモリ上の辞書(Dictionary)にすべて吸い上げておくことで、ターゲット図面を処理するときの速度が圧倒的に向上します。
② `On Error Resume Next` の正しい使い所(仕様の罠回避)
AutoCADには、「現在アクティブになっている画層」や「画層 0 (Layer 0)」「Defpoints」など、強制的にOFFやフリーズができない特殊な画層が存在します。
これらをプログラムが無理やり変更しようとすると、容赦なく実行時エラー(Runtime Error)でマクロがクラッシュします。そのため、画層プロパティの書き換え部分だけは `On Error Resume Next` でガードし、エラーを華麗にいなすのが定石です。
③ ファイル名の自己衝突回避
`Dir関数` でフォルダ内の `.dwg` を総なめにする際、「今開いている基準図面自身」を処理対象に巻き込んでしまうと、自分自身を上書き保存して閉じようとしておかしな挙動になります。`UCase(targetFullPath) <> UCase(masterDoc.FullName)` という厳密なパス比較で、自分自身を弾くガードを必ず仕込んでおきましょう。
—
まとめ:ここをクリアすれば、もう怖くない!
お疲れ様でした! `AcadApplication` を使った複数図面のコントロール、そのイメージは掴めましたか?
「画面上の図面をポチポチ操作する」という呪縛から解放され、コードを通じてAutoCADのエンジンそのものを動かせるようになると、業務自動化の世界は一気に広がります。
最初は難しく感じるかもしれませんが、オブジェクトの階層構造(Application > Documents > Document > Layers)を意識するだけで、どんな複雑な要件もスルスルとコードに落とし込めるようになります。
ぜひ、あなたの手元の図面フォルダで試してみてくださいね。ここをクリアしたあなたなら、もうAutoCAD VBAの基礎はバッチリです!次回の応用編もお楽しみに。
