こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードを眺めて、「おや、なんだかこれだけでは動かないぞ…?」と頭を抱えた経験はありませんか?
今回は、Visio VBAの基礎でありながら、多くの人がつまずく「ページの種類(通常ページと背景ページ)」のコントロールについて、深く、そして優しく解説していきます。
マルチページの図面を作るとき、すべてのページに同じ枠線や会社ロゴを一枚ずつ手作業で貼り付けていませんか? そんな無駄な労力は、今日で終わりです。`Page.Type`と`Page.Background`をVBAで完全に掌握すれば、何百ページある図面でも、一瞬で美しく、構造化されたドキュメントに仕立て上げることができますよ。
ここをクリアすれば、あなたのVisio VBAスキルは確実に次のステージへ進みます。さあ、一緒に扉を開きましょう!
—
1. Visioの「ページ」の裏側を覗いてみよう
Visioのドキュメント(Document)は、複数のページ(Page)の集合体です。しかし、Visioのページには「役割」があることをご存知でしょうか?
Visioの内部構造において、ページは大きく分けて以下の2つの顔を持っています。
1. 通常ページ(Foreground Page): 私たちが普段図を描いたり、フローチャートを配置したりするメインのキャンバスです。
2. 背景ページ(Background Page): ヘッダー、フッター、図面枠、社名ロゴなどを配置するための「下敷き」専用のページです。
陥りやすい罠:背景は「ただのページ」ではない
「背景ページなんだから、普通にページを作って背景っぽく配置すればいいや」……これ、初心者がやりがちな最大のミスです。
Visioでは、あるページを「背景ページ」として機能させるために、ページの属性(Type)と背景としての紐付け(Backgroundプロパティ)をプログラムから正確に指示してあげる必要があります。ここをサボると、図面枠が勝手に動いてしまったり、背景として正しく認識されなかったりするバグの温床になります。
—
2. 核心に迫る!Page.Type と Page.Background の正体
VBAでページを操作するとき、押さえておくべきプロパティは主にこの2つです。
- `Page.Type`(ページの種別)
- `visTypeForeground` (1):通常ページ
- `visTypeBackground` (2):背景ページ
- `Page.Background`(背景関係の紐付け)
- `True`:このページは「背景ページ」である、あるいは対象のページに「背景が設定されている」状態を示すフラグ。
- `BackPage` プロパティと組み合わせて、「どの通常ページに、どの背景ページを割り当てるか」を決定します。
百聞は一見にしかず。実際にコードを書いて、この連動関係を動かしてみましょう。
—
3. 実践!背景ページを自動生成し、通常ページに割り当てるVBAコード
以下のコードは、「共通の図面枠(背景ページ)」をプログラムで自動作成し、それを「新しい通常ページ」の背景として動的に割り当てる完全なサンプルです。
開発タブのVBE(Visual Basic Editor)を開き、標準モジュールに貼り付けて実行してみてください。
Sub CreateAndAssignBackgroundPage()
Dim vsoApp As Visio.Application
Set vsoApp = ActiveApplication
Dim vsoDoc As Visio.Document
Set vsoDoc = vsoApp.ActiveDocument
Dim vsoBackPage As Visio.Page
Dim vsoForePage As Visio.Page
On Error GoTo ErrorHandler
‘—————————————————-
‘ 1. 背景ページを新規作成し、属性を設定する
‘—————————————————-
Set vsoBackPage = vsoDoc.Pages.Add
‘ ページの種類を「背景ページ」に明示的に変更
vsoBackPage.Type = visTypeBackground
vsoBackPage.Name = “共通図面枠”
‘ 背景ページ上のサイズを設定(例: A4横サイズ相当にする場合など)
vsoBackPage.PageSheet.CellsU(“PageWidth”).ResultIU = 11.69 [inch]
vsoBackPage.PageSheet.CellsU(“PageHeight”).ResultIU = 8.27 [inch]
‘ 簡単な枠線シェイプを背景ページに配置(ここでは四角形を配置)
Dim vsoRect As Visio.Shape
Set vsoRect = vsoBackPage.DrawRectangle(0.5, 0.77, 11.19, 7.5)
vsoRect.Text = “CONFIDENTIAL – 共通ヘッダー”
vsoRect.CellsU(“LineColor”).FormulaU = “RGB(200,0,0)”
‘—————————————————-
‘ 2. 通常ページを新規作成し、作成した背景を割り当てる
‘—————————————————-
Set vsoForePage = vsoDoc.Pages.Add
‘ ページの種類は「通常ページ」(デフォルトがforegroundですが明示も可)
vsoForePage.Type = visTypeForeground
vsoForePage.Name = “システム構成図_P1”
‘ 【超重要】この通常ページの背景として、先ほどの背景ページを指定する!
vsoForePage.BackPage = vsoBackPage.Name
MsgBox “背景ページの作成と通常ページへの割り当てが完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードの解説:ここがエンジニアのこだわりポイント
1. `vsoBackPage.Type = visTypeBackground`
これにより、Visioはこのページを「独立した図面」ではなく「下敷き」として扱うようになります。通常ページの一覧から除外され、背景選択のプルダウンに現れるようになります。
2. `vsoForePage.BackPage = vsoBackPage.Name`
ここが今回のテーマの核心です。通常ページに対して「あなたの背景はこれですよ」と名前で結びつけることで、通常ページの裏側に自動的に背景が合成される仕組みです。
—
4. 現場でありがちな「エラー」と回避の知見
プログラミング初学者がこのテーマに挑んだとき、ほぼ100%遭遇する壁がいくつかあります。プロの知見として、あらかじめ回避策を授けておきましょう。
トラブル1:背景ページを指定したのに何も表示されない
- 原因: 背景ページの `PageWidth` や `PageHeight`(ページの物理サイズ)が、通常ページのサイズと異なっている場合、描画領域からはみ出て見えなくなることがあります。
- 対策: 通常ページと背景ページを作成する際は、必ず同じ単位系(インチやミリ)とキャンバスサイズをプログラム側で同期させてください。
トラブル2:「実行時エラー:指定された名前のページが見つかりません」
- コリ: `vsoForePage.BackPage = “存在しない名前”` と記述してしまっているか、背景ページの `Type` を `visTypeBackground` に設定する前に割り当てようとした場合に発生します。
- 対策: オブジェクトの生成順序を守ること。必ず「背景ページを作る ➔ プロパティを設定する ➔ 通常ページを作る ➔ BackPageプロパティで結ぶ」というライフサイクルの順序を厳守してください。
—
まとめ:自動化の土台は「オブジェクトの役割理解」から
今回は、`Page.Background` と `Page.Type` を連動させ、通常ページと背景ページをVBAで自在にコントロールする方法を解説しました。
- 背景ページは `visTypeBackground` で明示的に定義する。
- 通常ページの `BackPage` プロパティに背景ページの名称を渡すことで、スマートなレイアウト共有を実現する。
この仕組みをマスターすれば、何十枚もの図面枠の管理や変更に怯える必要はもうありません。コード数行でドキュメント全体をコントロールする、本当の意味での「自動化の心地よさ」を手に入れることができます。
ここをクリアしたあなたなら、もうVisio VBAの基礎はバッチリです!ぜひ実際の業務で試してみてくださいね。次回の応用編もお楽しみに!
