【入門編】Selectionオブジェクトを活用したユーザー選択図形の一括処理マクロの作り方 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの真髄:Selectionオブジェクトで「選んだ図形」を自在に操る極意

こんにちは。現場で「動けばいいコード」から「保守可能で美しいコード」へとステップアップしようと足掻くあなたへ。

Visioという巨大な宇宙において、Selectionオブジェクトを掌握することは、マクロの記録という「砂遊び」を卒業し、真の自動化エンジニアへと至る最初の関門です。

今回は、ユーザーがマウスで選択した図形をVBAで拾い上げ、一括で調理するテクニックを伝授します。

1. Selectionオブジェクトとは何か?

Visioにおいて、あなたがマウスで「囲った」あるいは「Ctrlキーを押しながらクリックした」図形群。これをVBAでは`Selection`オブジェクトと呼びます。

このオブジェクトの最大の特徴は、「現在の画面状態(コンテキスト)に依存する」という点です。コードを実行した瞬間に、ユーザーが何を選んでいるか。その「刹那の選択状態」をプログラム側で捕捉するのです。

基本の取得経路

Dim sel As Visio.Selection
Set sel = ActiveWindow.Selection

これだけで、今あなたの画面でハイライトされている図形たちが、`sel`という変数の中に収まります。あとは、この中身をループで回すだけです。

2. 実践:選択した図形を一括で「プロフェッショナルな見た目」に変える

ただ色を変えるだけなら「マクロの記録」で十分です。しかし、我々は「現場で使えるエンジニア」を目指します。以下のコードは、選択された図形に対して「塗りつぶし」と「データ付与」を同時に行う実用的なテンプレートです。

Sub BatchProcessSelectedShapes()
‘ 1. オブジェクト変数の宣言
Dim sel As Visio.Selection
Dim shp As Visio.Shape

‘ 2. 現在の選択範囲を取得
Set sel = ActiveWindow.Selection

‘ 3. エラーハンドリング:何も選択していない場合のガード節
If sel.Count = 0 Then
MsgBox “図形を選択してから実行してください。”, vbExclamation
Exit Sub
End If

‘ 4. 選択された図形を一つずつ処理(イテレーション)
For Each shp In sel
‘ 【Tips】グループ化された図形の中身まで触る必要があるか?を考慮する
‘ ここでは単純な図形を想定

‘ スタイルの変更:塗りつぶしを青色に変更
shp.Cells(“FillForegnd”).Formula = “RGB(0, 120, 215)”

‘ Shape Data (カスタムプロパティ) の付与
‘ ※事前に定義されているプロパティを想定
If shp.CellExists(“Prop.Status”, False) Then
shp.Cells(“Prop.Status”).Formula = “””Processed”””
End If
Next shp

MsgBox sel.Count & ” 個の図形を正常に処理しました。”, vbInformation
End Sub

3. なぜ「マクロの記録」ではダメなのか?

マクロの記録で作られるコードは、往々にして `ActiveWindow.Select` を多用し、画面描画を強制的に更新しようとします。これはパフォーマンスの敵です。

  • 無駄な描画更新: 100個の図形を処理するたびに画面がチラつきます。
  • 脆弱性: ユーザーが処理中にマウスを動かすと、`Selection`の状態が変わり、エラーを吐くことがあります。

上記のコードでは、`ActiveWindow.Selection` を一度変数に格納してから処理しているため、処理中に画面上の選択状態が変わっても、プログラムは「最初に選ばれた図形群」を保持し続けます。これが堅牢なプログラムの秘訣です。

4. 陥りやすい罠:グループと階層構造

初心者エンジニアが必ずぶつかる壁が「グループ図形」です。

`Selection`の中にグループ化された図形が含まれている場合、`For Each shp In sel` で取得できるのは「グループ全体」という1つの図形です。もし、グループの中にある個別のパーツの色を変えたい場合は、以下のような再帰処理が必要になります。

‘ グループ内の全図形を処理するヒント
If shp.Type = Visio.visTypeGroup Then
‘ 再帰的に処理するロジックが必要(今回は割愛しますが、ここが上級者への入り口です)
End If

最後に:先輩からのアドバイス

Visio VBAを学ぶ上で最も重要なのは、「Visioのオブジェクトモデル図」を眺めることです。`Application`の下に`Document`があり、その下に`Page`があり、そして`Selection`がある。この階層構造を脳内でイメージできるようになれば、あなたはもう初心者ではありません。

まずは、今日紹介したコードをコピペして、自分のVisioで動かしてみてください。
「プロパティが変わった!」というその小さな感動こそが、最強の自動化エンジニアへの第一歩です。

何か詰まったら、いつでも戻ってきてください。ここには、あなたの挑戦を支える知見が常に蓄積されていますから。

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