【入門編】【実務中級】AutoCAD VBAで図面内の全レイアウト(Layout)を検索し、ページ設定(Page Setup)を自動適用・変更する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは。今日もAutoCADの自動化、楽しんでいますか?
現場の第一線で図面と格闘しているあなたなら、一度はこう思ったことがあるはずです。

「50枚もあるレイアウトのプリンター設定を、一つずつ手作業で直すなんて正気の沙汰じゃない……」

その直感、大正解です。人間はもっとクリエイティブな仕事に時間を使うべきですから。
今日は、AutoCAD VBAの核心である「オブジェクトモデル」を攻略しながら、図面内の全レイアウトへページ設定を瞬時に適用する、実戦的なプログラムを作り上げましょう。

ここをマスターすれば、あなたは「マクロを記録する人」から「AutoCADを自在に操るエンジニア」へと進化します。準備はいいですか?

1. AutoCAD VBAの「住所」を理解する

まず、コードを書く前に、AutoCADの内部構造を少しだけ覗いてみましょう。
AutoCAD VBAで何かを操作するときは、必ず「住所(階層)」を指定する必要があります。

1. AcadApplication: AutoCADそのもの
2. AcadDocument: 今開いている図面(`ThisDrawing`)
3. Layouts: 図面の中にある「レイアウト」のコレクション(まとまり)
4. Layout: 個別のレイアウト(「Sheet1」や「Model」など)

今回は、この Layouts(コレクション) の中を一つずつ調べて、ページ設定を上書きしていくという作戦を立てます。

2. 実践コード:全レイアウトへのページ設定一括適用

このコードは、あらかじめ図面内に作成しておいた「理想のページ設定(名前付きページ設定)」を、他のすべてのレイアウトにコピーするものです。

Option Explicit

‘——————————————————————
‘ 概要: 図面内の全レイアウトに指定した名前付きページ設定を適用する
‘ 開発者: AutoCAD Architecture Master
‘——————————————————————
Sub BatchApplyPageSetup()
Dim objLayout As AcadLayout
Dim objPlotConfig As AcadPlotConfiguration
Dim strTargetSetup As String
Dim boolFound As Boolean

‘ — 設定エリア —
‘ 適用したい「名前付きページ設定」の名前を入力してください
strTargetSetup = “A3_PDF出力設定”
‘ ——————

On Error GoTo ErrorHandler

‘ 1. 指定したページ設定が図面内に存在するかチェック
boolFound = False
Dim i As Integer
For i = 0 To ThisDrawing.PlotConfigurations.Count – 1
If ThisDrawing.PlotConfigurations.Item(i).Name = strTargetSetup Then
Set objPlotConfig = ThisDrawing.PlotConfigurations.Item(i)
boolFound = True
Exit For
End If
Next i

If Not boolFound Then
MsgBox “設定失敗: ‘” & strTargetSetup & “‘ というページ設定が見つかりません。” & vbCrLf & _
“先に「ページ設定マネージャ」で設定を作成してください。”, vbCritical
Exit Sub
End If

‘ 2. 全レイアウトをループして設定を適用
‘ Layoutsコレクションには「モデル」も含まれる点に注意!
For Each objLayout In ThisDrawing.Layouts

‘ モデル空間を除外したい場合は、以下のコメントを解除してください
‘ If objLayout.Name <> “Model” Then

‘ ここが魔法の1行。ページ設定の内容をレイアウトにコピーします
objLayout.CopyFrom objPlotConfig

‘ 内部的な更新をかける(これを忘れると表示が崩れることがあります)
objLayout.RefreshPlotDeviceInfo

Debug.Print “適用完了: ” & objLayout.Name

‘ End If
Next objLayout

MsgBox “全てのレイアウトに ‘” & strTargetSetup & “‘ を適用しました!”, vbInformation, “自動化成功”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbExclamation
End Sub

3. チーフアーキテクトによる深掘り解説

なぜ `CopyFrom` を使うのか?

初学者の多くは、`objLayout.ConfigName = “PDF.pc3″` のように、プロパティを一つずつ書き換えようとして迷路に迷い込みます。しかし、プロの書き方は違います。
`CopyFrom` メソッドは、プリンター、用紙サイズ、印刷スタイル、尺度など、「ページ設定」に含まれる膨大なパラメータをパケットのように一括で流し込みます。 これが最も安全で、最も高速な方法です。

`Layouts` コレクションの罠

コード内に `For Each objLayout In ThisDrawing.Layouts` という記述がありますね。
実は、AutoCADにとって 「モデル空間(Model)」もレイアウトの一つ です。
もし「モデル空間の設定は変えたくない」という場合は、コード内のコメントにあるように、名前が `”Model”` でないかチェックするIF文を追加するのが現場の作法です。

`RefreshPlotDeviceInfo` の重要性

設定を流し込んだ直後、AutoCADの内部では「本当にそのプリンターで、その用紙サイズが使えるか?」の再計算が行われません。`RefreshPlotDeviceInfo` を呼ぶことで、VBAからAutoCADに対して「最新の状態に同期してね」と合図を送ることができます。これがあるだけで、印刷時のエラー率が劇的に下がります。

4. 陥りやすいエラーと対策

1. 「ページ設定が見つかりません」

  • 原因:コード内の `strTargetSetup` と、実際のページ設定名が1文字でも違う(全角半角の差など)。
  • 対策:ページ設定マネージャから名前をコピー&ペーストしましょう。

2. 実行中にフリーズする

  • 原因:図面が非常に重いか、他のコマンドが実行中。
  • 対策:ESCキーで中断できるよう、ループの途中に `DoEvents` を入れるのも一つの手ですが、まずは図面の `Purge`(名前削除)をしてから実行するのがスマートです。

最後に:一歩先のアドバイス

お疲れ様でした。このコードが動いた瞬間、あなたは手作業の呪縛から解き放たれます。

次のステップとして、「外部参照図面(Xref)をすべて開いて、このマクロを実行して保存して閉じる」 という親マクロを作ってみてはいかがでしょうか?
それができれば、数百枚の図面修正もコーヒーを飲んでいる間に終わります。

AutoCAD VBAは、知れば知るほどあなたの強力な武器になります。
「この操作、面倒だな」と思ったら、それが自動化のチャンスです。またいつでも、この場所(コードの世界)でお待ちしています。

Happy Coding!

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