AutoCAD VBAで「外部参照のパス迷子」を秒殺する:実務直結のREPATH自動化術
こんにちは。AutoCADの自動化の世界へようこそ。
「サーバーの移行で外部参照(XREF)のパスが全部切れてしまった」「手作業で一つずつリンクを張り直すのに半日かかった」……そんな悲劇的な時間を過ごしたことはありませんか?
AutoCADのプロジェクトにおいて、外部参照の管理は避けて通れない「保守の要」です。今回は、マクロの記録(レコーダー)では決して到達できない、VBAによるオブジェクト操作の深淵へと皆さんを案内します。
このコードを理解すれば、あなたのAutoCADライフは「作業者」から「設計エンジニア」へと確実にステップアップします。
—
1. AutoCADオブジェクトモデルの「心臓部」を理解する
AutoCAD VBAを操る上で、まず押さえるべきは階層構造です。
- `AcadApplication`: AutoCADそのもの。
- `AcadDocument`: 開いている図面ファイル。
- `AcadBlock`: 図面内のブロック定義(外部参照も実はこれの一種です)。
実は、外部参照もAutoCAD内部では「ブロック」として扱われています。`IsXRef`というプロパティが `True` であるブロックを探し出し、その `Path` プロパティを書き換える。これが「REPATH(パスの再定義)」の正体です。
—
2. 外部参照一括パス変更コード
まずは、現在の図面内にある全ての外部参照を、指定した新しいフォルダパスへ強制的に書き換えるプロシージャです。
Option Explicit
‘ 外部参照を全検索し、パスを再定義するメイン処理
Public Sub BatchRepathXref()
Dim objBlock As AcadBlock
Dim strNewPath As String
Dim strFileName As String
‘ 新しいパス(最後に必ず \ を含めること)
strNewPath = “C:\Projects\2024\NewServer\Xrefs\”
‘ 図面内の全ブロック定義を走査
For Each objBlock In ThisDrawing.Blocks
‘ IsXRefプロパティがTrueのものだけが外部参照
If objBlock.IsXRef Then
‘ パスからファイル名のみを抽出(パスの再結合)
strFileName = GetFileNameFromPath(objBlock.Path)
‘ 新しいパスを適用
‘ ※注: パス変更にはPathプロパティを更新するだけでOK
On Error Resume Next ‘ 権限エラー等で止まらないように保護
objBlock.Path = strNewPath & strFileName
If Err.Number <> 0 Then
Debug.Print “失敗: ” & objBlock.Name & ” -> ” & Err.Description
Err.Clear
Else
Debug.Print “成功: ” & objBlock.Name & ” を再定義しました”
End If
On Error GoTo 0
End If
Next
‘ 変更を反映させるために画面を再生成
ThisDrawing.Regen acActiveViewport
MsgBox “外部参照の再定義が完了しました。”, vbInformation
End Sub
‘ パスからファイル名だけを切り出すヘルパー関数
Private Function GetFileNameFromPath(ByVal fullPath As String) As String
GetFileNameFromPath = Right(fullPath, Len(fullPath) – InStrRev(fullPath, “\”))
End Function
—
3. ここがプロの視点:陥りやすい罠と対策
① `IsXRef` プロパティの重要性
初心者の方は、「図面上のオブジェクトを全部ループする」というミスを犯しがちです。しかし、外部参照はあくまで「ブロック定義」の中に存在します。`ModelSpace`をループしても外部参照は見つかりません。必ず `ThisDrawing.Blocks` コレクションを回すのが鉄則です。
② パスのセパレータ(区切り文字)
コード内の `strNewPath` の末尾に `\` を含めることを忘れないでください。パスの結合は非常にデリケートです。ここを動的に制御するようになると、さらに洗練されたツールになります。
③ エラーハンドリングの意識
外部参照が既に読み込み済みで変更できない場合や、ファイルが存在しないパスを指定した場合、コードは停止します。`On Error Resume Next` を適切に使い、失敗したファイル名をログ(`Debug.Print`)に残すのが、伝説的な自動化エンジニアの流儀です。
—
4. さあ、次のステップへ
このコードを理解できたあなたは、既に「マクロ記録」の世界を卒業しています。次は、以下のような拡張に挑戦してみましょう。
- ダイアログでパスを選択可能にする: `FileDialog` を使って、ユーザーがフォルダを選べるようにする。
- パスの「相対化」: パスを絶対パスではなく、図面ファイルからの相対パスに書き換えるロジックを組む。
AutoCADのオブジェクトモデルを掌握するということは、「CADに指示を出すのではなく、CADという広大なデータベースを自在に操る」ことに他なりません。
ここをクリアしたあなたなら、どんなに巨大な図面管理の課題も、VBAの数行で解決できるはずです。応援しています。分からないことがあれば、いつでもまた聞きに来てくださいね。
