【入門編】Shape.StyleとInheritedStyleの階層関係解析:親スタイルからの書式オーバライドを検出・初期化するVBA – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「なぜ動くのか分からない」「なんだか汚いコードになってしまう……」と悩んでいませんか?

大丈夫、ここをクリアすれば、あなたもVisio VBAの構造を完全に掌握できますよ。今回は、Visio VBAのオブジェクトモデルにおける「最重要かつ最もハマりやすい罠」である、スタイル(Style)とオーバライド(個別の書式上書き)の正体に迫ります。

現場で使える実用的なクレンジングツールのコードも用意したので、ぜひ最後までついてきてくださいね!

1. Visioの「スタイル」と「オーバライド」の切ない関係

Visioで図形(Shape)を描くとき、私たちは無意識に「スタイル(Style)」という共通のテンプレート(線の太さ、塗りつぶし、文字フォントなど)の恩恵を受けています。

しかし、図形を配置した後に「ここだけ赤くしよう」「太線を細くしよう」と個別に変更を加えると、Visioの内部では何が起きるでしょうか?

  • スタイルの呪縛: 本来、図形は親である「スタイルシート」の言うことを聞いて一括でデザインが変わるはずです。
  • オーバライド(反逆): 図形に直接プロパティを設定した瞬間、その図形は親の言うことを聞かなくなり、「個別の書式(オーバライド)」という名の我が儘を優先し始めます。

これが大規模な図面になると厄介です。「全体の色を一斉に変更したいのに、一部の図形だけ以前の色から変わらない!」という現象の正体は、このオーバライドが原因なのです。

Visioオブジェクトモデルの階層イメージ

[Application] (Visio全体)
└── [Document] (図面ファイル)
└── [Page] (描画ページ)
└── [Shape] (図形)
├── Style ──> 親スタイル(例: “Normal”, “Heading”)
└── InheritedStyle ──> 継承されている現在の状態

この親子関係をプログラムから正確に見極め、「我が儘をリセットして親のスタイルに完全同期させる(クレンジングする)」のが今回のミッションです。

2. 陥りやすいエラーとVBAの基礎知識

Visio VBAで図形を操作するとき、初心者が必ずと言っていいほど直面する壁がいくつかあります。ここで先回りしてクリアしておきましょう。

罠1: `Cells`プロパティの罠

Excel VBAの感覚で `Shape.Color = RGB(…)` のようには書けません。Visioのプロパティはすべて `Cell`(セル) という概念で管理されています。

  • 例:線の色は `Cells(“LineColor”)`、塗りは `Cells(“FillForegnd”)`

罠2: セルが「ロック」または「Formula(数式)」を持っているか?

セルに直接値が入っている(オーバライドされている)場合、そのセルは独自の数式を持っています。これを解除してスタイルに追従させるには、`FormulaU` プロパティに親スタイルの数式、あるいはデフォルトの数式を再設定するか、Visioが用意している特定のメソッドを使います。

3. 実践!スタイルオーバライド検出・初期化クレンジングツール

それでは、選択中の図形(またはページ上の全図形)をスキャンし、「親スタイルからどの部分がオーバライド(個別上書き)されているか」を検出し、必要に応じて「標準スタイルへ強制同期(初期化)」するプロフェッショナルなVBAコードを公開します。

開発タブのVisual Basic Editorを開き、標準モジュールに貼り付けてください。

Option Explicit

‘ =================================================================================
‘ 処理名: 選択図形のスタイル・オーバライド検出およびクレンジングツール
‘ 概要 : 図形が親スタイルからどのように乖離しているかをイমিディエイトに暴き、
‘ 必要に応じて標準スタイルへ完全に初期化(同期)します。
‘ =================================================================================
Public Sub CleanseShapeStyles()
Dim vsoSelection As Visio.Selection
Dim vsoShape As Visio.Shape
Dim i As Long

‘ 1. 現在の選択図形を取得
Set vsoSelection = ActiveWindow.Selection

If vsoSelection.Count = 0 Then
MsgBox “クレンジングする図形が選択されていません。図形を選択して実行してください。”, vbExclamation, “Visio VBA 案内”
Exit Sub
End If

Debug.Print “=== [開始] スタイル・オーバライド解析ログ ===”

‘ 2. 選択されたすべての図形を走査
For i = 1 to vsoSelection.Count
Set vsoShape = vsoSelection(i)

Debug.Print “— 図形名: ” & vsoShape.Name & ” (ID: ” & vsoShape.ID & “) —”
Debug.Print ” 現在の割り当てスタイル: ” & vsoShape.Style

‘ — チェック対象の主要セル(必要に応じて追加可能) —
Call CheckAndResetCell(vsoShape, “LineColor”) D
Call CheckAndResetCell(vsoShape, “LinePattern”)
Call CheckAndResetCell(vsoShape, “FillForegnd”)

Next i

Debug.Print “=== [終了] 解析完了 ===”
MsgBox “選択図形のスタイル解析とクレンジングが完了しました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbInformation, “完了”
End Sub

‘ =================================================================================
‘ 補助プロシージャ: 個別セルのオーバライド状態を判定し、必要ならリセットする
‘ =================================================================================
Private Sub CheckAndResetCell(shp As Visio.Shape, cellName As String)
Dim vsoCell As Visio.Cell

On Error Resume Next
Set vsoCell = shp.Cells(cellName)
If Err.Number <> 0 Then
‘ 該当セルを持たない図形の場合はスルー
On Error GoTo 0
Exit Sub
End If
On Error GoTo 0

‘ IsFormulaLocal は、セルに「直接入力された数式(オーバライド)」があるかを判定する神プロパティ
If vsoCell.IsFormulaLocal Then
Debug.Print ” [!] オーバライド検出 -> ” & cellName & ” (値: ” & vsoCell.ResultIU & “)”

‘ 【クレンジング処理】
‘ スタイルからの継承状態に戻すため、セルの数式をクリア(スタイルの数式に委譲)する
‘ ※Visioの仕様として、Formulaをスタイル側の参照に戻すには “TheStyle…” 系の数式をセットするか
‘ または単純にセルをデフォルト状態に戻します。
vsoCell.RowForceDefault

Debug.Print ” => ” & cellName & ” をスタイル継承状態にリセットしました。”
Else
Debug.Print ” [OK] 継承中 -> ” & cellName
End If
End Sub

このコードの圧倒的なポイント

1. `IsFormulaLocal` の活用:
これが今回の最大のキモです。このプロパティは、「このセルが自前で値を抱え込んでいるか(=オーバライドされているか)」を正確に判定してくれます。マクロの記録では絶対にたどり着けない、オブジェクトモデルの深淵の知見です。
2. `RowForceDefault` メソッド:
個別設定されたセルの呪縛を解き、親スタイルが持つ本来の定義へ強制的に引き戻す最強のメソッドです。これにより、図面全体のデザイン統制が劇的に楽になります。

4. チーフアーキテクトからのエール

お疲れ様でした!ここを理解できたあなたは、単なる「マクロの記録者」から、Visioの内部構造を意のままに操る「VBAエンジニア」へと確実にステップアップしています。

業務効率化の現場において、図面の整合性を保つ自動化ツールは非常に強力な武器になります。ぜひ、このコードをベースにご自身の業務環境に合わせたカスタマイズを楽しんでみてください。

「ここをもっとこうしたい」「こんな応用はできる?」といった疑問があれば、いつでもまた扉を叩いてくださいね。あなたのエンジニアリングライフを応援しています!

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