【入門編】【実務中級者向け】図面保存時の「全レイアウトのページ設定」自動同期:印刷設定を最新のDWTから強制上書きしてセーブ – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】図面管理の「揺らぎ」をゼロにする:DWTテンプレートを用いた全レイアウト・ページ設定の強制同期術

「よし、図面は完成だ。あとは印刷するだけだ……」

そう思って印刷ボタンを押した瞬間、愕然としたことはありませんか?
「A3で出すはずが、なぜか一部のレイアウトだけA4になっている」「プリンタの設定が古いバージョンのまま、別のドライバを指している」「プロットスタイル(CTB)が適用されていない……」

これこそが、実務における「レイアウトの揺らぎ」という、エンジニアを精神的に蝕む静かなるバグです。

図面が大規模になればなるほど、手動でのページ設定確認は不可能です。マクロの記録(レコーディング)で「印刷ボタンを押す動作」を記録するだけでは、この問題は解決しません。なぜなら、私たちが制御すべきは「操作」ではなく、「オブジェクトのプロパティ(属性)」だからです。

今日は、図面を保存する直前に、マスターとなるテンプレート(DWT)から最新のページ設定を全レイアウトに強制的に流し込み、印刷環境の「完全な同期」を実現する、一歩上のVBAテクニックを伝授しましょう。

1. 思考の設計図:なぜ「上書き」が必要なのか?

まず、AutoCADのオブジェクトモデルを理解しましょう。
「レイアウト」は単なるタブではありません。それは、`Layout`オブジェクトという実体であり、その中に`Plot`(印刷)に関連する膨大なプロパティを保持しています。

通常、ユーザーはレイアウトをコピーして図面を作成しますが、その過程で「誰かが設定を変えてしまった」「テンプレート自体が更新された」という事態が必ず発生します。

今回の戦略はこうです。
1. マスター(DWT)をバックグラウンドで開く。
2. 現在の図面の全レイアウトを一つずつ走査する。
3. マスター側に同じ名前のレイアウトがあれば、そのページ設定(プリンタ、用紙サイズ、プロットスタイル等)を現在の図面にコピーする。
4. 現在の図面をセーブする。

これにより、図面ファイルがどんなに長く使われていても、常に「最新の社内標準」に強制的に引き戻すことができるのです。

2. 実装:全レイアウト・ページ設定同期マクロ

ここからはコードの世界です。このコードは、単なるコピペ用ではありません。コメントを読み、「どのオブジェクトの、どのプロパティを操作しているのか」を意識しながら読んでください。

'==============================================================================
' Module: LayoutSyncModule
' Description: DWTテンプレートから全レイアウトのページ設定を強制同期する
' Author: Legendary Chief Architect
'==============================================================================

Option Explicit

Sub SyncAllLayoutsFromTemplate()
    Dim currentDoc As AcadDocument
    Dim templateDoc As AcadDocument
    Dim templatePath As String
    Dim targetLayout As AcadLayout
    Dim sourceLayout As AcadLayout
    Dim layoutFound As Boolean
    
    ' --- 設定エリア ---
    ' 使用する最新のテンプレートファイルのフルパスを指定してください
    templatePath = "C:\Standard\Company_Standard_A3.dwt"
    ' ------------------

    Set currentDoc = ThisDrawing
    
    ' 1. テンプレートファイルが存在するかチェック
    If Dir(templatePath) = "" Then
        MsgBox "エラー: テンプレートファイルが見つかりません。" & vbCrLf & templatePath, vbCritical
        Exit Sub
    End If

    On Error GoTo ErrorHandler
    Application.ScreenUpdating = False ' 画面更新を停止してパフォーマンスを向上

    ' 2. テンプレートをバックグラウンド(非表示に近い状態)で開く
    ' ※Documents.Openは、開いたドキュメントをコレクションに追加します
    Set templateDoc = Documents.Open(templatePath)

    ' 3. 現在の図面の全レイアウトをループ処理
    For Each targetLayout In currentDoc.Layouts
        
        ' Model空間(モデルタブ)は印刷設定の対象外とするのが一般的
        If targetLayout.Name <> ThisDrawing.ModelSpace.Name Then
            
            layoutFound = False
            
            ' 4. テンプレート側のレイアウトから、名前が一致するものを探す
            For Each sourceLayout In templateDoc.Layouts
                If sourceLayout.Name = targetLayout.Name Then
                    
                    ' --- ここが核心:プロパティの同期 ---
                    ' 印刷設定の重要項目を一つずつ移植する
                    
                    ' プリンタ名 (ConfigName)
                    targetLayout.ConfigName = sourceLayout.ConfigName
                    
                    ' 用紙サイズ (CanonicalMediaName) 
                    ' ※ここが最もエラーが出やすい。文字列が完全に一致する必要がある
                    targetLayout.CanonicalMediaName = sourceLayout.CanonicalMediaName
                    
                    ' プロットスタイルテーブル (PlotStyleTable)
                    targetLayout.PlotStyleTable = sourceLayout.PlotStyleTable
                    
                    ' 印刷方向 (PlotRotation)
                    targetLayout.PlotRotation = sourceLayout.PlotRotation
                    
                    ' 印刷尺度 (StandardScale)
                    targetLayout.StandardScale = sourceLayout.StandardScale
                    
                    ' 印刷領域 (PlotType)
                    targetLayout.PlotType = sourceLayout.PlotType
                    
                    layoutFound = True
                    Exit For ' 一致するものが見つかったので、テンプレートのループを抜ける
                End If
            Next sourceLayout
            
            ' もしテンプレートに同名のレイアウトがなかった場合の処理
            If Not layoutFound Then
                Debug.Print "Warning: レイアウト '" & targetLayout.Name & "' はテンプレートに存在しません。スキップします。"
            End If
            
        End If
    Next targetLayout

    ' 5. テンプレートを保存せずに閉じる(メモリ解放)
    templateDoc.Close False
    
    Application.ScreenUpdating = True
    MsgBox "全てのレイアウトのページ設定を最新のテンプレートから同期しました。", vbInformation, "完了"
    Exit Sub

ErrorHandler:
    Application.ScreenUpdating = True
    MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Description: " & Err.Description, vbCritical, "致命的エラー"
    
    ' エラー時もテンプレートを閉じる試みを行う
    If Not templateDoc Is Nothing Then templateDoc.Close False
End Sub

3. プロが教える「陥りやすい罠」と回避策

このコードを実戦投入する前に、必ず知っておいてほしい「技術的落とし穴」が3つあります。ここをクリアできれば、あなたはもう初級者ではありません。

① `CanonicalMediaName` の呪縛

コード内で最も重要なのが `targetLayout.CanonicalMediaName = sourceLayout.CanonicalMediaName` です。
AutoCADにおける用紙サイズは、「A3」といった人間向けの名称ではなく、内部的な「Canonical(正準)」な名称で管理されています。
例えば、同じA3でも、プリンタドライバが変わるとこの文字列が微妙に変わります。
対策: 必ず「同じプリンタドライバを使用しているDWT」をマスターにしてください。

② オブジェクトのライフサイクルとメモリ

`templateDoc.Close False` を忘れないでください。
マクロの中で別のファイル(DWT)を開くとき、そのファイルはAutoCADの `Documents` コレクションに居座り続けます。これを閉じ忘れると、メモリを食いつぶし、最悪の場合AutoCADがクラッシュします。必ず `False`(変更を保存せずに閉じる)を指定して、読み取り専用として扱うのが鉄則です。

③ レイアウト名の不一致

このコードは「名前が一致すること」を前提にしています。
実務では「Layout1」が「1号図面」に書き換えられていることがよくあります。もし名前がバラバラな運用をしている場合は、名前で探すのではなく、「特定のルール(例:レイアウトの順番)」や「特定のプロパティの有無」で紐付けるロジックへのアップグレードが必要になります。

まとめ:自動化は「守り」のためにある

プログラミングの目的は、新しい機能を作ることだけではありません。
「誰がやっても、いつやっても、同じ結果が出る」という安心感(品質の担保)を提供することにあります。

今回紹介した「ページ設定の強制同期」は、派手な機能ではありません。しかし、現場で発生する「印刷ミスによる手戻り」という最大のコストを、ゼロに近づけるための強力な武器になります。

「マクロの記録」の階段を登りきったあなた。次は、こうしたオブジェクトの構造を理解した制御に挑戦してみてください。そこには、AutoCADを真に支配する快感が待っていますよ。

応援しています。次は、さらに深い自動化の世界でお会いしましょう。

タイトルとURLをコピーしました