【入門編】Page.PageSheetセルの直接操作による動的リサイズ:図形群の配置領域に応じて用紙サイズと余白を全自動計算・追従させる方法 – Visio VBA解析バイブル

スポンサーリンク

Visioを「ただの作図ツール」で終わらせるな。PageSheetを掌握し、キャンバスを自在に操る極意

こんにちは。現場で泥臭く自動化を積み重ね、Visioの深淵まで潜り込んできたアーキテクトです。

多くのユーザーが「マクロの記録」から一歩踏み出そうとして、最初につまずくのが「Visioのオブジェクトモデルの階層構造」です。特に、図形を並べた後に「用紙サイズをそれに合わせたい」と思ったとき、GUIでカチカチと設定を変更していませんか?

それは、Visioが持つ「計算エンジン」の力をドブに捨てているのと同じです。今日は、PageSheetを直接叩き、作図領域に合わせてページを動的にリサイズする、現場で即戦力となる「真の自動化」を伝授します。

1. Visioオブジェクトモデルの「心臓部」を理解せよ

Visioを操るには、階層の理解が不可欠です。まずはこの地図を頭に叩き込んでください。

  • Application: Visioそのもの。
  • Document: ファイル単位。
  • Page: キャンバスそのもの。
  • PageSheet: ここが最重要。 ページ全体の属性(用紙サイズや余白など)を管理する、見えない「図形」です。

私たちが今回操作するのは、この`PageSheet`です。`Page.PageSheet`にアクセスすることで、用紙の幅や高さをプログラムから直接書き換えることができます。

2. なぜ「PageSheet」を直接操作するのか?

GUIでの変更は、あくまで「人間がマウスで操作する」ための手順です。しかし、VBAで`PageSheet.Cells(“PageWidth”).Formula`を操作すれば、図形の座標を検知し、余白を足したサイズを計算して、一瞬でページを再構築することが可能です。

「配置した図形がはみ出しているから、手動でページ設定を開いて…」という無駄な時間は、今日で終わりにしましょう。

3. 実践:図形領域に合わせてページを自動リサイズするVBA

このコードは、現在のページにある全図形の外接矩形を計算し、そこに指定したマージン(余白)を加えて用紙サイズを更新する実用的なスクリプトです。

Sub AutoResizePageToFitShapes()
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim minX As Double, minY As Double, maxX As Double, maxY As Double
Dim margin As Double: margin = 0.5 ‘ 余白(インチ単位)

Set pg = ActivePage

‘ 初期化:極端な値を設定
minX = 1000: minY = 1000: maxX = -1000: maxY = -1000

‘ 全図形を走査して端の座標を特定
For Each shp In pg.Shapes
If shp.Type <> visTypeGuide Then ‘ ガイド線は計算から除外
If shp.Left < minX Then minX = shp.Left If shp.Bottom < minY Then minY = shp.Bottom If shp.Right > maxX Then maxX = shp.Right
If shp.Top > maxY Then maxY = shp.Top
End If
Next

‘ 図形が存在しない場合は終了
If minX > maxX Then Exit Sub

‘ PageSheetを取得し、サイズを更新
‘ CellsUを使うのがプロの鉄則(単位の混乱を避けるため)
Dim ps As Visio.Shape
Set ps = pg.PageSheet

With ps
.CellsU(“PageWidth”).Formula = (maxX – minX) + (margin 2)
.CellsU(“PageHeight”).Formula = (maxY – minY) + (margin 2)

‘ ページ上の図形全体を原点(margin, margin)に移動させる処理(オプション)
‘ これを行うことで、用紙サイズ変更と同時に位置も整列されます
Dim dx As Double, dy As Double
dx = margin – minX
dy = margin – minY

For Each shp In pg.Shapes
shp.Move dx, dy
Next
End With

MsgBox “ページサイズを最適化しました。”
End Sub

4. 初学者が陥る「3つの罠」

現場でコードを書いていて、多くの人がここでハマります。

① 単位の罠

VisioのVBAでは、数値は基本的に「インチ」で扱われます。センチメートル感覚で計算すると、想定の2.54倍のサイズになってしまいます。常に計算の最後で単位を意識してください。

② CellsとCellsUの違い

`Cells(“PageWidth”)` と `CellsU(“PageWidth”)` がありますが、常に `CellsU` を使ってください。`Cells`は実行環境の言語設定に依存するため、英語環境のPCで動かした瞬間にエラーを吐くことがあります。「U」はUniversalのU。世界中で動くコードを書くのがプロです。

③ ガイド線の扱い

コード例にも入れましたが、`Page.Shapes`には「ガイド線(補助線)」も含まれます。これを含めて計算してしまうと、ガイド線を置いただけで用紙サイズが異常に巨大化します。`shp.Type`でフィルタリングする癖をつけましょう。

最後に:自動化は「思考の拡張」である

PageSheetを操作できるようになると、Visioは単なる作図ソフトから、「データから図面を生成するジェネレーティブな環境」へと変貌します。

今回紹介したコードは、あくまで入り口です。ここから「特定のレイヤーにある図形だけを対象にする」「PDF出力と連動させる」など、あなたの業務に合わせてカスタマイズしてください。

Visioのオブジェクトモデルは、最初は複雑に見えるかもしれません。しかし、一度その階層構造を掌中に収めてしまえば、これほど強力で、あなたの時間を守ってくれる相棒はいません。

さあ、エディタを開いて、自分の手でキャンバスを操ってみてください。応援しています。

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