【入門編】Visio階層構造の可視化:ApplicationからCellまでをVBAで再帰走査してイミディエイトウィンドウにデバッグ出力するツール – Visio VBA解析バイブル

スポンサーリンク

Visioの「深淵」を覗く:オブジェクト階層を再帰走査するVBAデバッグエンジンの構築

こんにちは。Visioの世界へようこそ。
「マクロの記録」ボタンを押すだけの生活を卒業しようとしているあなたへ。今日は、Visioという巨大な迷宮の地図を手に入れるための、最も本質的で「強力な武器」を授けましょう。

Visioは、ExcelやWordとは全く異なる「幾何学的で階層的なオブジェクトモデル」を持っています。ここを理解せずにコードを書くのは、目隠しをして迷路を歩くようなもの。

今回は、Visioの心臓部である「ApplicationからCellまで」を、再帰関数を使って一気に可視化するデバッグツールを作成します。これを動かせば、あなたの頭の中にVisioの構造図が完成します。

1. Visioオブジェクトモデルの「階層構造」を理解する

まずは、このピラミッドを脳に焼き付けてください。

  • Application: Visioそのもの。全ての根源。
  • Document: 開いている図面ファイル。
  • Page: 図面の中の「ページ」。
  • Shape: ページ上に置かれた「図形」。ここが一番の難所です。
  • Cell: シェイプの属性(幅、高さ、位置、色など)を司る最小単位。

「Shapeの中にShapeがある(グループ化)」という特性があるため、単純なループでは終わりません。ここで登場するのが「再帰処理(Recursive Function)」です。

2. 階層走査デバッグエンジンの実装

以下のコードを、VBAエディタの標準モジュールに貼り付けてください。

Option Explicit

‘ メイン処理:現在のドキュメントから走査を開始する
Public Sub VisualizeVisioStructure()
Dim doc As Visio.Document
Set doc = Application.ActiveDocument

Debug.Print “— Visio Structure Report: ” & doc.Name & ” —”

Dim pg As Visio.Page
For Each pg In doc.Pages
Debug.Print “Page: ” & pg.Name
‘ ページ内のシェイプを再帰的に走査
Call TraverseShapes(pg.Shapes, 1)
Next pg
End Sub

‘ シェイプを再帰的に探索するサブプロシージャ
Private Sub TraverseShapes(shapes As Visio.Shapes, indentLevel As Integer)
Dim shp As Visio.Shape
Dim indent As String
indent = String(indentLevel 2, ” “)

For Each shp In shapes
‘ シェイプ名とIDを出力
Debug.Print indent & “Shape: ” & shp.Name & ” (ID: ” & shp.ID & “)”

‘ セル(Cell)の情報を一部抜粋して表示(例:幅)
‘ ※必要に応じて他のセルも取得可能
Debug.Print indent & ” [Width]: ” & shp.Cells(“Width”).ResultIU & ” inch”

‘ サブシェイプ(グループ化された図形)がある場合は再帰的に呼び出す
If shp.Shapes.Count > 0 Then
Call TraverseShapes(shp.Shapes, indentLevel + 1)
End If
Next shp
End Sub

3. このコードが「何をしているか」の解説

1. `Application.ActiveDocument` の重要性

Visioにおいて、「今何を開いているか」は常に流動的です。まずは `ActiveDocument` を掴むことで、現在作業中のキャンバスを特定します。

2. 再帰(Recursion)の魔法

なぜ `TraverseShapes` を自分自身の中で呼び出しているのか? それはVisioのシェイプが「入れ子構造(グループの中にグループがある)」だからです。この手法を使えば、どんなに複雑な階層構造であっても、たった数行のロジックで全てを網羅できます。

3. `Cells(“Width”)` という存在

Visioのシェイプは、実は膨大な「セルの集合体」です。`Cells` プロパティを通じて、計算式や数値を直接操作できます。これができると、自動レイアウトや属性の一括変更が自由自在になります。

4. 陥りやすいエラーと回避策

  • 「オブジェクトが必要です」エラー:

`ActiveDocument` が存在しない状態で実行していませんか? 常に `If Application.Documents.Count > 0 Then` でチェックを入れる癖をつけましょう。

  • 無限ループの恐怖:

今回のコードは `Shapes` コレクションを走査するだけなので安全ですが、複雑なイベントハンドラを書く際は「シェイプの変更イベント」と「コードによる変更」がループしないよう注意が必要です。

  • パフォーマンスの罠:

`Debug.Print` は非常に便利ですが、数千個のシェイプがある図面で実行するとイミディエイトウィンドウが溢れます。本番環境では適宜ログ出力先をテキストファイルに切り替えるなどしてください。

最後に:ここからがスタートライン

このツールで出力されたログを眺めてみてください。普段マウスで触っている図形が、実はこのようなデータ構造として管理されていることが分かると、Visioを見る目が変わるはずです。

Visio VBAは、一度習得すれば、あなたの生産性を100倍にも1000倍にも引き上げる強力な武器になります。次は「特定のCellの値を書き換える」「図形を自動で整列させる」といったステップへ進みましょう。

何か分からないことがあれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートしますよ。

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