【入門編】Shape.ParentShapesプロパティを活用したグループ構造の最上層ルート特定アルゴリズム – Visio VBA解析バイブル

スポンサーリンク

こんにちは。業務自動化の世界へようこそ。

Visioというツールは、単なる「お絵かきソフト」ではありません。実は、「木構造(ツリー構造)」というデータ構造を視覚的に操作できる、極めて強力なプログラミング・プラットフォームです。

多くの人がマクロの記録で挫折するのは、Visioが持つ「グループ」という概念の深淵を覗かないからです。今回は、多重にネストされたグループの中から、頂点(ルート)を見つけ出す「アルゴリズム」という武器を手に入れましょう。

1. Visioのオブジェクトモデルを「家族」で理解する

Visioのコードを書く際、まずはこの階層をイメージしてください。

  • Application: 全てを統括する親玉(Visioそのもの)。
  • Document: 図面ファイル。
  • Page: 白いキャンバス。
  • Shape: ここが本丸です。「グループも、中身の図形も、すべてShapeである」というルールが、Visioの美しさであり、同時に難解さの源泉です。

グループ化された図形は、親Shapeの中に子Shapeが格納されている「入れ子構造」になっています。この構造を遡るために欠かせないのが、今回扱う `Shape.ParentShapes` プロパティです。

2. なぜ「ルート特定」が必要なのか?

例えば、複雑なネットワーク図で「特定の部品をクリックした時、その部品が属するシステム全体の枠(グループ)を操作したい」というケース。

普通に `Shape.Parent` を使うと、1つ上の階層しか取得できません。しかし、何重にもグループ化されている場合、再帰的に遡る必要があります。ここで「親がなくなるまで登り続ける」というアルゴリズムが必要になるのです。

3. 実装:最上層ルートを特定するイテレータ

以下の関数は、渡されたシェイプから一番外側の親を探し当てるための知見が詰まったコードです。

‘ 指定したシェイプの所属する最上層(ルート)のグループを返す関数
Public Function GetRootShape(ByVal shp As Visio.Shape) As Visio.Shape
Dim currentShape As Visio.Shape
Set currentShape = shp

‘ 親がなくなる(またはPageオブジェクトに到達する)まで遡り続ける
‘ Visioでは、グループの親がDocumentやPageになるまでParentShapesを辿る
Do While Not currentShape.Parent.Type = Visio.VisObjectTypes.visTypePage
‘ 自身の親がPageでない場合、さらに上の親へ移動
Set currentShape = currentShape.Parent
Loop

‘ ルートとなったシェイプを返す
Set GetRootShape = currentShape
End Function

コードの解説

  • `Do While` ループ: 「親がページになるまで」という条件で遡ります。これが最も確実な終了条件です。
  • `currentShape.Parent`: 非常に強力なプロパティです。現在のシェイプが所属するオブジェクト(Shape、Page、Masterなど)を返します。
  • エラー回避の知恵: もしシェイプがグループ化されていない(ページに直接置かれている)場合、この関数は自信を返します。理に適っていますね。

4. 陥りやすい罠:ここだけは注意!

初学者が必ず突き当たる壁が「Parentプロパティの型」です。

  • : `currentShape.Parent` は、状況によって `Shape` オブジェクトを返すこともあれば、`Page` オブジェクトを返すこともあります。
  • 解決策: 上記コードのように `Type` プロパティで判定を行うのが、Visio VBAにおいて最も堅牢(ロバスト)な書き方です。型推論に頼らず、明示的に「今はどこにいるのか」を判定する。これが一流への第一歩です。

5. 次のステップ:自動化の先へ

この `GetRootShape` を手に入れたあなたは、もう「クリックした図形がどのグループに属しているか」を悩む必要はありません。

例えば、
1. クリックしたシェイプのルートを特定する。
2. そのルートの `Cells(“FillForegnd”)` を操作して色を変える。
3. ルートの名前(Name)をログに出力する。

といった自動化が、数行のコードで実現できるようになります。

先輩からのメッセージ

Visio VBAは、オブジェクトの「関係性」を理解すれば、どんなに複雑な図面でも制御可能です。まずはこのコードをVBE(Visual Basic Editor)に貼り付け、適当なグループ化図形を作ってテストしてみてください。

「構造を把握すれば、操作は自由自在」。これがVisio自動化の醍醐味です。
分からないことがあれば、いつでもまた聞きに来てくださいね。一緒に最強の自動化環境を構築していきましょう!

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