【入門編】Selectionオブジェクトを操作の起点に:ユーザーが手動選択した図形群に対する一括処理マクロの作り方 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの真髄:Selectionオブジェクトで「現場の操作」をコードに直結させる

こんにちは。業務自動化の最前線へようこそ。

多くのユーザーが「マクロの記録」から入って挫折する理由は、「固定的なコード」しか書けないからです。「Sheet1のA1セル」を指定するような書き方では、図形が100個増えた瞬間にツールはゴミ箱行きになります。

Visioを真に操るエンジニアは、「今、ユーザーが何を見ているか」を起点にします。それが今回解説する`Selection`オブジェクトです。これさえ押さえれば、あなたのマクロは「ただの記録係」から「頼れる相棒」へと進化します。

1. なぜ「Selectionオブジェクト」なのか?

`ActivePage.Shapes(1)` と書くのは、盲目的に「最初の図形」を触る危険な行為です。図形の重なり順(Zオーダー)が変われば、意図しない図形が書き換わります。

しかし、`ActiveWindow.Selection` を使えば、「ユーザーが今、マウスで囲んで選択した図形」という、極めて人間的かつ論理的な対象に対して処理を実行できます。

  • 柔軟性: どの図形を選択しても動く。
  • 直感性: ユーザーインターフェースとしての「選択」とプログラムが同期する。
  • 安全性: 意図しない図形に影響を与えない。

2. 実践:選択した図形を一括制御するテンプレート

まずは、選択した図形の色を強制的に変更する、現場で一番よく使うパターンを見てみましょう。

Public Sub FormatSelectedShapes()
‘ Selectionオブジェクトを格納する変数
Dim sel As Visio.Selection
Dim shp As Visio.Shape

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

‘ 2. 選択されている図形があるか確認(これがないとエラー落ちする)
If sel.Count = 0 Then
MsgBox “対象となる図形を選択してください。”, vbExclamation
Exit Sub
End If

‘ 3. 選択された図形を一つずつ回す(For Eachが鉄則)
For Each shp In sel
‘ 図形がグループ化されている場合などを考慮し、
‘ 必要に応じて条件分岐を入れるのがプロの流儀

‘ 例:図形の塗りつぶし色を「赤」に変更
shp.Cells(“FillForegnd”).ResultIU = Visio.VisColor.visRed

‘ 例:図形にデータを付与(カスタムプロパティ/Shape Data)
‘ ※事前に定義された「Status」というプロパティがあると仮定
If shp.CellExists(“Prop.Status”, 0) Then
shp.Cells(“Prop.Status”).Formula = “””Processed”””
End If
Next shp

‘ 完了通知
Debug.Print sel.Count & ” 個の図形を更新しました。”
End Sub

3. 初学者が必ず陥る「3つの落とし穴」

コードを書く際、以下のポイントを意識するだけで、あなたのマクロは「壊れにくい」ものになります。

① 「選択数ゼロ」の恐怖

`Selection`オブジェクトが空の状態でループを回そうとすると、予期せぬ挙動を招くことがあります。必ず `If sel.Count = 0 Then` でガード節を設けてください。

② グループ図形の扱い

`For Each shp In sel` で回しているとき、もしユーザーが「グループ図形」を選択していたらどうなるでしょうか? `shp` はグループ全体を指します。グループの中身まで処理したい場合は、再帰処理(関数の中で自分自身を呼び出す)が必要になります。まずは「選択図形そのもの」を操作することから始めましょう。

③ 画面描画のパフォーマンス

数千個の図形を一括処理する場合、画面の再描画がボトルネックになります。

Application.ScreenUpdating = False ‘ 処理前にオフ
‘ …処理…
Application.ScreenUpdating = True ‘ 最後にオン

この一行を入れるだけで、処理速度が劇的に向上します。大規模なドキュメントを扱うときは必須のテクニックです。

4. プロのアーキテクトからのアドバイス

Visio VBAにおける `Selection` オブジェクトは、「ユーザーとプログラムを繋ぐインターフェース」です。

マクロの記録で生成される「動かないコード」を脱却する第一歩は、「対象を直接指定せず、選択状態から動的に取得する」というこの思考法にあります。

「今日、何を自動化したいですか?」

もし選択した図形に特定のルールを適用したいなら、まずはこのテンプレートをコピーして、`shp.Cells(“…”)` の中身をいじってみてください。そこから先は、あなたの創造力次第です。

ここをクリアすれば、Visio VBAの基本はバッチリです。次は「選択図形の中から特定のレイヤーだけを抽出する」といった応用編に挑戦してみましょう。応援しています。

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