【入門編】【実務中級】図面内の全外部参照(XREF)を検索し、指定したパスに一括で再定義(REPATH)する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
図面管理の現場で、こんな絶望的な状況に直面したことはありませんか?

「サーバーの移行に伴い、全図面の外部参照(XREF)のパスが切れてしまった……」
「数千枚ある図面を開いて、一つひとつパスを張り直すなんて、手作業では到底ムリだ!」

マクロの記録から一歩抜け出し、AutoCADのオブジェクトモデルを自在に操れるようになると、こうした悪夢のような反復作業は一瞬で自動化できます。

今回は、図面内に存在するすべての外部参照を検出し、指定した新しいパスへ一括で書き換える(再定義・リパスする)ための実用的なVBAスクリプトを、プロの知見を交えて徹底解説します。

ここをクリアすれば、あなたもAutoCAD VBAの基礎をマスターし、現場で頼られる自動化エンジニアの仲間入りです。さあ、一緒に扉を開きましょう!

1. AutoCAD VBAの基本とオブジェクト階層の理解

まずは、AutoCAD VBAがどのように図面の世界を認識しているのか、その「地図」を頭に入れましょう。AutoCAD VBAのオブジェクトモデルは、次のようなピラミッド構造になっています。

[AcadApplication] (AutoCADアプリ全体)

└─► [AcadDocument] (現在開いている図面ファイル)

└─► [ModelSpace / PaperSpace] (図形の置き場所)

└─► [Blocks] (ブロック定義・外部参照の本体)

外部参照(XREF)はどこに隠れているのか?

初学者が最もハマりやすい罠がここです。「外部参照は図形(Entity)なのだから、ModelSpaceの中を探せばいいや」と考えてしまうのですが、それは大きな誤解です。

実は、外部参照は「ブロック(Block)」として管理されています。
AutoCADでは、外部参照も通常のブロックも、内部的には同じ「Blockオブジェクト」の一種として扱われます。ただし、その中で `IsXRef` というプロパティが `True` になっているものが、正体は外部参照なのです。

この「オブジェクトの正体を見極める目」を持つことが、AutoCAD VBAを掌握する第一歩です。

2. 【実務対応】外部参照を一括リパスするVBAコード

それでは、現場でそのままコピペして使える実践的なコードを公開します。
このマクロは、現在アクティブな図面内にあるすべての外部参照をスキャンし、ユーザーが指定した新しいフォルダパスへ強制的に付け替えるものです。

Sub BatchRelinkXrefs()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing ‘ 現在アクティブな図面を取得

Dim blk As AcadBlock
Dim xrefCount As Integer
Dim oldPath As String
Dim newPath As String
Dim targetDir As String

xrefCount = 0

‘ 【重要】新しいパスのベースフォルダをユーザーに入力させる
‘ 例: “C:\NewServer\ProjectData\Xrefs\”
targetDir = InputBox(“外部参照の新しい保存フォルダパスを入力してください。”, _
“XREF一括リパス”, “C:\”)

‘ ユーザーがキャンセルした場合は終了
If targetDir = “” Then Exit Sub

‘ パスの末尾に “\” がない場合は補正する
If Right(targetDir, 1) <> “\” Then
targetDir = targetDir & “\”
End If

‘ 図面内のすべてのブロック(定義)を走査する
For Each blk in acadDoc.Blocks

‘ そのブロックが「外部参照(XRef)」であるか判定
If blk.IsXRef = True Then
oldPath = blk.Path

‘ ファイル名のみを抽出する(例: “bg_floor1.dwg”)
Dim fileName As String
fileName = GetFileNameFromPath(oldPath)

‘ 新しいパスを組み立てる
newPath = targetDir & fileName

On Error GoTo ErrorHandler

‘ パスを更新(ここで実際に紐付けが変わる)
blk.Path = newPath

xrefCount = xrefCount & 1
Debug.Print “更新成功: ” & blk.Name & ” -> ” & newPath

End If
Next blk

‘ 画面を強制再描画して変更を反映
acadDoc.Regen acAllViewports

MsgBox “処理が完了しました。” & vbCrLf & _
“更新された外部参照の数: ” & xrefCount & ” 個”, vbInformation, “完了”
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description & vbCrLf & _
“対象ブロック名: ” & blk.Name, vbCritical, “エラー”
Resume Next
End Sub

‘ — 補助関数:フルパスからファイル名だけを抜き出す —
Function GetFileNameFromPath(fullPath As String) As String
Dim pos As Integer
pos = InStrRev(fullPath, “\”)
If pos > 0 Then
GetFileNameFromPath = Mid(fullPath, pos + 1)
Else
GetFileNameFromPath = fullPath
End If
End Function

3. コードの解説:ここがプロの技

上記のコードで、実務をスムーズにこなすための重要なポイントを解説します。

1. `For Each blk In acadDoc.Blocks` による全探索
図形ではなく `Blocks` コレクションを回すことで、画面上に挿入されている(アタッチされている)外部参照をもれなくキャッチできます。
2. `blk.IsXRef = True` によるフィルタリング
図面内には通常のブロックも混在しています。`IsXRef` プロパティを使うことで、外部参照だけをピンポイントで狙い撃ちできます。
3. ファイル名の動的抽出(`GetFileNameFromPath`)
サーバーが移動しても、フォルダ階層が変わるだけでファイル名自体は変わらないことがほとんどです。フルパスからファイル名だけをきれいに切り出し、新しい親ディレクトリと結合することで、パス切れのミスを劇的に減らします。
4. `On Error GoTo` による堅牢性
万が一、指定したパスにファイルが存在しない場合や、読み取り専用ファイルが混ざっていても、マクロが途中でクラッシュせず、エラーをスキップして次の外部参照処理へ進む設計(レジリエンス)にしています。

4. 陥りやすい罠とエラー回避の極意

AutoCAD VBAで外部参照を扱う際、初心者が必ずと言っていいほどハマるポイントがあります。

  • 罠1: 相対パスと絶対パスの混同

AutoCADの `blk.Path` プロパティは、設定方法によって相対パス(`..\xref\plan.dwg` など)が返ってくることがあります。今回のコードではファイル名(`fileName`)ベースで再構築しているため、相対パスの呪縛から解放され、確実に絶対パスへ再定義できます。

  • 罠2: 変更が画面に反映されない

VBAでパスを書き換えた直後は、AutoCADの画面上では古い状態のままになっていることがあります。必ず `acadDoc.Regen acAllViewports` を挟んで、グラフィックスを強制リフレッシュさせましょう。

まとめ:自動化の第一歩を踏み出したあなたへ

今回は、図面内の全外部参照を一括で再定義(リパス)する実用的なVBAコードを解説しました。

「オブジェクトモデルの階層を理解し、適切なコレクションをループさせ、プロパティを書き換える」
この基本さえ押さえておけば、外部参照だけでなく、画層(Layer)の制御、文字(Text)の一括置換、図枠の自動スタンプなど、あらゆる業務自動化へ応用が可能です。

ここをクリアしたあなたなら、もうマクロの記録機能に頼る必要はありません。ぜひ自分の開発環境(VBE)にコードを貼り付け、実際の図面でその威力を体感してみてください。

あなたのAutoCADライフが、もっとスマートでクリエイティブなものになりますように。それでは、次のステップでお会いしましょう!

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