こんにちは!Visioのオートメーションの世界へようこそ。
マクロの記録ボタンを押して図形を動かすだけのステージから、そろそろ本当の意味でVisio VBAを「手懐けたい」と思っている頃ではないでしょうか。
今回は、Visio VBAにおいて最も実用的でありながら、多くの人がつまずく「図形選択の制御(SelectionオブジェクトとCreateSelection)」について、その裏側の仕組みから実践的なテクニックまで、徹底的に解説していきます。
ここをクリアすれば、あなたの描画作業の自動化スキルは一気にプロの領域へと引き上げられますよ。一緒にマスターしていきましょう!
—
1. Visioの「選択(Selection)」という概念の正体
まず、Visioのオブジェクトモデルにおける「選択」の基本を確認しておきましょう。
画面上でマウスを使って図形をいくつか囲んだとき、Visioのウィンドウ(Windowオブジェクト)には「今、何が選択されているか」という状態が保持されます。これが `ActiveWindow.Selection` です。
プログラミング初学者がやりがちな間違いがこれです。
‘ 【NGな例】画面上の選択を変えようとして直接プロパティをいじろうとする
ActiveWindow.Selection = myShape ‘ エラーになります!
Visio VBAにおいて、選択状態というのは「GUI(画面)と連動する動的なビューの状態」です。そのため、単一の図形を代入するような簡単な方法では選択状態を変えられません。
ここで登場するのが、今回主役となる `CreateSelection` メソッド と `Selection` オブジェクト です。
—
2. Selectionオブジェクトを自在に操る2つのアプローチ
Visioで図形を選択状態にするには、大きく分けて2つのアプローチがあります。
1. 既存の選択をベースにする(Window.Selection)
2. 条件に合う図形を集めて新しく選択を作る(Page.CreateSelection)
実務で圧倒的に強力なのは2つ目の `Page.CreateSelection` です。これは、「特定の条件(例えば、特定のレイヤーにある、文字が含まれている、特定のマスター図形から作られている等)に合致する図形をコードでかき集め、一瞬で選択状態にする」という魔術のようなアプローチです。
基本のコード:条件に合う図形を一括選択する
それでは、アクティブなページ上にあるすべての「長方形(特定のシェイプ名など)」をプログラムで探し出し、一括して選択状態(ハイライト)にするコードを見てみましょう。
Sub SelectSpecificShapes()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim vsoSelection As Visio.Selection
Dim targetShapes() As Visio.Shape
Dim count As Long
‘ 1. 現在のページを取得
Set vsoPage = ActivePage
‘ 配列の初期化(動的配列)
count = 0
‘ 2. ページ内の全図形をループして条件判定
For Each vsoShape in vsoPage.Shapes
‘ 例:名前に「Server」が含まれる図形をターゲットにする
If InStr(vsoShape.Name, “Server”) > 0 Then
ReDim Preserve targetShapes(count)
Set targetShapes(count) = vsoShape
count = count + 1
End If
Next vsoShape
‘ 3. ターゲットが見つかった場合のみ処理を実行
If count > 0 Then
‘ CreateSelectionメソッドで、見つけた図形群を「結合(visSelAdd)」してSelectionオブジェクトを作る
‘ ※最初に対象の配列や図形を渡す必要があります
Set vsoSelection = vsoPage.CreateSelection(visSelTypeEmpty)
Dim i As Long
For i = 0 to UBound(targetShapes)
vsoSelection.Select targetShapes(i), visSelect
Next i
‘ 4. 作成したSelectionオブジェクトを画面のウィンドウに反映させる!
ActiveWindow.Selection = vsoSelection
MsgBox count + “個のサーバー図形を選択しました!”, vbInformation
Else
MsgBox “条件に合致する図形はありませんでした。”, vbExclamation
End If
End Sub
コードのここがポイント!
- `visSelTypeEmpty`: 空の選択セットを作成するための第一歩です。ここから `Select` メソッドで図形を追加していきます。
- `vsoSelection.Select targetShape, visSelect`: Selectionオブジェクトに図形を「追加」する指示です。
- `ActiveWindow.Selection = vsoSelection`: ここで初めて画面上のマウス選択とコードが同期し、ユーザーの画面上でピカピカと図形が選択状態になります。
—
3. 現場で役立つ!さらにスマートな一括操作テクニック
せっかく `Selection` オブジェクトを作ったのですから、選択するだけではもったいありません。Selectionオブジェクトの真骨頂は、「選択されたグループに対して、一括でプロパティを変更できること」にあります。
例えば、選んだ図形すべての枠線を「赤色」にし、かつ「太く」したい場合、わざわざループを回さなくてもSelectionオブジェクト経由で一撃処理が可能です。
Sub HighlightAndModifySelection()
Dim vsoSelection As Visio.Selection
Set vsoSelection = ActiveWindow.Selection ‘ 今画面で選択されているもの、あるいはコードで作ったもの
If vsoSelection.Count = 0 Then
MsgBox “図形が選択されていません。”, vbExclamation
Exit Sub
End If
‘ 選択されているすべての図形の線の色を赤(RGB: 255, 0, 0)に変更
vsoSelection.Cells(“LineColor”).FormulaU = “RGB(255,0,0)”
‘ 線の太さを 2pt に変更
vsoSelection.Cells(“LineWidth”).FormulaU = “2 pt”
MsgBox “選択された ” & vsoSelection.Count & ” 個の図形を一括変更しました!”, vbInformation
End Sub
個別の `Shape` ごとに `Cells` を書き換えるよりも、`Selection` オブジェクトを介して一括操作する方が、描画のちらつき(画面の再描画コスト)を抑えられ、コードの実行速度も圧倒的に速くなります。これがプロのエンジニアが知るパフォーマンス最適化の知見です。
—
4. 陥りやすい罠とエラー回避の知見
最後に、実務で必ず直面する「落とし穴」と、その回避策をお伝えしておきます。
罠1:マスター図形やガイド線まで巻き込んでしまう
`vsoPage.Shapes` を単純にループさせると、ユーザーが配置した図形だけでなく、ドキュメントに含まれるグループの内部図形や、場合によっては予期せぬシェイプまで拾ってしまうことがあります。
- 対策: `vsoShape.Type` プロパティ(グループか、マスター図形か、通常の図形か)を条件分岐に組み込み、意図した図形だけを配列やSelectionに含めるようにフィルタリングしましょう。
罠2:画面更新(パフォーマンス)の罠
大量の図形を選択状態にしたり、一括操作したりするとき、Visioは親切心から「図形が1つ変わるたびに画面を再描画」しようとします。これがマクロを遅くする最大の原因です。
- 対策: コードの最初と最後で、画面の自動描画を一時停止させましょう。
‘ 処理の最初
Application.ScreenUpdating = False
‘ — ここに重い処理や選択・一括変更コードを書く —
‘ 処理の最後
Application.ScreenUpdating = True
ActiveWindow.Redraw
この `ScreenUpdating = False` を挟むだけで、処理速度が体感で何倍も跳ね上がります。ぜひ現場のコードに取り入れてください。
—
まとめ
今回は、Visio VBAにおける `Selection` オブジェクトと `CreateSelection` の使い方を深く掘り下げて解説しました。
1. 画面の選択状態は `ActiveWindow.Selection` で制御する
2. 条件に合う図形をプログラムで集めるには `Page.CreateSelection` を使う
3. Selectionオブジェクトを使えば、一括プロパティ変更や高速化の恩恵を受けられる
ここさえクリアすれば、複雑な図面の中から特定の機器やフローを探し出し、一瞬でハイライトしてレポートを出力するといった、実用性の高い高度なVisioツールが自由自在に作れるようになります。
ぜひ、あなたの手元のVBAエディタ(Alt + F11)を開いて、試してみてくださいね。あなたのVBAライフがより快適でクリエイティブなものになりますように!
