こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードをそのまま動かしてみたものの、「あれ、これどうやって他の図面に使い回すの?」と途方に暮れてしまったことはありませんか?
今回は、Visio VBAの中級ステップとして、「背景ページ(マスターページ)を動的に切り替えて、ヘッダーやフッター、社名などの図面情報を一括で最新化する」という、実務でめちゃくちゃ使えるテクニックを伝授します。
ここをクリアすれば、バラバラの図面を一瞬で統一感のあるプロ仕様に仕上げられるようになりますよ。しっかりついてきてくださいね!
—
なぜ「背景ページの動的切り替え」が必要なのか?
皆さんは、複数のページを持つ大きな図面を作るとき、ヘッダー(表題欄)やフッター(会社ロゴ、ページ番号など)をどう管理していますか?
すべてのページに同じ表題欄をコピペしているとしたら…それは保守性の地獄への第一歩です。社名が変わったり、担当者が変わったりしたとき、全ページを手作業で修正し直す羽目になります。
Visioには、これを解決する「背景ページ(Background Page)」という素晴らしい機能があります。
表題欄を「背景ページ」として作っておき、通常のページ(前景ページ)の裏側に透かして表示させる仕組みですね。
しかし、実務ではこんな壁にぶつかります。
> 「新しいデザインの表題欄(背景ページ)を作ったけれど、既存の何十ページもある図面の背景を一括でそれに差し替えたい!」
これを手動でやると、ページを開いて、[デザイン]タブを開いて、背景を選んで……と、気が遠くなる作業です。だからこそ、VBAの出番なのです。
—
Visio背景ページの特殊な関係性(超重要!)
コードを書く前に、Visioの少し特殊なオブジェクトの仕組みを知っておく必要があります。ここが今回の肝です。
Visioのページ(`Page`オブジェクト)には、それが「通常のページ」なのか「背景ページ」なのかを区別するプロパティがあります。
- `Page.Type` プロパティ
- `visTypeForeground` (前景ページ:私たちが普段図形を描く場所)
- `visTypeBackground` (背景ページ:表題欄などを置く場所)
そして、前景ページから「どの背景ページを参照しているか」は、前景ページの `BackPage` プロパティという設定で繋がっています。
つまり、やるべきことはシンプルです。
1. 新しい背景ページを特定する(または新規作成する)
2. 図面内のすべての「前景ページ」をループで回す
3. 各前景ページの `BackPage` プロパティを、新しい背景ページに書き換える
これだけです!
—
実践!背景ページを一括で切り替えるVBAコード
それでは、実際の現場でそのままコピペして使える堅牢なコードを公開します。
エラー処理(存在しない背景を指定してしまった場合など)も考慮した、先輩エンジニア仕様のコードです。
Sub UpdateAllPagesBackground()
Dim vsoPage As Visio.Page
Dim vsoBackPage As Visio.Page
Dim targetBgName As String
Dim foundBg As Boolean
‘ — 1. 適用したい背景ページの名前を指定 —
‘ あらかじめ図面に作成してある背景ページの名前を入力してください
targetBgName = “新しい表題欄”
‘ — 2. 指定した背景ページが本当に存在するかチェック —
foundBg = False
For Each vsoPage In ActiveDocument.Pages
‘ 背景ページかつ、名前が一致するか確認
If vsoPage.Type = visTypeBackground And vsoPage.Name = targetBgName Then
Set vsoBackPage = vsoPage
foundBg = True
Exit For
End If
Next vsoPage
‘ 背景ページが見つからなかったら処理を中断
If Not foundBg Then
MsgBox “指定された背景ページ ‘” & targetBgName & “‘ が見つかりません。”, vbCritical, “エラー”
Exit Sub
End If
‘ — 3. すべての前景ページをループして背景を付け替える —
Dim updatedCount As Integer
updatedCount = 0
‘ 画面描画を停止してマクロの実行速度を爆上げするお約束の作法
ActiveWindow.ScreenUpdating = False
On Error GoTo ErrorHandler
For Each vsoPage In ActiveDocument.Pages
‘ 前景ページ(visTypeForeground)の場合のみ処理を実行
If vsoPage.Type = visTypeForeground Then
‘ 背景ページを設定
Set vsoPage.BackPage = vsoBackPage
updatedCount = updatedCount + 1
End If
Next vsoPage
‘ 画面描画を再開
ActiveWindow.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“更新された前景ページ数: ” & updatedCount & “ページ”, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ エラー時のクリーンアップ
ActiveWindow.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
コードのポイント・躓きやすいポイント解説
ここで、コードをより深く理解するための「知見」をいくつかシェアしておきます。
1. `ActiveWindow.ScreenUpdating = False` の魔力
ページ数が数十ページ、数百ページとある図面でVBAを走らせると、画面がパカパカと切り替わり、処理が非常に遅くなります。
処理の最初に `ScreenUpdating = False` を入れ、最後に `True` に戻すことで、バックグラウンドで高速に処理を終わらせることができます。大規模図面を扱うエンジニアの必須テクニックです。
2. 前景と背景の判定 (`vsoPage.Type`)
Visioの `ActiveDocument.Pages` コレクションには、前景も背景もゴチャ混ぜで入っています。
これを区別せずに `.BackPage` を設定しようとしたりすると、「背景ページに背景を設定しようとした」という矛盾が生じてエラーになります。必ず `If vsoPage.Type = visTypeForeground Then` でフィルターをかけましょう。
3. 「名前」ではなく「オブジェクト」で渡す
VisioのVBAでは、`vsoPage.BackPage = “新しい表題欄”` のように名前の文字列を直接代入することはできません。
必ず `Page` オブジェクト(今回は `vsoBackPage`)を変数に格納して代入する必要があります。ここが初心者が一番ハマる罠です。「オブジェクト変数を経由させる」という基本を思い出してくださいね。
—
まとめ:ここをクリアすればVisio VBAは怖くない!
今回は、背景ページを動的に切り替えて図面情報を最新化するテクニックをご紹介しました。
- `Page.Type` で前景と背景を識別する
- `ActiveDocument.Pages` をループして一括処理する
- オブジェクト変数を正しく経由させてプロパティに代入する
この3つさえ押さえておけば、ページ操作系の自動化で困ることはほぼなくなります。
手作業のコピペ地獄から解放されて、もっとクリエイティブな仕事に時間を使いましょう!
「ここをもっとこうしたい」「こんな図面自動化もできる?」といった疑問があれば、いつでもエンジニア仲間として相談してくださいね。それでは、快適なVisio自動化ライフを!
