こんにちは!Visioの図面自動化の世界へようこそ。
マクロの記録ボタンを押して満足していた時期を抜け出し、「自分の手でVisioを意のままに操りたい」と願うあなたへ。
今回は、実務の現場で最も頭を悩ませるポイントの一つである「図面縮尺(PageSheetのDrawingScaleセル)の動的変更」について、その全貌を解き明かします。
「1分の100の図面を、やっぱり1分の50に変えてほしい」と言われたとき、手動でプロパティを開いて……なんてやっていませんか?さらに、それをやると図形の位置やサイズが狂ってしまい、青ざめた経験はありませんか?
ここをクリアすれば、あなたも立派なVisio VBAエンジニアです。
オブジェクトのライフサイクルと、Visio特有の「スケールの罠」を完全にハックする知見を授けましょう。
—
1. なぜVisioの縮尺変更は厄介なのか?(本質の理解)
Visioで図面の縮尺を変更するとき、背後では何が起きているでしょうか?
初心者が最もハマる罠、それは「単にスケールの数値セル(DrawingScaleなど)を書き換えるだけでは、図形の見かけ上のサイズや位置が意図せず変化してしまう」という点です。
Visioの図形(Shape)は、ページのスケール(PageSheet)と連動して「メートル単位(あるいはインチ単位)」の現実世界をキャンバス上に投影しています。
ここで、図形の位置やサイズを保持したまま、計算上の「縮尺(Scale)」だけを安全にスライドさせるには、Visioのオブジェクトモデルの階層構造を正しく理解し、適切なセルに対して正しい数式(Formula)を流し込む必要があります。
Visioオブジェクトの階層
Application
└─ Documents
└─ ActiveDocument
└─ Pages
└─ ActivePage
├─ PageSheet (★ここが今回のターゲット:図面全体のプロパティ)
└─ Shapes (個別の図形たち)
ページ全体のプロパティを司るのが、`Page.PageSheet` です。
ここにある `DrawingScale` や `PageScale` といったセルをVBAから直接書き換えることで、図面全体のスケールをプログラムから一撃で変更できます。
—
2. 現場で使える!縮尺一括変更マクロの全コード
それでは、実務でそのまま使える堅牢(ロバスト)なコードを公開します。
このコードは、現在のページ縮尺を安全に読み取り、指定した新しい縮尺へとダイナミックに書き換えるプロシージャです。エラーハンドリングも考慮した、プロの仕事を見てください。
Sub ChangeDrawingScaleDynamically()
Dim vsoPage As Visio.Page
Dim vsoPageSheet As Visio.Shape
‘ 1. 現在のアクティブページを取得
Set vsoPage = ActivePage
Set vsoPageSheet = vsoPage.PageSheet
‘ 2. 変更前の状態をイミディエイトウィンドウにデバッグ出力
Debug.Print “変更前 ページ名: ” & vsoPage.Name
On Error GoTo ErrorHandler
‘ 3. 画面描画を停止してパフォーマンスを爆発的に向上させる(超重要テクニック)
Application.ScreenUpdating = False
‘ ==========================================
‘ 【核心】DrawingScaleセルの書き換え
‘ 例:1:100 (1mm = 100mm) から 1:50 (1mm = 50mm) へ変更する場合
‘ Visioの数式文字列としてセルの値をセットします。
‘ ==========================================
‘ 単位系(ここではメートル法を想定した例)
‘ DrawingScale: 図面上の長さ に対する 実世界の長さ の比率を定義します
‘ 例として、「1図面上のインチ/ミリ」に対する「実世界のインチ/ミリ」を設定
‘ 1:50 の場合、用紙上の 1 mm が 実世界での 50 mm に相当する設定例
Dim newScaleStr As String
‘ ユーザーに新しい縮尺の比率を尋ねる(今回は固定で「1:50 (メートル単位)」を設定する例)
‘ ※ 1:50 の場合、Visio内部の表現形式に合わせます
‘ 建築図面などで一般的に使われる「1cm = 1m」(1:100)から「2cm = 1m」(1:50)への変更など
‘ セル「DrawingScale」に数式を代入します。
‘ 建築テンプレート(メートル図面)の標準的なセルの書き換え例:
‘ 描きやすさを維持するため、FormulaUプロパティを使用(UはUniversalの意味で言語依存しないため必須!)
vsoPageSheet.CellsU(“DrawingScale”).FormulaU = “1 m”
vsoPageSheet.CellsU(“PageScale”).FormulaU = “50 mm”
‘ ※注意: 上記の数値は図面の初期テンプレートや単位系によって調整が必要です。
‘ 「実寸を維持する」ためのVisioの自動スケーリング機能を味方につけます。
‘ 4. 処理成功のフィードバック
Application.ScreenUpdating = True
MsgBox “図面の縮尺変更が完了しました。”, vbInformation, “Visio VBA 自动化”
Exit Sub
ErrorHandler:
‘ エラー発生時も必ず画面描画を復元すること(Visioがフリーズしたように見えなくなるのを防ぐ)
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
3. コードのキモと「ここが落とし穴!」の解説
上記のコードには、Visio VBAを極めたエンジニアならではの「現場の知見」が詰まっています。いくつか重要なポイントを解説します。
① `Cells` ではなく `CellsU` を使え!
初心者丸出しのコードによありがちなのが `.Cells(“DrawingScale”)` という記述です。
これをしてしまうと、英語以外の言語(日本語版Visioなど)で動かしたときに「そんなセル名知らん!」と怒られます(エラー番号:-20334など)。
Visio VBAでは、言語に依存しないユニバーサル名である `CellsU` を使うのがプロの絶対的ルールです。
② `Application.ScreenUpdating = False` による高速化
Visioは、ページやシェイプの数式(Formula)が書き換わるたびに、画面の再描画と再計算を行おうとします。
これが図形の多い図面だと、マクロが固まったかのような重さを引き起こします。
処理の最初に画面描画を止め、最後に必ず復元する。このお作法を忘れないようにしましょう。
③ PageSheet と Shapes の違い
今回操作した `Page.PageSheet` は、図形そのものではなく「ページが持っているキャンバスのメタデータ(縮尺や用紙サイズ)」を保持している特別なシェイプ(便宜上シェイプ構造をしています)です。
ここを正しく理解していれば、ページ全体のプロパティ変更も怖くありません。
—
まとめ:ここをクリアすれば、基本はバッチリ!
今回は、`Page.PageSheet` を使った図面縮尺の動的変更という、一歩進んだテーマを解説しました。
- `Page.PageSheet` からページ全体の環境設定にアクセスする
- 言語依存のない `CellsU` を用いて数式を安全に書き換える
- `ScreenUpdating` でパフォーマンスを担保する
ここをマスターしたあなたなら、単なる「マクロの記録の貼り付け係」から、「Visioの挙動を支配するエンジニア」へと確実にステップアップしています。
複雑な図面の一括変換や、複数ファイルにまたがるスケール統一など、あなたのアイデア次第で自動化の可能性は無限大に広がります。
ぜひ、実際の業務データ(バックアップを取ってから!)で試してみてくださいね。
それでは、次回の極限の知見でお会いしましょう。Happy Coding!
