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の座標計算やコネクタの自動接続といった、よりエキサイティングな領域へ進んでいきましょう!
何か分からないことがあれば、いつでも聞いてくださいね。応援しています。
