【入門編】【実務直結】ページサイズ変更に伴う「図面枠(タイトルブロック)」の自動リサイズと再配置 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードをそのまま動かしてみたものの、「あれ?ページサイズを変えたら図面枠が変な位置に取り残された……」なんて絶望した経験はありませんか?

安心してください。それ、Visio VBAの「座標の罠」にハマっているだけです。

今回は、ページサイズが変更された瞬間に、図面枠(タイトルブロック)がシュッと自動で追従し、美しくリサイズされる実務直結のスマートなロジックを伝授します。ここをクリアすれば、あなたのVisio自動化スキルは間違いなく一段階上のステージに到達しますよ。

—

なぜ、普通にやると図面枠が崩れるのか?

Visioの図面(Page)と、そこに配置される図形(Shape)の関係性を知っていますか?
多くの初心者は、「図面枠をマウスで端っこに合わせるように、VBAでも移動させればいいや」と考えます。

しかし、実務の世界(特に自動化)では、A4からA3へ、あるいはカスタムサイズへと、ページのキャンバスサイズ自体がダイナミックに変更されることが多々あります。
その時、図形を絶対座標(例: X=10mmの位置)で指定していると、ページが広がったのに図形が真ん中に取り残されたり、逆にページからはみ出したりする悲劇が起きます。

本質的な解決策:PageSheetの「数式(Formula)」を操る

Visioの真骨頂は、Excelのセル参照のように、図形のプロパティ同士を数式で結びつけられる点にあります。
図面枠のサイズや位置を、ハードコーディング(固定値の代入)するのではなく、「ページの幅(PageWidth)と高さ(PageHeight)の変数に連動させる」。これがプロのアーキテクトが使う唯一無二の定石です。

—

実践!図面枠を完全追従させるVBAコード

それでは、実際に動くコードを見てみましょう。
このコードは、現在のページのサイズを取得し、ページ全体を囲む図面枠(長方形のマスターシェイプなどを想定)を自動でリサイズ・配置するものです。

開発タブの「Visual Basic」を開き、標準モジュールに以下のコードを貼り付けて実行してみてください。

Sub AutoFitTitleBlock()
Dim vsoPage As Visio.Page
Dim vsoPageSheet As Visio.Shape
Dim vsoBorderShape As Visio.Shape

‘ 1. アクティブページとそのPageSheetを取得
Set vsoPage = ActivePage
Set vsoPageSheet = vsoPage.PageSheet

‘ 2. ページ上の「図面枠」とみなす図形を特定する
‘ ※ここでは便宜上、ページ上の最初の図形をターゲットにします
On Error Resume Next
Set vsoBorderShape = vsoPage.Shapes(1)
On Error GoTo 0

If vsoBorderShape Is Nothing Then
MsgBox “ページ上に図形が存在しません。”, vbExclamation, “エラー”
Exit Sub
End If

‘ 3. シェイプシートの数式を書き換え、ページサイズに完全連動させる
‘ 【重要】ピン(中心点)の位置を左下(PinX=0, PinY=0)に固定するのがコツです
With vsoBorderShape
.CellsU(“LocPinX”).FormulaU = “Width0”
.CellsU(“LocPinY”).FormulaU = “Height0”
.CellsU(“PinX”).FormulaU = “0”
.CellsU(“PinY”).FormulaU = “0”

‘ 枠の幅と高さを、ページの幅・高さと完全に一致させる
.CellsU(“Width”).FormulaU = “ThePage!PageWidth”
.CellsU(“Height”).FormulaU = “ThePage!PageHeight”
End With

‘ 4. 画面を再描画して変更を反映
Application.QueueMarkerEvent

MsgBox “図面枠がページサイズに完璧に追従するように設定されました!”, vbInformation, “完了”
End Sub

—

コードの核心:なぜこの書き方で崩れないのか?

上記のコードのキモは、`.CellsU(“Width”).FormulaU = “ThePage!PageWidth”` という部分です。

通常のVBAでは、`vsoBorderShape.Width = 297` のように「数値」を代入しがちです。これだと、後からページをA3に変更したときに、図面枠はA4サイズのまま取り残されます。
しかし、`FormulaU` プロパティを使って `”ThePage!PageWidth”` という数式文字列をぶつけ込むことで、Visioのエンジン自体に「ページサイズが変わったら、俺の幅も自動でそれに合わせろよ」と約束させることができるのです。

陥りやすい罠:基準点(LocPin)の呪縛

もう一つ見逃せないのが、`LocPinX` と `LocPinY` の設定です。
Visioの図形は、デフォルトでは「図形の中心」が拡大・縮小や移動の基準(ピン)になっています。これを左下(`Width0`, `Height0`)に変更することで、ページを拡大・縮小したときに「左下の角を起点にしてキレイに伸び縮みする」ようになります。

ここを設定し忘れると、ページサイズを変えた瞬間に図面枠が変な方向にぶっ飛んでいくホラー現象が起きるので注意してくださいね。

—

まとめ:Visio VBAは「数式」を味方につけろ

今回は、ページサイズ変更に伴う図面枠の自動リサイズと再配置という、実務で100%直面する課題を解決しました。

  • 固定値を代入するな、数式(Formula)を流し込め
  • ページの幅・高さは `ThePage!PageWidth` で参照せよ
  • 基準点(LocPin)を制する者がVisioレイアウトを制す

この3つを覚えておけば、もう二度と「レイアウト崩れ」の修正地獄に怯える必要はありません。
ここをクリアしたあなたなら、どんなに複雑なドキュメント自動生成も余裕でこなせるはずです。

それでは、快適なVisio自動化ライフを!

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