Visio VBAの深淵へ:グループ化の「迷宮」を再帰アルゴリズムで攻略する
こんにちは。自動化の現場でVisioと格闘していると、必ず一度は突き当たる壁があります。それが「グループ化された図形の操作」です。
「マクロの記録」で出したコードをいじっていても、なぜかグループ内の図形には手が届かない。あるいは、階層が深くなるとコードがスパゲッティ化してしまう……。そんな経験はありませんか?
今日は、Visioのオブジェクトモデルを正しく理解し、グループ化という「迷宮」を鮮やかに解き明かすための「再帰処理(Recursive Process)」の極意を伝授します。ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。
—
1. なぜ「グループ」は特別なのか?
Visioにおいて、グループとは単なる図形の集合体ではありません。`Group`オブジェクトは、それ自体が「Shape」でありながら、「Shapes」というコレクションを内包するコンテナです。
- 平坦な構造: `Page.Shapes` で取得できるのは、ページ直下の図形のみ。
- 階層構造: グループ内にある図形にアクセスするには、その親となるShapeの `Shapes` コレクションをさらに覗き込む必要があります。
もし、グループの中にさらにグループがある「入れ子構造」だったら? 階層の深さが不明な状態で個別のシェイプを操作するには、「自分自身を呼び出す関数(再帰)」を使うのが、最も美しく、かつ最強の解法です。
—
2. 実践:再帰処理で子シェイプを完全掌握する
以下のコードは、選択した図形(グループを含む)の配下をすべて巡回し、特定の処理(今回は名前の出力)を行う再帰関数です。
‘ メイン処理:選択した図形から探索を開始する
Public Sub TraverseShapes()
Dim shp As Visio.Shape
‘ 選択されている図形を一つずつ処理
For Each shp In ActiveWindow.Selection
Call ProcessShapeRecursive(shp)
Next shp
End Sub
‘ 再帰関数:シェイプを渡すと、その子も含めて処理する
Private Sub ProcessShapeRecursive(ByVal shp As Visio.Shape)
‘ — ここに「シェイプに対する実際の処理」を記述 —
Debug.Print “名前: ” & shp.Name & ” / ID: ” & shp.ID
‘ — 再帰の核心部分 —
‘ グループ化されている場合のみ、その中のシェイプを走査する
If shp.Type = Visio.visTypeGroup Then
Dim subShp As Visio.Shape
For Each subShp In shp.Shapes
‘ 自分自身を呼び出してさらに深く潜る
Call ProcessShapeRecursive(subShp)
Next subShp
End If
End Sub
このコードの「賢い」ポイント
1. 汎用性: 階層が何段階あっても、この関数は自動的に深部まで到達します。
2. 安全な終了条件: グループでない(`visTypeGroup` ではない)図形に当たった時点で処理が止まるため、エラーで落ちる心配がありません。
3. 分離: 処理内容(`Debug.Print`の部分)を自由に変えるだけで、色を変えたり、テキストを書き換えたりと、どんな要件にも対応可能です。
—
3. 陥りやすい罠とエンジニアの心得
初心者がよくやる間違いをいくつか挙げておきます。これを知っているだけで、デバッグの時間が半分になります。
- IDの罠: VisioのシェイプIDは、グループ化したり解除したりすると変化することがあります。名前(`Name`)や、カスタムプロパティ(`Prop`)をキーにして識別する習慣をつけましょう。
- Selectionの扱い: `ActiveWindow.Selection`は非常に便利ですが、実行時の選択状態に依存します。業務自動化ツールとして納品する場合は、`Page.Shapes`から特定の条件(レイヤーや名前)で抽出するロジックを組むのがプロの作法です。
- パフォーマンス: `For Each` はVisio VBAにおいて非常に高速です。インデックス(`Shapes(i)`)で回すよりも読みやすく、エラーも起きにくいので、迷わず `For Each` を使いましょう。
—
最後に:自動化の先にあるもの
グループ化された図形を自在に操れるようになると、Visioは単なる「お絵描きソフト」から「高度なデータベースの視覚化ツール」へと姿を変えます。
再帰処理をマスターすることは、複雑な階層構造を整理する「エンジニアとしての思考」を養うことでもあります。ぜひ、ご自身の業務で「階層の深い図形」を捕まえて、このコードを試してみてください。
「ここがうまく動かない」「もっと複雑な条件で抽出したい」といった壁にぶつかったら、それはあなたがプロの領域に足を踏み入れた証拠です。いつでもまた、この場所へ聞きに来てくださいね。
皆さんの自動化ライフが、より快適で創造的になりますように!
