【入門編】【初心者向け】ページサイズを「カスタムサイズ」に設定し、図面枠をページ中央に配置する初期化マクロ – Visio VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロの記録を卒業しよう。Visio VBAで「ページの魂」を自在に操る技術

こんにちは。Visio VBAの世界へようこそ。

「マクロの記録」ボタンを押して、自分の操作をコードに変換する。それはプログラミングへの第一歩として素晴らしい方法です。しかし、記録されたコードを眺めて、「なぜここでこんなに複雑なプロパティが並んでいるんだろう?」「もっとシンプルに書けないのかな?」と疑問を持ったことはありませんか?

もしそう感じているなら、あなたはすでに「自動化エンジニア」としての資質を持っています。

今日は、単なる操作の記録から脱却し、Visioの設計思想の核心である「PageSheet(ページシート)」を理解することで、ページのサイズを自由自在に操り、図面枠を完璧に中央配置する「初期化マクロ」をマスターしましょう。

ここをクリアすれば、Visio VBAの基本はバッチリですよ。

1. 核心:Visioのページは「巨大なスプレッドシート」である

多くの初心者が陥る罠があります。それは、「ページのサイズを変えるには、PageオブジェクトにSizeというプロパティがあるはずだ」と思い込んでしまうことです。

しかし、Visioの真の姿を知る者はこう考えます。
「ページとは、設定値が書き込まれた一つの巨大なスプレッドシートである」と。

Visioの各オブジェクト(ページ、図形、コネクタなど)は、背後に「Sheet」という概念を持っています。ページの幅、高さ、背景色、といったあらゆる設定は、そのページが持つ「PageSheet」というシート内の「セル(Cell)」に格納されています。

つまり、ページサイズを変更するとは、「PageSheetの中にある『Width(幅)』という名前のセルに、新しい数値を書き込む」という作業なのです。

2. 実践:ページサイズ設定と図面枠の自動配置

それでは、実際に「カスタムサイズを指定し、図面枠(Rectangle)をページの中央に配置する」コードを書いてみましょう。

以下のコードは、単に動くだけでなく、将来的なメンテナンス性や、多言語版Visioでの動作を考慮した「プロ仕様」の書き方をしています。

Option Explicit

''' <summary>
''' ページの初期化マクロ
''' ページサイズをカスタム設定し、図面枠を中央に配置します。
''' </summary>
Sub InitializePageWithCustomSize()
    Dim vsoPage As Visio.Page
    Dim vsoFrame As Visio.Shape
    Dim targetWidth As Double
    Dim targetHeight As Double
    
    ' --- 設定エリア ---
    ' 単位は「インチ」で指定します(後述の解説参照)
    targetWidth = 11#  ' 幅 11インチ
    targetHeight = 8.5# ' 高さ 8.5インチ
    ' ------------------

    ' 現在アクティブなページを取得
    Set vsoPage = ActivePage

    On Error GoTo ErrorHandler

    ' 1. PageSheetのセルを操作してページサイズを変更する
    ' CellsU を使うのがプロの鉄則です(後述)
    With vsoPage.PageSheet
        .CellsU("Width").ResultIU = Application.ConvertUOM(targetWidth, visDocScaleInches, visDocScaleInches)
        .CellsU("Height").ResultIU = Application.ConvertUOM(targetHeight, visDocScaleInches, visDocScaleInches)
    End With

    ' 2. 図面枠となる図形(長方形)を作成
    ' ここでは、ページ全体より少し小さい枠を作成します
    Set vsoFrame = vsoPage.DrawRectangle(0, 0, targetWidth, targetHeight)
    
    ' 3. 図形をページの中央に配置する
    ' PinX, PinY は図形の中心点を制御するセルです
    With vsoFrame
        .CellsU("PinX").FormulaU = "PageWidth*0.5"
        .CellsU("PinY").FormulaU = "PageHeight*0.5"
        
        ' 枠線が見やすいようにスタイルを調整(任意)
        .CellsU("LineWeight").ResultIU = 2
    End With

    MsgBox "ページの初期化が完了しました!", vbInformation, "Success"
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "Error"
End Sub

3. 伝説のアーキテクトが教える「3つの重要ポイント」

コードをコピペして動かすだけでは、あなたはまだエンジニアの入り口に立ったに過ぎません。このコードに隠された「設計思想」を理解しましょう。

① `Cells` ではなく `CellsU` を使え

コードの中に `.CellsU` という記述がありますね。末尾の “U” は “Universal”(ユニバーサル) の略です。

Visioには、日本語版では「幅」、英語版では「Width」というように、言語によってセル名が変わってしまう性質があります。`Cells` を使うと、日本語版で作ったマクロが英語版で動かなくなるという悲劇が起こります。
`CellsU` を使えば、常に内部的なユニバーサル名(Widthなど)でアクセスできるため、世界中どこでも動く堅牢なコードになります。これはプロの必須知識です。

② `ResultIU` と `FormulaU` の使い分け

ここが最も混乱しやすいポイントです。

  • `ResultIU`: 「今、そのセルに入っている値(数値)」を操作するときに使います。サイズを「11インチに固定する」場合はこちらです。
  • `FormulaU`: 「セルに数式」を書き込むときに使います。
  • 今回、図形を中央に配置する際に `.CellsU(“PinX”).FormulaU = “PageWidth*0.5″` と書きました。
  • これは「中心点を、ページ幅の半分という計算式で定義する」という意味です。
  • これにより、もし後からページサイズが変わっても、図形は常に「ページ中央」を追いかけ続けるようになります。

③ 単位(Unit)の意識

Visioの内部では、数値は「インチ」や「ミリメートル」ではなく、「IU (Internal Units)」 という独自の単位で管理されています。
人間が「11インチにしたい」と思ったときに、直接 `11` と書き込むのは危険です。`Application.ConvertUOM` を使って、明示的に変換を行うことで、計算ミスや意図しないサイズ変更を防ぐことができます。

4. よくあるエラーと対策

もし動かないときは、以下のチェックリストを確認してください。

1. 「指定した名前のセルが見つかりません」というエラー

  • `CellsU(“Width”)` のスペルが間違っていませんか? `”Width “`(最後にスペース)が入っているだけでもエラーになります。

2. 図形が変な場所に飛んでいく

  • `PinX`(中心点)を操作しているつもりが、`X`(左端)を操作していませんか?図形の「どこを基準に動かすか」を意識することが重要です。

3. マクロが途中で止まる

  • `On Error GoTo ErrorHandler` を入れておけば、エラーが起きたときに「なぜ止まったか」をメッセージで教えてくれます。デバッグの基本です。

最後に

ページサイズを操作し、図形を配置する。一見、単純な作業に見えるかもしれません。
しかし、`PageSheet` という仕組みを理解し、`CellsU` で堅牢性を高め、`FormulaU` で動的な関係性を築く。このステップを踏むことで、あなたの書くコードは「ただの記録」から「プロフェッショナルな設計」へと進化します。

一歩ずつ、着実に。
Visio VBAの深淵は、正しく学べばこれほどまでに面白いものはありません。

また次の講義でお会いしましょう!

タイトルとURLをコピーしました