【実務・中級編】【初心者向け】ページサイズをA3横からA4縦へ一括変換する際の「図面位置ズレ」を防ぐ設計術 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵:ページサイズ変更時に「図面が崩壊する」現象を根絶する設計術

Visioの自動化を志すエンジニア諸君、ようこそ。
多くの初心者が直面する「ページサイズをA3からA4に変更したら、図面がページの端に追いやられ、コネクタが暴走した」という悲劇。これはVisioの仕様を理解せず、ただAPIを叩くだけの「コードの切り貼り」が生む必然の帰結だ。

今日は、業務自動化の現場で「二度と手直しさせない」ための、堅牢なページ変換ロジックを伝授する。

—

1. なぜ「設定変更」で図面が崩れるのか?

Visioにおいてページサイズを変更するとは、単に `Page.PageSheet` の値を書き換えることではない。「座標系の原点(PinX, PinY)」と「ページ境界」の相対関係を再定義する行為である。

多くの初心者は、サイズを変更した後に図形を動かそうとするが、これはNGだ。Visioはサイズ変更を検知すると、デフォルトでは「現在の位置」を維持しようとして、結果的に新しい用紙範囲外にコンテンツを追い出す。

我々が取るべき戦略は一つ:
1. ページサイズ変更前に、全図形の境界ボックス(Bounding Box)を取得する。
2. ページサイズを物理的に変更する。
3. 新しい中央座標を計算し、全図形をグループ化(仮想的に)して一括移動する。

これ以外に、図面の整合性を保つ道はない。

—

2. プロダクション品質のコード:`ResizePageAndAlign`

このコードは、単なるリサイズではない。図面全体を新しいページサイズの中央に「再配置」する知能を持っている。

Option Explicit

”’

”’ ページサイズを一括変更し、図面を中央にリセットするプロシージャ
”’

Public Sub ResizePageAndAlign(ByVal pageWidth As Double, ByVal pageHeight As Double)
Dim vsoPage As Visio.Page
Dim vsoSelection As Visio.Selection
Dim vsoWindow As Visio.Window

Set vsoPage = ActivePage
Set vsoWindow = ActiveWindow

‘ 1. エラーハンドリングと最適化
On Error GoTo ErrorHandler
Application.ScreenUpdating = False

‘ 2. ページ内の全図形を選択
Set vsoSelection = vsoPage.CreateSelection(visSelTypeAll)

‘ 3. ページサイズ変更 (A3: 420x297mm -> A4: 210x297mm 等)
‘ 単位はインチ換算が内部仕様だが、mmを指定する場合はVisioの定数変換を介す
With vsoPage.PageSheet
.Cells(“PageWidth”).ResultIU = pageWidth 0.03937
.Cells(“PageHeight”).ResultIU = pageHeight 0.03937
End With

‘ 4. 図面全体を中央に配置するロジック
‘ 新しい中央座標を算出
Dim centerX As Double, centerY As Double
centerX = (pageWidth / 2) 0.03937
centerY = (pageHeight / 2) 0.03937

‘ 図形を一括移動(グループ化を解除したままでも移動可能)
vsoSelection.Center centerX, centerY

MsgBox “ページサイズ変更と再配置が完了しました。”, vbInformation

Cleanup:
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume Cleanup
End Sub

—

3. 設計上の鉄則:なぜこの実装が必要か

A. `Application.ScreenUpdating` の重要性

Visioの描画エンジンは非常に重い。サイズ変更と移動を逐次描画させると、メモリリークや描画のちらつきが発生し、最終的に「図形の非表示」といったゴーストバグを引き起こす。必ず描画を止めて処理すること。

B. `ResultIU` を使え

Visioの内部単位は「インチ」だ。`Cells(“PageWidth”).Formula = “297mm”` と書きたくなる気持ちは分かるが、これはローカルのOS設定やVisioの表示単位に依存する可能性がある。常に `ResultIU` を使い、内部的な絶対数値で制御するのがプロの流儀だ。

C. グループ化の罠

図形を移動させる際、`Group` メソッドを使うとコネクタの接続情報が切れることがある。`Selection.Center` を活用すれば、グループ化せずとも全図形を幾何学的に同期させて移動できる。これが最も安全だ。

—

4. 現場のリーダーからの助言

もしあなたが、データベースやExcelから図面情報を流し込んでいるなら、「座標計算はVisioに投げない」こと。

  • 悪い設計: Visio上の図形配置を基準にして、計算で位置を補正する。
  • 良い設計: 外部データ(JSONやDB)に「図形ID」と「ページ内座標」を保持させ、ページサイズ変更後は「全図形を一旦クリアして再描画(または座標の再設定)」を行う。

Visioは「図面」ではなく「データ構造」として捉えること。GUI上の操作を自動化するのではなく、「Visioというオブジェクトモデルの背後にあるデータ」を操作するという意識を持ったとき、君の業務自動化ツールは「趣味のスクリプト」から「堅牢なシステム」へと進化する。

このロジックを叩き台に、君の現場に最適なツールを構築してほしい。質問があればいつでも来い。健闘を祈る。

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