【入門編】【中級者向け】Visio図面内のリンク切れを検知し、保存前に自動修復を試みるツール開発 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:リンク切れを許さない「自動修復の守護者」を実装する

こんにちは。業務自動化の深淵へようこそ。
普段、何気なくVisioを使っていると、「リンクしていた外部画像やデータが見当たらない」というトラブルに直面したことはありませんか?

手作業で一つひとつパスを再設定するのは、エンジニアの仕事ではありません。今日は、「保存の瞬間にリンク切れを検知し、自動修復を試みる」という、実務で死ぬほど役に立つVBAスクリプトを授けましょう。

「マクロの記録」を卒業し、Visioのオブジェクトモデルを操る快感を、共に味わいましょう。

—

1. なぜ「リンク切れ」が起きるのか?

Visioの図面(VSDX)において、外部ファイル(画像やOLEオブジェクト)は、図面内に絶対パス、または相対パスで記録されています。

  • ファイルサーバーの移動
  • フォルダ名の変更
  • PCの買い替え

これらが発生すると、リンクは途端に「死んだ道」になります。我々が目指すのは、「保存ボタンを押したとき、図面が自分で自分の傷を癒やす」という自律的な構造です。

—

2. 実装の要:Document.BeforeSave イベント

Visioには、図面を保存する直前に割り込むための「イベント」が用意されています。これを使えば、ユーザーが保存を試みるたびに、リンクをチェックさせることができます。

まずは、`ThisDocument` モジュールに以下のコードを貼り付けてください。

‘ ThisDocumentモジュールに記述してください
Private Sub Document_BeforeSave(ByVal doc As IVDocument)
‘ 保存前にリンクチェックを実行
Call FixBrokenLinks(doc)
End Sub

これだけで、保存という「儀式」に自動修復のプロセスが組み込まれます。

—

3. リンク修復の核心ロジック

では、肝心の修復エンジンを作成しましょう。標準モジュールを追加し、以下のコードを実装してください。ここでは、`ForeignData` オブジェクトを走査し、パスの存在確認を行う手法をとります。

Option Explicit

‘ 標準モジュールに記述
Public Sub FixBrokenLinks(doc As Visio.Document)
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim fObj As Visio.ForeignData ‘ 外部オブジェクトを扱うための重要な型
Dim oldPath As String
Dim newPath As String

‘ ページを全走査
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ OLEオブジェクトや画像であれば処理対象
If shp.ForeignData Is Not Nothing Then
oldPath = shp.ForeignData.ForeignName

‘ ファイルが存在するかチェック(Dir関数はVBの基本)
If Dir(oldPath) = “” Then
Debug.Print “リンク切れ発見: ” & oldPath

‘ ここで新しいパスを導出するロジックを実装
‘ 例:C:\OldPath\ を D:\NewPath\ に置換する
newPath = Replace(oldPath, “C:\OldPath\”, “D:\NewPath\”)

‘ パスが正しいなら再設定
If Dir(newPath) <> “” Then
shp.ForeignData.ForeignName = newPath
Debug.Print “修復完了: ” & newPath
End If
End If
End If
Next shp
Next pg
End Sub

—

4. プロの視点:陥りやすい罠と対策

このコードを組む際、必ずぶつかる壁が2つあります。ここを理解すれば、あなたはもう中級者です。

1. 相対パスと絶対パスの迷宮

`ForeignName` プロパティは、図面ファイルからの相対パスを返すことがあります。VBAでパスを操作する際は、`CreateObject(“Scripting.FileSystemObject”)` を活用して、常に絶対パスへ変換してから `Dir` で確認する癖をつけてください。

2. 「読み取り専用」の罠

図面が読み取り専用で開かれている場合、`ForeignName` の書き換えはエラーになります。
必ず `If Not doc.ReadOnly Then` のようなチェックを入れ、安全側に倒すのがエンジニアの流儀です。

—

5. 次のステップへ

今回のコードは、特定のフォルダ置換を想定したシンプルなものですが、実務では「ファイル名検索」や「ダイアログによる手動指定」を組み合わせるとより強力になります。

エンジニアへのアドバイス:
Visio VBAは、オブジェクトの階層(Document > Page > Shape > ForeignData)を正確に辿ることがすべてです。この階層構造をイメージできるようになった時、あなたは「マクロの記録」を使わずとも、どんな複雑な図面操作も自由自在に操れるようになっているはずです。

さあ、あなたの図面を「守護」するシステムを構築してください。困ったことがあれば、またいつでも聞きに来てくださいね。応援しています!

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