こんにちは。Visioの世界へようこそ。
「マクロの記録」ボタンを押して生成された、冗長で危ういコードを眺めるのは今日で終わりにしましょう。
Visioというアプリケーションは、実は非常に「多層的」な怪物です。単なる図面ソフトと思われがちですが、その内側にはWindow、Document、Page、Shapeという厳格な階層構造が存在します。
今回は、この階層の最上位に位置する`Application.Windows`コレクションを掌握し、あなたの作業環境を瞬時に最適化する「UI制御の極意」を伝授します。
—
なぜ「ウィンドウ制御」が必要なのか?
大規模な設計図を作成していると、画面はステンシル、シェイプシート、複数の図面ウィンドウで溢れかえりますよね。手動でこれらを整理するのは時間の無駄です。
「設計モードでは全ステンシルを閉じる」「レビューモードでは特定の図面だけを並べて表示する」といった制御を自動化できれば、あなたの思考の深さは一段階引き上がります。
—
1. Visioウィンドウの「正体」を見極める
Visioのウィンドウにはいくつか種類があります。まずはここを識別しないと、コードは暴走します。`Window.Type`プロパティがその鍵です。
| Window.Type | 意味 |
| :— | :— |
| `visDrawing` | メインの描画領域 |
| `visStencil` | ステンシルウィンドウ |
| `visSheet` | シェイプシートウィンドウ |
これらを走査する基本形がこれです。まずは写経して、自分の環境で何が起きるか見てみましょう。
Sub InspectWindows()
Dim win As Visio.Window
‘ Application.Windows は現在開いている全ウィンドウのリスト
For Each win In Application.Windows
Debug.Print “Window Name: ” & win.Caption
Select Case win.Type
Case VisWindowTypes.visDrawing
Debug.Print ” -> 描画ウィンドウです”
Case VisWindowTypes.visStencil
Debug.Print ” -> ステンシルです”
Case VisWindowTypes.visSheet
Debug.Print ” -> シェイプシートが開かれています”
End Select
Next win
End Sub
—
2. 実践:UIの動的切り替えテクニック
単に眺めるだけではエンジニアとは言えません。「すべてのステンシルを非表示にして、描画領域を広げる」という、実務で死ぬほど使う機能を作りましょう。
ここで重要なのは、`win.Close` メソッドを闇雲に使わないことです。ステンシルを閉じるのと、ドキュメントを閉じるのは全く別物だからです。
Sub OptimizeWorkspace()
Dim win As Visio.Window
‘ 画面描画を停止して処理速度を向上させる(鉄則!)
Application.ScreenUpdating = False
For Each win In Application.Windows
‘ ステンシルウィンドウなら閉じる
If win.Type = VisWindowTypes.visStencil Then
win.Close
End If
‘ 描画ウィンドウならアクティブにして最大化する
If win.Type = VisWindowTypes.visDrawing Then
win.Activate
win.WindowState = VisWindowStates.visWSMaximized
End If
Next win
Application.ScreenUpdating = True
MsgBox “ワークスペースが整理されました。”
End Sub
【ここがポイント!】
- `Application.ScreenUpdating = False`: これを忘れると、ウィンドウがパタパタと切り替わる様子が全て画面に描画され、処理が劇的に遅くなります。プロのコードには必須の「お作法」です。
- `win.Activate`: 操作対象を明確にすることは、後のバグを未然に防ぐ防御的プログラミングの第一歩です。
—
3. 陥りやすい罠:コレクション操作の落とし穴
初心者が最もハマるのが、「ループ中にオブジェクトを削除(Close)するとインデックスがずれる」という現象です。
しかし、安心してください。`For Each` 文を使っている限り、Visioのコレクションは比較的安全に走査できます。もし `For i = 1 To Windows.Count` のような古い書き方をしているなら、必ず「後ろから(Count To 1 Step -1)」ループを回すようにしてください。前方向から削除すると、必ずインデックスエラーで止まります。
—
最後に:先輩からのアドバイス
Visio VBAをマスターするコツは、「オブジェクトエクスプローラー(F2キー)」と友達になることです。
`Window`オブジェクトには、今回紹介した`Type`や`WindowState`以外にも、`Visible`(表示状態)、`Left`, `Top`, `Width`, `Height`(配置座標)など、制御可能なパラメータが山ほどあります。
「画面の右側にステンシルを固定して、左側に図面を並べたい」
そんな要望も、`Window`オブジェクトの座標をプログラムから書き換えるだけで実現可能です。
まずは今日紹介したコードで「ウィンドウを操る」感覚を掴んでください。それができれば、あなたはもうVisioユーザーではなく、Visioを支配するエンジニアへの階段を登り始めていますよ。
何か詰まったら、いつでも聞いてくださいね。応援しています。
