【入門編】Shape.Masterの参照と検証:図形がどのステンシルマスターから派生したかをプログラムで正確に特定する – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「なんだか狙った通りに図形を操れないな……」と悩んでいませんか?

大丈夫、ここをクリアすれば、Visio VBAの基本はバッチリです!

今回は、Visio VBAをマスターする上で避けて通れない、「Shape.Master(マスターシェイプ)の参照と検証」というテーマに直球で焦点を当てます。

現場でよくある「この図形、どのステンシルから作られたんだっけ?」「古い図形のマスターを最新の定義にアップデートしたい!」という悩みを、プロのエンジニア視点の優しく確実なアプローチで解決していきましょう。

—

1. そもそも「Master(マスター)」ってなに?

Visioの図面(Page)上に配置された個々の図形を、私たちは `Shape` オブジェクトと呼びます。
一方で、画面の左側にあるステンシルウィンドウに並んでいる「元の型」のことを `Master` オブジェクト と呼びます。

Visioの図形は、いわば「マスターという名の金型から打ち抜かれたプラスチック製品」のようなものです。

  • Master(金型)を変更すれば、そこから派生したすべてのShape(製品)が一括で変わるべき構造になっています。
  • しかし、実務では「いつの間にかマスターとのリンクが切れていた」「古いバージョンの図形が混ざっている」というカオスな状態がよく起こります。

だからこそ、「プログラムで正確にマスターを特定し、検証・更新する力」が必要なのです。

—

2. 【基本】シェイプがどのマスターから派生したか特定する

まずは、選択中の図形がどのマスターから生まれたものかをコードで取得してみましょう。
ここで重要なのは、「すべてのシェイプがマスターを持っているわけではない」という点です。図形を完全に自作(フリーハンドや四角形の組み合わせなど)した場合、`Master` プロパティは `Nothing`(空っぽ)を返します。

以下のコードをVBE(Visual Basic Editor)に貼り付けて、ページ上の図形を1つ選んで実行してみてください。

Sub CheckShapeMaster()
Dim shp As Visio.Shape

‘ 1. ページ上で選択されている図形があるかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “図形が選択されていません。”, vbExclamation
Exit Sub
End If

Set shp = ActiveWindow.Selection(1)

‘ 2. Masterプロパティを持っているか判定
If Not shp.Master Is Nothing Then
‘ マスターの名前を出力
MsgBox “この図形のマスター名: ” & shp.Master.Name & vbCrLf & _
“由来するステンシル: ” & shp.Master.Document.Name, vbInformation, “マスター検証”
Else
MsgBox “この図形はステンシル(マスター)から派生していません(単体図形です)。”, vbInformation, “マスター検証”
End If
End Sub

💡 ここで陥りやすいエラーの罠

初心者の方が一番やりがちなのが、`shp.Master.Name` を無条件で呼び出して「オブジェクト変数または With ブロック変数が見つかりません。」(エラー 91)で悶絶することです。

マスターを持たない図形に対して `.Master` のプロパティやメソッドにアクセスすると、Visioは容赦なくエラーを投げます。必ず `If Not shp.Master Is Nothing Then` で「マスターが存在するか」を確認するガード節を書きましょう。これがプロの作法です。

—

3. 【実践】特定のマスターと一致するか検証し、最新にアップデートする

実務で求められるのは、「特定のステンシルにあるマスター(例:’サーバ機器’というマスター)とこの図形が一致しているか」を確認し、もし古ければ最新のマスター定義に置き換える(更新する)処理です。

Visioには、まさにこのために用意された魔法のメソッド `Shape.BringDownToDocument` または `Shape.UpdateAlignmentBox` などがありますが、最も確実なマスターの再適用(更新)は `Shape.Drop` の置き換え や `Master.ConnecttoMap` 的なアプローチではなく、シンプルに `Shape.Replace` または `Master` の再適用メソッドである `Shape.RefreshMaster` を使います。

それでは、現在選択している図形が「特定のマスター名」と一致しているかを検証し、必要に応じて更新をかける実用スクリプトを見てみましょう。

Sub ValidateAndUpdateMaster()
Dim shp As Visio.Shape
Dim targetMasterName As String

‘ ターゲットとするマスター名(例:あらかじめ開いているステンシル内の名前)
targetMasterName = “サーバー” ‘ ※お使いの環境のマスター名に変更してください

If ActiveWindow.Selection.Count = 0 Then
MsgBox “検証する図形を選択してください。”, vbExclamation
Exit Sub
End If

Set shp = ActiveWindow.Selection(1)

‘ 1. マスターを持っているか検証
If shp.Master Is Nothing Then
MsgBox “エラー: 選択された図形はマスターを持っていません。”, vbCritical
Exit Sub
End If

‘ 2. 意図したマスターから派生しているか名前で検証
‘ ※注意: shp.Master.Name は末尾に “(.1)” のような連番がつくことがあるため、厳密にはベース名を比較します
If InStr(shp.Master.Name, targetMasterName) > 0 Then
MsgBox “検証OK: 正しいマスター(” & shp.Master.Name & “)から派生しています。”, vbInformation

‘ 3. 必要に応じて最新のマスター定義にアップデート
‘ Visioでは RefreshMaster メソッドを使って、図形の見た目やデータをマスターの最新状態に同期できます
On Error GoTo ErrorHandler
shp.RefreshMaster
MsgBox “マスターの定義を最新の状態にアップデートしました!”, vbInformation

Else
MsgBox “検証NG: この図形は予期せぬマスター(” & shp.Master.Name & “)から作られています。”, vbWarning
End If
Exit Sub

ErrorHandler:
MsgBox “アップデート中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

🧠 コードの深掘り:`RefreshMaster` の強力さと注意点

`shp.RefreshMaster` メソッドは、図面内にキャッシュされているマスターの定義と、ステンシル側にある最新のマスター定義を比較し、図形の形状やプロパティを強制的に同期させます。

ただし、「図形に個別に入力したカスタムプロパティ(シェイプデータ)が上書きされて消えてしまうリスク」もあるため、実行する前には必ず図面のバックアップ(セーブ)を取るか、テスト環境で挙動を確かめる慎重さがエンジニアには求められます。

—

4. まとめ:Visio VBAを使いこなすために

今回は、`Shape.Master` を軸にしたオブジェクトの参照と検証、そしてアップデートの基本を解説しました。

1. `shp.Master Is Nothing` でヌルチェックを必ず行う(エラー91の回避)
2. `shp.Master.Name` で由来を特定する
3. `shp.RefreshMaster` でマスターの定義を安全に同期・更新する

この3つを押さえておけば、図面の整合性を保つ自動化ツールや、大量の図形を綺麗に管理するクレンジングマクロを自由自在に組むことができます。

「マクロの記録」の向こう側にあるオブジェクトモデルの世界へようこそ。ここをクリアしたあなたなら、もうVisio VBAの基礎はバッチリです!
現場での業務自動化を、ぜひ楽しんで進めてくださいね。

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