こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が呪文のようで手直しできない……」そんなもどかしさを感じていませんか?
大丈夫、ここをクリアすればVisio VBAの基本はバッチリです。
今回は、Visioの描画キャンバスを取り仕切る中枢、`Application.ActiveWindow`をターゲットにして、グリッド・ルーラー・ガイド・接続ポイントを一発で切り替える「プレゼンテーションモード(閲覧用/編集用)」の切り替えツールを作ってみましょう。
単なるコードのコピペにとどまらず、Visioのオブジェクトモデルの本質に迫りながら、プロの現場で役立つ知見をたっぷりとお伝えしますね。
—
1. なぜ「画面表示の切り替え」でつまずくのか?
Visioで図面を見せる時、あるいは自分がじっくり編集する時、こんな手間はありませんか?
- 「クライアントに見せる時は、ゴチャゴチャしたガイド線やグリッドを消したい……」
- 「でも、自分で編集する時は、スナップ機能を効かせるためにグリッドもガイドも必要!」
これをマウスでポチポチ切り替えるのは時間の無駄です。VBAを使えば、一瞬で「閲覧用(スッキリ)」と「編集用(フル装備)」を行き来できるようになります。
ここで初心者が最初に陥る罠が、「どこを操作すればいいのか分からない」という問題です。Visioには、ファイルそのものを表す `Document` や、ページを表す `Page` がありますが、「画面上の表示(ズーム、グリッド、ルーラーなど)」はすべて「ウィンドウ(Window)」の管轄なのです。
—
2. Visioオブジェクトモデルの核心:`Application.ActiveWindow`
Visio VBAの階層構造をイメージ図で見てみましょう。
Application (Visioアプリ全体)
┗ ActiveWindow (今あなたが見ているアクティブな窓)
┣ Page (表示されているページ)
┣ ShowGrid (グリッド表示: True/False)
┣ ShowRulers (ルーラー表示: True/False)
┣ ShowGuides (ガイド表示: True/False)
┗ ShowConnectPoints (接続ポイント表示: True/False)
そう、今回操作するのは `ActiveWindow` というオブジェクトです。「今、ユーザーが操作しているウィンドウのビュー設定を変える」というアプローチをとります。
—
3. 実装:プレゼンテーションモード切り替えマクロ
それでは、実際のコードを見てみましょう。
以下のコードを、VisioのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 処理名 : TogglePresentationMode
‘ 概要 : アクティブウィンドウの表示設定を「閲覧モード」と「編集モード」でトグル切り替えする
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Public Sub TogglePresentationMode()
‘ 1. エラーハンドリングの準備(ウィンドウが開かれていない場合などの対策)
On Error GoTo ErrorHandler
Dim targetWindow As Visio.Window
Set targetWindow = Application.ActiveWindow
‘ ウィンドウが存在するかチェック
If targetWindow Is Nothing Then
MsgBox “アクティブなウィンドウが見つかりません。”, vbCritical, “エラー”
Exit Sub
vbExit:
End If
‘ 2. 現在の状態を判定して、モードを反転させる
‘ ※今回は「グリッドが表示されているか」を基準に判定します
If targetWindow.ShowGrid = True then
‘ 【編集モード】 → 【閲覧モード(スッキリ表示)へ移行】
targetWindow.ShowGrid = False ‘ グリッドを消す
targetWindow.ShowRulers = False ‘ ルーラーを消す
targetWindow.ShowGuides = False ‘ ガイドを消す
targetWindow.ShowConnectPoints = False ‘ 接続ポイントを消す
StatusBar = “プレゼンテーションモード(閲覧用)に切り替えました。”
Else
‘ 【閲覧モード】 → 【編集モード(フル装備)へ移行】
targetWindow.ShowGrid = True ‘ グリッドを表示
targetWindow.ShowRulers = True ‘ ルーラーを表示
targetWindow.ShowGuides = True ‘ ガイドを表示
targetWindow.ShowConnectPoints = True ‘ 接続ポイントを表示
StatusBar = “編集モードに切り替えました。”
End If
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub
—
4. コードの深掘り解説:ここがプロの知見
たったこれだけのコードですが、実務で使う上で重要なポイントがいくつか詰まっています。
① `Option Explicit` の絶対的な遵守
コードの最上部にある `Option Explicit`。これは「変数の宣言を強制する」お呪いです。これを書くことで、タイポ(打ち間違い)によるバグを未然に防ぎます。プロの現場ではマスト中のマストです。
② なぜ `ActiveWindow` を変数に代入するのか?
`Application.ActiveWindow` と直接何度も書くこともできますが、`Set targetWindow = Application.ActiveWindow` と一度オブジェクト変数に受けています。
これは、コードの可読性を上げるだけでなく、VBA内部でのオブジェクト参照のオーバーヘッドを減らし、コードを堅牢にするためのテクニックです。
③ ステータスバー(`StatusBar`)の活用
画面の左下に小さく文字が出る `StatusBar = “…”` を入れています。画面がパッと切り替わった時に、「今、どのモードになったのか」を目とステータスバーの両方で直感的に把握できる、ちょっとした心遣い(UI/UXの向上)です。
—
5. 陥りやすいエラーと回避策
実務でこのマクロを組み込む際によくあるトラブルを事前にお伝えしておきます。
- エラー:「オブジェクト変数または With ブロック変数が見つかりません。」
- 原因: Visioの図面ファイルを1つも開いていない状態でマクロを実行すると、`ActiveWindow` が存在しない(`Nothing`)ためエラーになります。
- 対策: 今回のコードのように `If targetWindow Is Nothing Then` でガード節を入れておけば、安全にポップアップで知らせることができます。
- 「あれ?コードを実行したのに画面が変わらない?」
- 原因: 複数ウィンドウを開いている場合、意図しないウィンドウがアクティブになっている可能性があります。Visio VBAでは常に「今フォーカスが当たっている窓」が対象になるため、対象の図面を一度クリックしてアクティブにしてから実行してください。
—
まとめと次のステップ
今回は、`Application.ActiveWindow` を使ったUIの一括制御を通じて、Visio VBAのオブジェクトの捉え方と実用的なコードの書き方を解説しました。
ここをクリアできれば、次は「特定のレイヤーの表示/非表示を連動させる」「図面の保存時に自動で閲覧モードに戻す(Workbook_BeforeSaveイベントの活用)」といった、さらに高度な自動化への扉が開きます。
あなたのVisioライフが、よりスマートで快適なものになりますように。
それでは、次の建築的コードでお会いしましょう!
