【入門編】グループ化された図形の罠を突破する:GroupShapesコレクションを再帰的に走査して子シェイプを操作する – Visio VBA解析バイブル

スポンサーリンク

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は単なる「お絵描きソフト」から「高度なデータベースの視覚化ツール」へと姿を変えます。

再帰処理をマスターすることは、複雑な階層構造を整理する「エンジニアとしての思考」を養うことでもあります。ぜひ、ご自身の業務で「階層の深い図形」を捕まえて、このコードを試してみてください。

「ここがうまく動かない」「もっと複雑な条件で抽出したい」といった壁にぶつかったら、それはあなたがプロの領域に足を踏み入れた証拠です。いつでもまた、この場所へ聞きに来てくださいね。

皆さんの自動化ライフが、より快適で創造的になりますように!

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