Visio VBAの真髄を掴め:`HasCategory`で図形の「正体」を瞬時に見抜く極意
こんにちは。現場で泥臭く自動化を積み重ねてきたエンジニアとして、今日は君たちに「Visio図形を自在に操るための第一歩」を授けよう。
多くの人が「マクロの記録」から卒業しようとして、最初にぶつかる壁がある。それは「目の前のシェイプが、一体何者なのか判別できない」という悩みだ。
「この四角形はただの図形か? それとも、情報を束ねるコンテナなのか? あるいは組織図の一部なのか?」
これを見分けるために、無駄なIf文を羅列するのはもうやめよう。Visioには、その役割をスマートに射抜くための強力な武器がある。それが `HasCategory` メソッドだ。
—
1. なぜ「HasCategory」を使うのか?
Visioの図形(Shape)は、単なる線と塗りつぶしの集合体ではない。現代のVisioにおいて、各図形は「メタデータ」という魂を宿している。
`HasCategory`は、その図形が特定の機能カテゴリ(コンテナ、吹き出し、データグラフィック等)に属しているかをTrue/Falseで返すメソッドだ。
なぜこれが重要なのか?
例えば、「ページ内の全シェイプに色を塗る」という処理を書いたとき、コンテナまで塗りつぶしてしまっては、図面の論理構造が壊れる。「役割に応じた処理の選別」こそが、プロの自動化エンジニアと、ただのコードを動かす者の決定的な境界線なんだ。
—
2. 実践:図形の正体を暴くコード
まずは、選択した図形が「コンテナ」なのか「吹き出し(Callout)」なのかを判定するコードを見てみよう。
Sub IdentifyShapeRole()
Dim shp As Visio.Shape
‘ 選択中のシェイプがない場合は終了
If ActiveWindow.Selection.Count = 0 Then
MsgBox “シェイプを選択してください。”
Exit Sub
End If
Set shp = ActiveWindow.Selection(1)
‘ HasCategoryで役割を判定する
‘ “Container”はコンテナ図形、”Callout”は吹き出し図形を指す
If shp.HasCategory(“Container”) Then
Debug.Print “このシェイプは『コンテナ』です。論理的な枠組みとして扱います。”
ElseIf shp.HasCategory(“Callout”) Then
Debug.Print “このシェイプは『吹き出し』です。注釈として扱います。”
Else
Debug.Print “汎用的なシェイプ、あるいはカテゴリ外のオブジェクトです。”
End If
End Sub
このコードの「賢い」ポイント
1. 判定の抽象化: 昔のように`shp.Name`を見て「”Sheet.123″が含まれるか?」といった脆弱な判定をする必要はない。Visioが内部で管理している「役割」を直接叩いているから、図形名が変わってもエラーにならない。
2. メンテナンス性: 今後、例えば「組織図(OrgChart)」の判定を追加したければ、`shp.HasCategory(“OrgChart”)`を条件分岐に足すだけだ。
—
3. 初学者が陥る「3つの罠」
現場でよくある失敗を防ぐために、この3点だけは心に刻んでおいてほしい。
- 罠1:存在しないカテゴリへの期待
`HasCategory`は魔法ではない。Visioがネイティブに認識しているカテゴリ以外を投げても判定はFalseになる。まずは上記のコードで、自分が扱いたい図形が何という文字列を返してくるか、`Debug.Print`で確認する癖をつけよう。
- 罠2:親シェイプの再帰処理を忘れる
グループ化された図形の場合、`Selection`の親がグループか、子シェイプかによって挙動が変わる。複雑な図面を扱う際は、`If shp.Type = visTypeGroup Then`でグループ内を走査するステップを一段挟むのが定石だ。
- 罠3:パフォーマンスの過信
`HasCategory`は高速だが、ページ上の数千のシェイプをループさせる場合は注意が必要だ。必要なシェイプだけを`Selection`や`SpatialSearch`で絞り込んでから判定する。これがエンジニアの「優しさ」だ。
—
4. さあ、次のステップへ
君たちが今書いているマクロは、単なる「操作の自動化」ではない。「図面の意味を解釈するシステム」への第一歩を踏み出したんだ。
まずは、自分の図面にある様々なシェイプを選択し、`HasCategory`の結果をイミディエイトウィンドウに出力させてみてほしい。「あ、これもカテゴリを持っているのか!」という発見が、君のVBAスキルを劇的に進化させるはずだ。
Visio VBAは、オブジェクトモデルさえ理解すれば、これほどまでに論理的で美しい世界はない。分からないことがあれば、いつでもまた聞きに来てくれ。
次は、このカテゴリ判定と連携して、「データグラフィックの自動付与」について深掘りしようか。準備ができたら声をかけてくれ。君の自動化を、最高峰のレベルへ引き上げる手伝いをするよ。
