こんにちは!Visioの図面整理に日々追われていませんか?
「ページが何枚もあって、不要なものを消したり順番を並べ替えるだけで手が痛くなる…」
「マクロの記録を使ってみたけれど、なんだかコードがごちゃごちゃして直せない…」
そんな悩みを持つあなたへ。今回は、Visio VBAの根幹をなす「Pageオブジェクトのコレクション操作」について、現場で即戦力となる極意を伝授します。
ここをクリアすれば、Visio VBAの基本はバッチリです!マクロの記録という「過去の遺物」を卒業し、自分の手で自由自在に図面を操るエンジニアへの一歩を踏み出しましょう。
—
1. Visioオブジェクトモデルの全体像と「Page」の立ち位置
VisioのVBAを語る上で、まず頭に入れておかなければならないのがオブジェクトの階層構造(親子関係)です。
Visioの世界は、ロシアの民芸品「マトリョーシカ」のように、大きな箱の中に小さな箱が入る構造になっています。
Application (Visioアプリ全体)
└── Document (開いている図面ファイル)
└── Pages (ページ全体のコレクション=「箱」)
├── Page 1 (個別のページ)
├── Page 2
└── Page 3
今回フォーカスする `Pages` コレクション は、いわば「図面ファイルの中にある全ページのアルバム」です。このアルバムに対して「新しいページを挟む」「いらない写真を捨てる」「順番を入れ替える」といった操作をコードから指示するのが今回のテーマとなります。
—
2. 現場で使える!ページ操作の基本レシピ(全コード)
まずは、余計な講釈は抜きにして、実務でそのままコピー&ペーストして使える万能スクリプトをお見せします。
VisioのVBE(Visual Basic Editor)を開き、標準モジュールに貼り付けて実行してみてください。
Sub ManagePagesSample()
Dim doc As Visio.Document
Dim targetPages As Visio.Pages
Dim newPage As Visio.Page
Dim i As Long
‘ 1. アクティブなドキュメントとページコレクションを取得
Set doc = ActiveDocument
Set targetPages = doc.Pages
‘ — 【操作①】新規ページの追加 —
‘ Pagesコレクションの .Add メソッドで新しいページを生み出します
Set newPage = targetPages.Add
newPage.Name = “自動生成ページ”
MsgBox “新しいページを追加しました!”, vbInformation
‘ — 【操作②】不要なページの削除 —
‘ 後ろからループを回すのが、コレクション操作の鉄則です(理由は後述!)
For i = targetPages.Count To 1 Step -1
‘ 仮に「古い」という文字が名前に含まれていたら削除する
If InStr(targetPages(i).Name, “古い”) > 0 Then
targetPages(i).Delete
End If
Next i
‘ — 【操作③】ページの並び替え(インデックス変更) —
‘ 先頭(1番目)に、一番後ろのページを移動させる
If targetPages.Count >= 2 Then
‘ .Reorder パラメータ: (移動するページのIndex, 目標のIndex)
‘ ※Visioのインデックスは 0 ではなく 1 から始まります!
targetPages(targetPages.Count).Index = 1
MsgBox “一番最後のページを先頭に移動しました!”, vbInformation
End If
‘ オブジェクトの解放(メモリ管理の基本)
Set newPage = Nothing
Set targetPages = Nothing
Set doc = Nothing
MsgBox “すべてのページ処理が完了しました。”, vbInformation
End Sub
—
3. ここが重要!コードの核心と「初心者が絶対にハマる罠」
上記のコードには、Visio VBAを極める上で絶対に知っておくべき「プロの知見」が詰まっています。重要なポイントを3つに絞って解説します。
罠その1:ページ削除は「後ろからループ(逆順)」で回せ!
コレクションを操作するとき、初心者が一番やりがちなミスがこれです。
‘ 【NGパターン】前から順番に消すと…?
For i = 1 To targetPages.Count
targetPages(i).Delete ‘ ←これをやるとインデックスがズレてバグる!
Next i
【解説】
例えば、全3ページのときに `i = 1` で1ページ目を削除すると、もともと2ページ目だったものが自動的に「1番目」に繰り上がります。その直後に `i = 2` に進むと、本来消したかったページを飛ばしてしまう、あるいは「インデックスが範囲外です」というお馴染みのエラー(実行エラー 9)に直撃します。
だからこそ、削除は必ず後ろ(Count)から1に向かって減算(Step -1)していくのが鉄則です。これだけでバグとは無縁の強靭なコードになります。
罠その2:Visioのコレクションは「1始まり」
プログラムの世界では「0から数える(ゼロベース)」ことが多いですが、Visioの `Pages` や `Shapes` などの主要コレクションは「1から始まる(1-based)」仕様になっています。
インデックスを指定する際は、常に「最初の要素は `1`」であることに注意してください。
罠その3:ページの「並び替え」は `.Index` プロパティの書き換えで行う
ページを並び替える際、専用の `Move` メソッドのような複雑なものは不要です。
対象となる `Page.Index` に「何番目に置きたいか(整数)」を代入するだけで、Visioが勝手に残りのページの並び順を再計算してくれます。非常にシンプルですね。
—
4. マクロの記録から脱却するということ
「マクロの記録」ボタンを押して図面を操作すると、こんなコードが吐き出されます。
`ActiveWindow.Page.Drop Visio.Application.Documents.Item(…)…`
これらは「その時ウィンドウで何が選択されていたか」に依存するため、少しでも環境が変わるとエラーを吐く脆いコードになりがちです。
今回紹介したように、
1. オブジェクトの階層(Document > Pages > Page)を意識する
2. コレクションの増減ルール(逆順ループ)を守る
この2つを意識するだけで、あなたが書くコードは「記録されたお飾り」から、現場を自動化する「本物のエンジニアの武器」へと生まれ変わります。
最初は難しく感じるかもしれませんが、自分で書いたコードが一瞬で何十枚ものページを整理し終えたときの爽快感は格別です。ぜひ、今日の業務から試してみてくださいね。
それでは、次回の高度な図形(Shape)操作の解説でお会いしましょう!バッチリ業務を効率化していきましょう!
