【入門編】Page.PrintPropertiesのVBA制御:用紙サイズ・向き・印刷倍率の一括自動構成ツール – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの図面管理、日々お疲れ様です。

「数百ページある図面の印刷設定を、全部A4の横向きに統一して!」
「図面からはみ出しているから、全ページを『1ページに収まるように』自動調整して!」

そんな無茶ぶりをされて、絶望したことはありませんか?
マクロの記録をポチッと押して生成されるコードをそのまま貼り付けても、なぜか上手くいかない。そもそもVisioのオブジェクト構造は、ExcelやWordとはちょっと違う独特の癖があります。

でも、大丈夫です。ここをクリアすれば、Visio VBAの基礎と「印刷プロパティ(PrintProperties)」の極意はバッチリあなたのものです。今日は、現場で即戦力として使える「全ページの用紙サイズ・向き・印刷倍率の一括自動構成ツール」の作り方を、私と一緒に紐解いていきましょう。

1. なぜVisioの印刷設定は一筋縄ではいかないのか?

Excelであれば `ActiveSheet.PageSetup` で一撃ですが、Visioの世界は少し奥深い構造をしています。

Visioのドキュメントは、「Application(アプリケーション)」 の下に 「Document(ドキュメント)」 があり、その中に複数の 「Page(ページ)」 が存在します。そして、重要なポイントとして、用紙サイズや向き、印刷倍率といった設定(PrintProperties)は、ドキュメント全体ではなく「ページ単位(Pageオブジェクト)」で保持されています。

つまり、全ページの印刷設定を変えたければ、コードで全ページを「巡回(ループ)」して、1ページずつ設定を書き換えていく必要があるのです。

2. 押さえておくべき基本オブジェクトとプロパティ

今回主役となるのは、`Page` オブジェクトが持っている `PrintProperties` というプロパティです。これを使うことで、用紙の物理的なサイズ、向き、そして「自動縮小して1ページに収める」といったレイアウトの指示を自由自在に操ることができます。

主要な設定項目を先に整理しておきましょう。

  • 用紙サイズ (PageWidth / PageHeight): 単位はインチ(Visioの内部単位)で指定します。
  • 用紙の向き (PrintLandscape): `True` なら横向き、`False` なら縦向きです。
  • 拡大縮小・ページ収まり (縮小拡大の制御): ここが一番のハマりポイントですが、「自動的に1ページに収める」には、専用のプロパティを正しく有効にする必要があります。

3. 実装コード:一括自動構成マクロ

それでは、実際の現場でそのままコピペして使える実用コードを公開します。
このコードを実行すると、アクティブなドキュメント内の全ページを対象に、用紙を「A4」「横向き」に変更し、「1ページに自動収まるように」一発で設定します。

Sub ApplyPrintProperties_A4Landscape()
‘ —————————————————————–
‘ 処理名: 全ページの印刷設定一括変更ツール(A4・横・自動収まり)
‘ —————————————————————–
Dim vsoPage As Visio.Page
Dim prnProps As Visio.PrintProperties
Dim targetDoc As Visio.Document

‘ 処理対象は現在アクティブなドキュメント
Set targetDoc = ActiveDocument

‘ ドキュメントが開かれていない場合のガード処理
If targetDoc Is Nothing Then
MsgBox “処理対象の図面が開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法)
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ ドキュメント内の全ページをループで走査する
For Each vsoPage In targetDoc.Pages

‘ 背景ページ(バックグラウンド)は印刷対象外にすることが多いためスキップする場合
‘ If vsoPage.Type = visTypeBackground Then GoTo NextPage

‘ 各ページの PrintProperties オブジェクトを取得
Set prnProps = vsoPage.PrintProperties

‘ 1. 用紙サイズを「A4」に設定 (A4の寸法: 幅 11.69インチ, 高さ 8.27インチ ※横向きの場合)
‘ ※Visioの内部単位は常に「インチ」です。ミリメートルをインチに換算しています。
‘ A4横の場合:幅 297mm = 11.6929インチ、高さ 210mm = 8.2677インチ
prnProps.PageWidth = 11.6929
prnProps.PageHeight = 8.2677

‘ 2. 用紙の向きを「横向き (Landscape)」に設定
prnProps.PrintLandscape = True

‘ 3. 印刷倍率の自動調整(「1ページ×1ページ」に収める設定)
‘ 紙面からはみ出た図面を自動縮小するための肝となるプロパティ群です
prnProps.FitToPages = True % ページに合わせる機能を有効化
prnProps.PaperSize = visPaperA4 % 用紙規格をA4に明示
prnProps.EnlargePagesAcross = 1 % 横方向のページ数
prnProps.EnlargePagesDown = 1 % 縦方向のページ数

‘ 設定をページに適用
vsoPage.PrintProperties = prnProps

NextPage:
Next vsoPage

‘ 画面描画を再開
Application.ScreenUpdating = True

MsgBox “全 ” & targetDoc.Pages.Count & ” ページの印刷設定(A4横・自動収まり)を一括適用しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ エラー発生時でも画面描画がフリーズしないように必ず戻す
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

4. コードの深掘りと「陥りやすい罠」の回避策

このコードには、シニアエンジニアとしてのこだわりと、初心者が必ずハマる罠を回避する知見が詰まっています。いくつかポイントを解説しましょう。

① Visioは「内部単位=インチ」という絶対法則

コード内で `11.6929` や `8.2677` という見慣れない数字を使っていますよね。
VisioのVBAは、画面上の表示単位(mmやcm)に関わらず、コード内では常に「インチ」で計算しなくてはなりません。
ミリメートルからインチに変換するには、「ミリ数 ÷ 25.4」 を行います。A4の長辺(297mm)であれば、 `297 / 25.4 = 11.6929…` となるわけです。ここを忘れて `297` と書くと、宇宙のように巨大な用紙サイズになってエラーかフリーズを引き起こすので注意してください。

② `Application.ScreenUpdating = False` の魔法

ページ数が数十ページ、数百ページある図面で、ページを1枚ずつめくりながら設定を変更していくと、画面がチラつき、処理にもの凄く時間がかかります。
処理の最初に `ScreenUpdating = False` を置き、最後に `True` に戻すことで、裏側で高速に一括処理を終わらせることができます。これは大規模なVisio自動化の基本テクニックです。

③ エラーハンドリングと画面の凍結防止

もしマクロの途中でエラーが起きると、`ScreenUpdating = False` の状態(画面が固まったまま)でコードが終了してしまい、Visioが使い物にならなくなります。そのため、`On Error GoTo ErrorHandler` を用意し、万が一の際にも必ず画面描画が復帰する安全設計にしています。

まとめ:ここをクリアすれば、もう怖くない!

今回は、`Page.PrintProperties` を使った用紙サイズ・向き・印刷倍率の一括自動構成について解説しました。

  • Visioの印刷設定はドキュメントではなく「ページ単位」で行う。
  • コード内での長さの単位は「インチ(mm ÷ 25.4)」を使う。
  • `FitToPages = True` とページ数指定を組み合わせることで、自動収まりを実現する。

この基本原則さえ押さえておけば、どんなに巨大な図面ファイルが送られてきても、一瞬で美しく印刷用レイアウトに調律できるようになります。ぜひあなたの開発現場の自動化ツールボックスに加えてみてください。

ここをクリアしたあなたなら、もうVisio VBAの基礎はバッチリです!次のステップへ進みましょう。

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