【入門編】マスターリンクが切れた図形の復旧:Shape.Masterの判定とステンシルへの再紐付け – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身のコードがさっぱり…」という時期を抜け出し、いよいよ自分の手でVisioを自在にコントロールしたいと思っているあなたへ。

今回は、Visio VBAの基礎のキモであり、中級者への登竜門でもある「マスターリンクが切れた図形の復旧」という、実務でめちゃくちゃ役立つテーマを解説します。

「他の図面から図形をコピペしたら、元のステンシルとリンクが切れちゃった…」
「一括で元のマスターに再紐付けして、図面のメンテナンス性を爆上げしたい!」

そんな現場の悩みを一発で解決する技術を、優しく、そして本質的なところまで深く一緒に見ていきましょう。ここをクリアすれば、あなたのVisio VBAスキルは確実に一段階アップしますよ!

1. なぜ「マスターとのリンク切れ」が起きるのか?

Visioの最大の強みは、「マスターシェイプ(型)」と、それに紐づく「インスタンス(実際の図形)」という関係性にあります。
ステンシルにあるマスターを変更すると、図面上のすべての同じ図形が一括で変わる――あの便利な仕組みです。

しかし、別のVisioファイルから図形をコピー&ペースト(あるいはプログラムでインポート)したとき、こんな現象が起きます。

  • 元のステンシルが存在しない環境に置かれると、図形は自立しようとしてマスター情報を「ローカル(内部)」に抱え込んでしまう。
  • 結果として、元のステンシルとの絆(マスターリンク)がプツリと切れてしまう。

この状態を放置すると、図面を修正する時に「一括変更が効かない負債図面」になってしまいます。これをVBAで検出し、元の正しいマスターに「再紐付け(Re-link)」してあげるのが今回のミッションです。

2. Visioオブジェクトモデルの基本:Application から Shape まで

コードを書く前に、Visioの「土地勘」をつけましょう。Visioのオブジェクトは、マトリトリョーシカのように綺麗に入れ子構造になっています。

Application (Visioアプリ全体)
┗ Documents (開いている図面たち)
┗ Document (対象の図面)
┣ Masters (この図面が持つマスターたちのコレクション)
┗ Pages (ページたち)
┗ Page (特定のページ)
┗ Shapes (図形たち)
┗ Shape (個々の図形 ★今回いじる主役)

今回の作業で鍵を握るのは、`Shape.Master` というプロパティと、`Document.Masters` コレクションです。

  • `Shape.Master`:その図形がどのマスターから生まれたかを示します(切れていると `Nothing` になる!)。
  • `Document.Masters`:この図面ファイルが現在保持しているマスターの一覧です。

3. 実践!マスターリンク切れを検出し、再紐付けするVBAコード

それでは、現場でそのままコピペして使える実用的なコードをお見セしましょう。
アクティブなページの全図形をスキャンし、マスターが切れている(あるいは別のマスターに繋がっている)図形を見つけて、指定した名前のマスターに無理やり(しかし安全に)再紐付けするスクリプトです。

Sub RepairMasterLinks()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim vsoMaster As Visio.Master
Dim targetMasterName As String
Dim fixedCount As Long

‘ — 【設定】再紐付けしたい元のマスター名を指定してください —
targetMasterName = “プロセス” ‘ 例:ステンシルにあるマスターの名称

‘ 初期化
fixedCount = 0
Set vsoPage = ActivePage

‘ 1. 指定した名前のマスターが現在のドキュメントに存在するか確認
On Error Resume Next
Set vsoMaster = vsoPage.Document.Masters(targetMasterName)
On Error GoTo 0

If vsoMaster Is Nothing Then
MsgBox “エラー: ドキュメント内にマスター ‘” & targetMasterName & “‘ が見つかりません。”, vbCritical, “処理中断”
Exit Sub
End If

‘ 2. ページ上の全シェイプを巡回 (グループ化された図形も考慮)
For Each vsoShape in vsoPage.Shapes
‘ 条件判定: マスターとのリンクが切れているか?
‘ ※今回は強制的に targetMasterName に付け替えるロジックにします
If vsoShape.Master Is Nothing Then
‘ ログ出力(イミディエイトウィンドウに表示)
Debug.Print “リンク切れ検出: ” & vsoShape.Name & ” (ID: ” & vsoShape.ID & “)”

‘ 3. マスターの再紐付けを実行
‘ Shape.BoundingBox や Shape.XYToPage などで位置を保持しつつ付け替えるのがベストですが、
‘ 今回は基本のメソッドである .SetMaster を使います。
On Error Resume Next
vsoShape.SetMaster vsoMaster
If Err.Number = 0 Then
fixedCount = fixedCount + 1
Debug.Print ” -> 復旧成功!”
Else
Debug.Print ” -> 復旧失敗 (エラー番号: ” & Err.Number & “)”
End If
On Error GoTo 0
End If
Next vsoShape

‘ 完了報告
MsgBox “処理が完了しました。” & vbCrLf & “復旧した図形数: ” & fixedCount & ” 個”, vbInformation, “完了”
End Sub

コードのここがポイント!

1. `vsoShape.Master Is Nothing` の判定
これが今回の核心です。マスター情報が失われ、完全に孤立した図形はこのプロパティが `Nothing` になります。ここをキャッチするのが検出の第一歩です。
2. `vsoShape.SetMaster(vsoMaster)`
Visio VBAには、失われた(あるいは別の)マスターを強制的に割り当てるための強力なメソッド `SetMaster` が用意されています。これを使うことで、綺麗に元のステンシルとの絆を取り戻せます。
3. エラーハンドリング (`On Error Resume Next`)
Visioの図形の中には、マスターを持たない特殊な図形(ガイドラインやフリーハンドの線など)も混ざっています。これらを処理しようとしてエラーでマクロが止まらないよう、安全策を講じるのがプロの技です。

4. 陥りやすい罠とエンジニアからのアドバイス

実際にこのコードを組み込んでテストしていくと、いくつかの「Visioの壁」にぶぶつかることがあります。あらかじめ知っておけば怖くありません。

  • 罠1:グループ図形(子シェイプ)の存在

上記のコードは `ActivePage.Shapes` を回していますが、これだと「グループ化された図形の中にあるパーツ(子シェイプ)」のリンク切れは見逃してしまいます。完全を期すなら、再帰処理(関数を自分自身で呼び出す仕組み)を使ってグループの深部まで潜っていくロジックが必要です。

  • 罠2:サイズや位置のズレ

`SetMaster` を実行した際、図形の形状やプロパティによっては、わずかに位置がずれたりサイズがリセットされたりすることがあります。本番環境で実行する前には、必ず図面のバックアップ(コピー)を取ることを習慣にしてください。

まとめ:ここをクリアすれば、Visio VBAの基本はバッチリです!

お疲れ様でした!今回は「マスターリンクの切断と復旧」という、少しマニアックだけど実務でめちゃくちゃ価値のあるテーマを解説しました。

  • オブジェクトの親子関係(Document -> Masters, Page -> Shapes)を理解した。
  • `Shape.Master Is Nothing` で異常を検知できるようになった。
  • `SetMaster` メソッドで正しい姿に修復する方法を知った。

この3つが頭に入っていれば、もう「マクロの記録の奴隷」ではありません。あなたは自分の意志でVisioのドキュメント構造を操る、立派なVBAエンジニアの一歩を踏み出しています。

日々の定型作業や、荒れた図面のクレンジングに、ぜひこの知見を役立ててください。
それでは、次のステップでお会いしましょう!

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