【入門編】【上級】ステンシル内のマスターシェイプをバイナリ解析・直接編集する試み – Visio VBA解析バイブル

スポンサーリンク
スポンサーリンク

記録係を卒業せよ:ステンシルとShapeSheetを支配する「設計者」への道

「マクロの記録」ボタンを押して、生成されたコードを眺めて「ふーん、こんな感じか」で終わっていませんか?

もしあなたがそうなら、今のあなたはVisioという巨大なエンジンの「運転席」に座っているだけで、その「エンジン内部の構造」にはまだ触れていません。マクロの記録で得られるコードは、あくまで「ユーザーがGUIで行った操作の断片」に過ぎないのです。

真の自動化エンジニア、つまり「Visioの挙動そのものを定義するアーキテクト」を目指すなら、次に踏み込むべき領域は、ステンシル(Stencil)と、その中に眠るマスターシェイプ(Master Shape)の内部構造、そしてそれらを司るShapeSheet(シェイプシート)への直接介入です。

今日は、プログラミング初学者が「マクロの記録」という補助輪を脱ぎ捨て、Visioの内部ロジックを直接書き換えるための、少し刺激的な旅へご案内します。

1. 階層構造を理解する:ステンシル・マスター・シェイプの正体

コードを書く前に、まずはVisioの「設計思想」を頭に叩き込みましょう。ここを間違えると、どれだけ優れたコードを書いても「なぜか動かない」「動作が重すぎる」という罠にハマります。

Visioのオブジェクトは、以下の3層構造で成り立っています。

1. Stencil(ステンシル): 図形(マスター)が格納された「カタログ」や「ライブラリ」です。
2. Master Shape(マスターシェイプ): ステンシルの中に定義されている「設計図」です。まだ画面には出ていない、いわば「型(テンプレート)」の状態です。
3. Shape(シェイプ): マスターをドロップして、実際にページ上に配置された「実体」です。

ここが重要!「設計図」と「実体」の違い

多くの初心者は「ページ上の図形(Shape)」を操作しようとします。しかし、高度な自動化を行うエンジニアは「マスター(Master)」を操作します。

なぜか?
「マスター」の性質(色、動き、計算式)を書き換えれば、その後に配置されるすべての図形に、その高度な挙動が自動的に継承されるからです。これこそが、効率的なシステム設計の極意です。

2. ShapeSheet:図形の「DNA」を直接書き換える

Visioの図形は、単なる絵ではありません。その裏側にはShapeSheetという、Excelのセルに近い形式の「パラメータシート」が隠されています。

「図形の色を変える」という操作も、内部的にはShapeSheetの `FillForegnd` というセルに値を書き込んでいるに過ぎません。GUI(画面操作)では設定できないような、「特定の条件を満たしたときだけ色を変える」といった複雑なロジックは、このShapeSheetに「数式(Formula)」を直接注入することで実現します。

これをVBAから行うのが、今回のミッションです。

3. 実践:マスターシェイプに「知能」を注入する

それでは、具体的なコードを見ていきましょう。
ターゲットは、「ユーザーが設定した『ステータス』という値に応じて、図形の色が自動的に変わる」という、インテリジェントなマスターシェイプの作成です。

このコードは、単に色を変えるのではなく、マスターのShapeSheetに「条件付き書式のような数式」を埋め込みます。

Option Explicit

''' <summary>
''' ステンシル内のマスターシェイプに対して、ShapeSheetの数式を直接注入する
''' </summary>
Sub InjectIntelligenceToMaster()
    Dim vsoApplication As Visio.Application
    Dim vsoStencil As Visio.Document
    Dim vsoMaster As Visio.Master
    Dim vsoShape As Visio.Shape
    Dim stencilName As String
    Dim masterName As String
    
    Set vsoApplication = Visio.Application
    
    ' --- 設定エリア ---
    ' 操作したいステンシルの名前(拡張子 .vssx を含む)
    stencilName = "MyCustomShapes.vssx"
    ' 操作したいマスターの名前
    masterName = "StatusShape"
    ' ------------------

    On Error GoTo ErrorHandler

    ' 1. ステンシルを開く(既に開いている場合はそれを取得)
    Set vsoStencil = vsoApplication.Documents(stencilName)
    If vsoStencil Is Nothing Then
        MsgBox "ステンシルが見つかりません。先に作成・保存してください。", vbCritical
        Exit Sub
    End If

    ' 2. ステンシルの中から特定のマスターを探す
    Set vsoMaster = vsoStencil.Masters(masterName)
    
    If vsoMaster Is Nothing Then
        MsgBox "マスターシェイプ '" & masterName & "' が見つかりません。", vbCritical
        Exit Sub
    End If

    ' 3. マスターのShapeSheetにアクセスし、ロジックを注入する
    ' ここでは、マスターの「最初のシェイプ」に対して操作を行います。
    ' ※マスターは複数のシェイプで構成されている場合があるため注意。
    Set vsoShape = vsoMaster.Shapes(1)

    ' 【ここが魔法の核心】
    ' ShapeSheetの 'FillForegnd' (塗りつぶし色) セルに、数式を書き込む。
    ' ロジック:もし 'Status' というユーザー定義セルが 1 なら赤(RGB 255,0,0)、
    '          2 なら緑(RGB 0,255,0)、それ以外は青(RGB 0,0,255)にする。
    
    ' まず、数式を受け止めるためのカスタムセル 'Status' を作成(なければ)
    ' 注意:マスターへの操作は、そのマスターが「読み取り専用」でないことが前提です。
    On Error Resume Next
    vsoShape.AddNamedRow visSectionUser, "Status", visRowBoolean
    On Error GoTo ErrorHandler

    ' ShapeSheetへの数式注入
    ' Formulaプロパティに、ExcelのようなIF文を書き込む
    vsoShape.Cells("FillForegnd").Formula = _
        "=IF(User.Status=1, RGB(255,0,0), IF(User.Status=2, RGB(0,255,0), RGB(0,0,255)))"

    MsgBox "マスターへのロジック注入が完了しました!" & vbCrLf & _
           "このマスターから配置される図形は、Status値によって自動で色が変わります。", vbInformation

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
End Sub

コードの解説:何が起きているのか?

1. `vsoStencil.Masters(masterName)`:
ここがポイントです。ページ上の図形ではなく、「設計図そのもの」を掴みに行っています。
2. `vsoShape.Cells(“FillForegnd”).Formula = “…”`:
これが「バイナリ解析・直接編集」への第一歩です。値を代入するのではなく、`Formula` プロパティに数式を代入しています。これにより、図形は「静的な物体」から「条件に応じて動くプログラム」へと進化します。
3. `visSectionUser`:
Visioには、ユーザーが自由に変数を持てる「User Section」という領域があります。ここに `Status` という変数を持たせることで、図形に「状態」という概念を与えています。

4. 陥りやすい罠:プロが教える「現場の注意点」

この高度な手法には、初心者が必ずと言っていいほど躓くポイントが3つあります。

① ステンシルが「読み取り専用」問題

標準のステンシル(Basic Shapesなど)は読み取り専用です。これらに対してマスターの編集を行おうとすると、エラーが発生します。
対策: 独自の `.vssx` ファイルを作成し、そこにカスタムマスターを定義して使用してください。

② ライフサイクルの勘違い

「マスターを書き換えたのに、既にページにある図形の色が変わらない!」という現象がよく起こります。
原因: マスターは「設計図」です。設計図を書き換えても、既に工場から出荷された製品(ページ上のShape)には影響しません。
対策: 既存の図形にも適用したい場合は、ページ上の `Shapes` コレクションに対しても同様の処理をループで回す必要があります。

③ パフォーマンスの重み

大量のマスターに対して、一つずつ `Cells(“…”).Formula` を書き込むループ処理は、Visioの描画エンジンに凄まじい負荷をかけます。
対策: 可能な限り、大量の個別の設定を行うのではなく、「マスター側の数式を一度だけ賢くしておく」ことで、計算負荷をVisioの内部エンジンに丸投げするのがプロのやり方です。

最後に:エンジニアとしての視座

「マクロの記録」は、あなたの手足となって動いてくれる便利なツールです。しかし、今回のようにShapeSheetやマスターの構造に踏み込むことは、あなたの「脳」をVisioに直結させる作業です。

図形を「ただの絵」として見るのではなく、「数式と属性の集合体」として捉えられるようになったとき、あなたの自動化の領域は無限に広がります。

次は、この注入した数式を、ユーザーフォーム(GUI)から操作して、ダイナミックに図形を制御するシステムを作ってみるのも面白いでしょう。

一歩ずつ、確実に。Visioの深淵を楽しんでください。応援していますよ!

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