Visio VBAの「ページサイズ変更」で図面が崩壊する原因と、それを防ぐ究極の設計術
こんにちは。業務自動化の世界へようこそ。
Visioで「A3横からA4縦へ一括変換したい」と考え、ページ設定をいじった瞬間に図面がぐちゃぐちゃに崩れ、絶望した経験はありませんか?
実は、Visioのページサイズ変更は単なる「用紙設定の書き換え」ではありません。「図面全体を新しい座標系にどうマッピングし直すか」という物理計算なのです。今回は、プロの現場で使われる「位置ズレを防ぐための設計思想」と、その具体的なコードを伝授します。
—
なぜ図面は「崩れる」のか?
初心者が陥りやすい罠は、`Page.PageSheet`のサイズプロパティ(`PageWidth`, `PageHeight`)を直接書き換えるだけのコードを書くことです。
Visioの図面は、「用紙の左下(0,0)」を原点として配置されています。サイズを変えると、原点は固定されたまま、右上の境界線だけが移動します。その結果、A3からA4へ変更した瞬間に、右側にあったコンテンツが「はみ出した」と判定され、意図しない場所に追いやられたり、グループごとズレたりするのです。
これを防ぐための鉄則は、「コンテンツ全体を囲むバウンディングボックス(境界枠)を計算し、新しいページの中央に再配置する」というロジックを挟むことです。
—
プロの設計:位置ズレ回避の計算ロジック
今回紹介するコードの心臓部は以下の3ステップです。
1. 境界の特定: `Page.BoundingBox` を使い、現在配置されている全シェイプが占める範囲を取得する。
2. ページサイズ変更: 用紙サイズをA4縦に変更する。
3. 再配置: コンテンツの中心座標を計算し、新しいページの中央へ移動させる。
実践コード:A3横からA4縦へスマートに変換する
このコードを標準モジュールに貼り付けて実行してください。
Sub ConvertA3ToA4_Portrait()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim left As Double, bottom As Double, right As Double, top As Double
Set vsoPage = ActivePage
‘ 1. 現在の全シェイプの境界ボックスを取得(単位はインチが標準)
‘ 引数:0(全部), 0(非表示除く), 0(戻り値の型)
vsoPage.BoundingBox 0, left, bottom, right, top
‘ 2. ページサイズをA4縦に変更 (210mm x 297mm)
‘ Visio内部単位はインチなので、mmをインチに換算(25.4で割る)
vsoPage.PageSheet.Cells(“PageWidth”).Formula = 210 / 25.4
vsoPage.PageSheet.Cells(“PageHeight”).Formula = 297 / 25.4
‘ 3. 全シェイプをグループ化して中央へ移動
‘ 個別に移動させると計算が複雑になるため、一時的にグループ化が定石
Dim vsoSelection As Visio.Selection
Set vsoSelection = vsoPage.CreateSelection(visSelTypeAll)
‘ グループ化して中央揃えを適用
Dim vsoGroup As Visio.Shape
Set vsoGroup = vsoSelection.Group
‘ 新しい中心座標へ移動(A4:幅105mm, 高さ148.5mm)
vsoGroup.Cells(“PinX”).Formula = (210 / 25.4) / 2
vsoGroup.Cells(“PinY”).Formula = (297 / 25.4) / 2
‘ 必要に応じてグループ解除
vsoGroup.Ungroup
MsgBox “A4縦への変換と中央配置が完了しました!”, vbInformation
End Sub
—
コードのここがポイント!
- `BoundingBox` メソッドの重要性:
多くの人はシェイプを一つずつループで回して座標を計算しようとしますが、それは非常に非効率です。Visioには描画範囲を一発で算出するメソッドが用意されています。これを使わない手はありません。
- 「インチ」と「ミリ」の罠:
Visioの内部計算は常に「インチ」です。コード内で `210 / 25.4` としているのは、「読みやすさと正確さ」を両立させるための必須テクニックです。
- グループ化(Group)という魔法:
バラバラの部品を一個ずつ移動させるのは、座標計算のミスを誘発します。一時的にグループ化して「塊」として扱うことで、中心座標への配置が数学的に一意に決まるようになります。
—
初心者が陥りやすいエラーと回避策
1. 「図面が保護されている」エラー:
もし図面に「ロック」がかかっていると、このコードはエラーを吐きます。シェイプの `Lock` プロパティを確認するか、手動で一度ロックを解除してから実行する習慣をつけましょう。
2. 単位が狂う:
Visioのドキュメント設定で単位を「ミリ」にしていても、VBA内部では「インチ」です。単位変換をサボると、図面が極小になったり巨大になったりします。常に `/ 25.4` を意識してください。
最後に
VBAをただの「記録」から「設計」へ昇華させるコツは、「コンピュータにどう動かすか」ではなく「図形の幾何学的な関係をどう定義するか」を考えることです。
今回紹介したコードは、あなたの業務から「手動で位置を微調整する」という退屈な時間を完全に消し去るはずです。ぜひ、ご自身の現場で試してみてください。ここをクリアすれば、あなたはもう立派なVisio自動化エンジニアの入り口に立っていますよ。応援しています!
