Visio VBAの深淵へ:Document.Pagesを掌握し、自動化の第一歩を踏み出そう
こんにちは。業務自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードの断片に呆然とした経験はありませんか? 私たちがこれから踏み込むのは、その先の領域です。
Visioという巨大な地図を制御する際、最も重要なのは「今、どの階層にいるか」を意識すること。今回は、その核心である`Document.Pages`コレクションを操り、新規ページ生成からテンプレート適用までを、一撃で完結させるアーキテクチャを伝授します。
—
1. Visioオブジェクトモデルの「階層構造」を理解する
コードを書く前に、Visioがどういう世界観で構成されているか、頭の中に地図を描きましょう。
- Application: Visioというアプリケーションそのもの。
- Document: 開いている図面ファイル。
- Pages: そのファイルの中にある「ページ」の集合体。
- Page: 個別の図面シート。
- Shape: ページの上に置かれた図形。
今回注目するのは`Document.Pages`です。ここは「ページという名のキャンバスを管理する司令塔」だと考えてください。ここを自由自在に扱えるようになれば、100枚の図面を1秒で生成するような自動化も夢ではありません。
—
2. 【実践】ページ追加からテンプレート適用までの自動化フロー
初心者の方がよくやるミスは、ページを追加した後に「そのページがどこに行ったか見失う」ことです。
以下のコードは、「新しくページを作り、そこに名前をつけ、特定のテンプレート(マスターシェイプ)を適用する」という、実務で最も多用するフローを網羅しています。
Sub CreateNewPageWithTemplate()
Dim vsoDoc As Visio.Document
Dim vsoPage As Visio.Page
Dim vsoStencil As Visio.Document
Dim vsoMaster As Visio.Master
‘ 現在のアクティブなドキュメントを取得
Set vsoDoc = ActiveDocument
‘ 1. 新規ページを追加してオブジェクトを変数に格納
‘ これにより、作成したページを直接操作可能になります
Set vsoPage = vsoDoc.Pages.Add
vsoPage.Name = “自動生成ページ_01”
‘ 2. テンプレート(ステンシル)を開く
‘ 既に開いている場合はエラーになるため、パスを指定して安全にロードします
Set vsoStencil = Application.Documents.OpenEx(“Basic_U.vssx”, visOpenDocked)
‘ 3. ステンシルからマスターシェイプを取得
‘ 「四角形」という名前の図形をページにドロップしてみましょう
Set vsoMaster = vsoStencil.Masters(“Square”)
‘ 4. ページ上に図形を配置(座標はインチ単位:1インチ=25.4mm)
vsoPage.Drop vsoMaster, 4.25, 5.5
MsgBox “ページ「” & vsoPage.Name & “」の作成と図形配置が完了しました!”
End Sub
コードのポイント:ここが「プロの視点」
- `Set`の重要性: オブジェクトを扱う際、`Set`を忘れるとVisioは混乱します。`Set vsoPage = …`とすることで、そのページを「変数」としてメモリ上に固定し、後から何度でも呼び出せるようにしています。
- OpenExメソッド: `Documents.Open`ではなく`OpenEx`を使うのが、中級者へのステップアップです。オプション引数で「ドッキング表示(`visOpenDocked`)」を指定することで、画面のUIを崩さずにスマートにステンシルを読み込めます。
—
3. 陥りやすい罠と解決策
罠1:ページ名の重複エラー
`vsoPage.Name = “自動生成ページ”` とコードに書いても、すでに同じ名前のページが存在するとプログラムは停止します。
対策: 名前を付ける前に `On Error Resume Next` を使うか、名前にタイムスタンプ(例: `Format(Now, “hhmmss”)`)を付与して一意性を確保しましょう。
罠2:ステンシルが見つからない
`Application.Documents.OpenEx` でパスを指定しない場合、Visioは「ユーザーのマイシェイプ」フォルダを検索します。
対策: 基本的には「フルパス」で指定するか、`Application.GetBuiltInStencilPath` を使って環境依存を排除する設計にするのが、堅牢なシステムを作るコツです。
—
最後に:なぜ「オブジェクト」を管理するのか
初心者のうちは「画面上の操作を自動化する」ことだけを考えがちです。しかし、真の自動化エンジニアは「メモリ上のオブジェクトをいかに効率的に操作するか」を考えます。
`Pages.Add` した瞬間、Visioは裏側で計算リソースを確保し、新しいキャンバスを作成します。この「ライフサイクル」を意識して、使い終わったオブジェクトは適切に管理(あるいは解放)する習慣を身につけてください。
ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Visioという広大な大地を、コード一本で開拓する設計者です。
さあ、次はどんな図面を自動で描き出しましょうか? また次のステップでお会いしましょう。
