【入門編】Page.AutoSize機能のVBA動的制御:自動拡張キャンバスの有効化・無効化とサイズ固定 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵へ:Page.AutoSizeの制御で「勝手に広がるキャンバス」を制する

こんにちは。業務自動化の世界へようこそ。
Visioで図面を描いているとき、図形を端に置いた瞬間にページサイズが意図せず拡張され、「レイアウトが崩れた!」と頭を抱えた経験はありませんか?

これはVisio 2013以降に導入された「自動サイズ拡張(AutoSize)」機能によるものですが、プログラムで図面を自動生成する際、この機能はしばしば「制御不能な暴走」を引き起こします。

今日は、このキャンバスの挙動をVBAで完全に掌握するための極意を伝授します。マクロの記録から一歩先へ進みたいあなたへ、Visioオブジェクトモデルの深淵を案内しましょう。

1. なぜ「AutoSize」が重要なのか?

Visioの `Page` オブジェクトには `AutoSize` というプロパティがあります。これが `True` になっていると、ユーザーが図形をページの境界線付近に配置した際、Visioは気を利かせてキャンバスを自動的に拡張します。

手動作業なら便利ですが、VBAで座標計算をして配置する自動化プロセスでは、この「勝手な拡張」が計算を狂わせる元凶になります。

「指定した座標に置いたはずなのに、ページが伸びて余白が狂った」
そんな悲劇を防ぐために、まずは「今、ページが自動拡張モードなのか?」を判定し、必要に応じて無効化する術を身につけましょう。

2. Page.AutoSizeを制御するVBAコード

以下のコードは、アクティブなページの自動拡張機能をOFFにし、ページサイズを固定する実用的なスニペットです。

Sub ToggleAutoSizeOff()
‘ 現在のページオブジェクトを取得
Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ AutoSizeプロパティを制御する
‘ TrueであればFalseにして固定する
If vsoPage.AutoSize = True Then
vsoPage.AutoSize = False
Debug.Print “ページID: ” & vsoPage.ID & ” の自動サイズ調整をOFFにしました。”
Else
Debug.Print “既に自動サイズ調整はOFFです。”
End If
End Sub

コードの解説

  • ActivePage: 現在表示されているページを指すオブジェクトです。
  • vsoPage.AutoSize: このプロパティが `True` の間は、図形が配置されるたびにVisioの描画エンジンがページサイズを再計算します。これを `False` にすることで、キャンバスの境界線を「物理的に固定」できます。

3. 陥りやすい罠:PageとPageSheetの違い

ここで一つ、Visioの深い階層の話をしましょう。
`Page.AutoSize` をOFFにしただけでは、実は「ページサイズそのもの」は固定されていません。「図形を置いた時に伸びない設定」になっただけで、VBAから直接ページサイズを変更することは依然として可能です。

もし、「ページサイズを絶対に固定して、何があっても変えさせたくない」という場合は、ページの `PageSheet`(ページの設定を司るマスターシェイプのようなもの)にある `PageWidth` や `PageHeight` をロックする必要があります。

ページサイズをガチガチに固定するテクニック

Sub LockPageSize()
Dim vsoPageSheet As Visio.Shape
Set vsoPageSheet = ActivePage.PageSheet

‘ ページ幅と高さを「ガード」する(数式をGuard関数で囲む)
‘ これにより、誤操作や自動処理によるサイズ変更を防げます
vsoPageSheet.Cells(“PageWidth”).Formula = “GUARD(11in)”
vsoPageSheet.Cells(“PageHeight”).Formula = “GUARD(8.5in)”

MsgBox “ページサイズは強固に固定されました。”
End Sub

  • POINT: `GUARD()` 関数は、Visioのセル数式を「保護」する魔法の関数です。これを使うことで、UI上の設定変更や他のマクロからの干渉を弾くことができます。

4. エンジニアとして知っておくべきこと

Visioのオブジェクトモデルを扱う際、「親」と「子」の関係を意識することが何より重要です。

1. Application: Visioそのもの
2. Document: 開いているファイル
3. Page: 図面の一枚のシート
4. Shape: ページ上の図形

AutoSizeの制御は `Page` レベルで行いますが、その設定は `PageSheet`(そのページの設計図)に書き込まれます。この関係性を理解すれば、エラーが起きた時に「どの階層の設定が悪いのか」を即座に特定できるようになります。

最後に:自動化は「予測可能性」がすべて

Visio VBAで最も美しいコードとは、「いつ実行しても、誰が実行しても、寸分違わず同じ位置に図形が配置されるコード」です。

自動拡張機能(AutoSize)は、その予測可能性を阻害する「揺らぎ」です。プログラムを組む際は、冒頭で `AutoSize = False` を宣言し、最後に必要であれば元に戻す。この「環境を掃除してから作業する」という作法を身につけるだけで、あなたの書くマクロはプロフェッショナルな品質へと昇華します。

ここをクリアしたあなたは、もうVisio VBAの基礎を完全にマスターしたと言っても過言ではありません。次は、Shapeの座標計算やコネクタの自動接続といった、よりエキサイティングな領域へ進んでいきましょう!

何か分からないことがあれば、いつでも聞いてくださいね。応援しています。

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