【テクニカル・上級編】Page.IsSelectedShapesEnabledとSelection.FitToPageを使った選択図形の全画面自動ズーム&プレゼンモード化 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵:選択図形への「強制フォーカス」とプレゼンテーション・エンジン構築の極意

Visioを単なる作図ツールとして使うのは、フェラーリを近所のスーパーへの買い物に使うようなものだ。
我々プロフェッショナルにとって、Visioは「動的なデータ視覚化エンジン」であり、VBAはその心臓部を直接制御するための唯一のインターフェースである。

今回は、複雑なダイアグラムの中から特定のロジックに従って図形を抽出し、それらを画面中央へ「強制的に叩き込む」ための、極めて実戦的なプレゼンテーション支援の実装手法を解剖する。

1. オブジェクトモデルの罠:SelectionとViewの制約

多くの初学者は、単に `Shape.Select` を繰り返せば良いと考えがちだ。しかし、大規模なVisioドキュメントにおいて、`Selection` オブジェクトを無秩序に操作することは、メモリリークとパフォーマンス低下の直接的な原因となる。

我々が制御すべきは `ActiveWindow` のビューポートである。`Selection.FitToPage` は便利だが、これは「ページ全体」に合わせるもの。特定の図形群にフォーカスするには、数学的なアプローチが必要になる。

核心となる設計思想

  • イベントの抑止: `Application.ScreenUpdating = False` は必須。描画ループを物理的に止める。
  • 明示的解放: `Set obj = Nothing` を怠ることは、COM参照カウントを汚染し、Visioのプロセスがゾンビ化する原因となる。
  • IsSelectedShapesEnabledの活用: ユーザーの干渉を防ぎ、プログラム側で選択状態を完全に支配する。

2. 実装:プレゼンテーション・フォーカス・エンジン

以下のコードは、指定された条件に合致するShape群を動的に抽出し、それらをアクティブウィンドウの中央に、可能な限り大きく表示するためのスニペットだ。

‘ 伝説的なチーフアーキテクトによる、高効率フォーカスモジュール
Public Sub FocusOnTargetShapes(ByVal targetLayerName As String)
Dim vsoApp As Visio.Application
Dim vsoWin As Visio.Window
Dim vsoPage As Visio.Page
Dim vsoSel As Visio.Selection
Dim shp As Visio.Shape

Set vsoApp = Application
Set vsoWin = vsoApp.ActiveWindow
Set vsoPage = vsoWin.Page

‘ 1. 画面更新の停止:パフォーマンスの極限最適化
vsoApp.ScreenUpdating = False
vsoApp.DeferRecalc = True

On Error GoTo Cleanup

‘ 2. 選択状態の制御
vsoWin.DeselectAll
vsoWin.SelectAll ‘ 一旦リセット
vsoWin.DeselectAll

‘ 3. 特定レイヤーの図形をプログラム的に選択
For Each shp In vsoPage.Shapes
If shp.Layer(1).Name = targetLayerName Then
vsoWin.Select shp, VisSelectArgs.visSelect
End If
Next

‘ 4. ここが極意:選択範囲へのフォーカス
‘ FitToPageは選択範囲が有効な場合、その範囲にズームする
‘ Windows APIを介さずとも、Visio内部のViewポート演算を利用する
vsoWin.Selection.FitToPage

‘ 5. プレゼンモードの演出:選択の無効化(誤操作防止)
vsoWin.IsSelectedShapesEnabled = False

Cleanup:
‘ 6. メモリの明示的解放とフラグ復帰
vsoApp.DeferRecalc = False
vsoApp.ScreenUpdating = True

Set vsoSel = Nothing
Set vsoWin = Nothing
Set vsoPage = Nothing
Set vsoApp = Nothing

If Err.Number <> 0 Then Debug.Print “Error: ” & Err.Description
End Sub

3. なぜ `IsSelectedShapesEnabled = False` なのか

このプロパティを理解している者は少ない。通常、Visioは「ユーザーが図形を触る」ことを前提に設計されている。しかし、プレゼンテーションや監視画面としてVisioを利用する場合、ユーザーの誤クリックはシステム破綻を招く。

`IsSelectedShapesEnabled = False` を設定することで、VBA側で管理しているSelectionオブジェクトの整合性を保ちつつ、UI上の干渉を物理的に遮断できる。これは、大規模なインフラ構成図やプロセスモニタリング画面を構築する際の「必須の守り」だ。

4. レガシー環境における保守の知見

Visio VBAは古い技術だが、その背後にあるCOMアーキテクチャは堅牢だ。もしあなたの現場でVisioが頻繁にクラッシュするなら、それはコードのせいではない。「COMイベントの多重登録」「Shapeオブジェクトのキャッシュ管理ミス」が原因である可能性が高い。

  • イベントの非同期処理: `Document_ShapeAdded` 等のイベントを使用する際は、必ず `Static` なフラグを立てて再帰呼び出しを防止せよ。
  • Windows APIの併用: 画面解像度が複雑なマルチディスプレイ環境では、`GetSystemMetrics` 等でウィンドウ座標を取得し、`Window.SetViewRect` を併用することで、より緻密な表示制御が可能になる。

結びに代えて

自動化とは、単にコードを書くことではない。Visioという巨大なオブジェクトの「呼吸」を読み取り、そのメモリ消費と描画タイミングを支配することだ。

今回紹介した「強制フォーカス」の手法をマスターすれば、貴方の構築するシステムは、ただの図面から、意思を持つインタラクティブな情報ダッシュボードへと進化するだろう。

コードを書け。ただし、ただ動くものではなく、システムが美しく鼓動するコードを。

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