【実務・中級編】【中級者向け】Visio図面をPDF化する際、ページ設定の「プリンタ用紙サイズ」を無視して図面サイズに自動フィットさせる – Visio VBA解析バイブル

スポンサーリンク

Visio PDF出力の「余白・サイズ崩壊」を根絶する。PageSetupを掌握するエンジニアの流儀

Visioの自動化において、PDF出力は「最後の関門」です。
業務要件で「図面をPDF化せよ」と言われた際、多くのエンジニアが `ExportAsFixedFormat` メソッドを叩いて絶望します。なぜか? 印刷プレビューやPDFの出力結果が、意図した図面サイズと一致せず、謎の余白やページ分割が発生するからです。

これは、Visioが「プリンタの用紙サイズ」という物理的な制約を強く引きずるレガシーなアーキテクチャを持っていることに起因します。

本稿では、この悪しき挙動を制御し、図面サイズに完璧にフィットしたPDFを生成するための「極限の設計指針」を伝授します。

—

1. なぜ「設定崩れ」は起きるのか?

Visioの `PageSetup` プロパティは、GUIの「ページ設定」ダイアログと同期していますが、コードで制御する際には落とし穴があります。

  • プリンタ依存の問題: デフォルトのプリンタドライバが持つ用紙サイズが「Page.Size」を上書きしようとする挙動。
  • 動的フィットの欠如: `AutoSize` をオンにしても、出力時に描画領域が正しく再計算されないケース。

これを回避するには、「プリンタ設定から独立した論理サイズを指定し、かつそれを明示的に適用する」というプロセスが必要です。

—

2. 堅牢なPDF出力のための設計原則

実務レベルで「バグらない」コードを書くためには、以下の3原則を守ってください。

1. PaperSizeの強制指定: `visPaperCustom` を明示し、物理プリンタの制約を排除する。
2. 出力範囲の固定: `PrintArea` を明示的に設定し、描画外のゴミがPDFに含まれるのを防ぐ。
3. オブジェクトの解放: `Visio.Application` はCOMサーバーとして非常に重いため、明示的な `Nothing` 代入でメモリリークを防ぐ。

—

3. 実践:プロダクションコード

以下は、現在のページのサイズをそのままPDFの出力サイズに反映させるための関数です。このままモジュールにコピー&ペーストして使用してください。

Option Explicit

”’

”’ 現在のページを描画領域サイズにフィットさせてPDF出力する
”’

Public Sub ExportCurrentPageToPdf(ByVal targetPath As String)
Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ エラーハンドリングは必須。PDF出力はファイルロック等の外部要因で落ちるため
On Error GoTo ErrorHandler

‘ 1. ページ設定を論理サイズに固定する
With vsoPage.PageSheet
‘ 用紙サイズをカスタム設定に固定(プリンタサイズの影響を排除)
.Cells(“PaperSize”).Formula = visPaperCustom

‘ ページサイズと描画サイズを一致させる
.Cells(“PageWidth”).Formula = vsoPage.PageSheet.Cells(“PageWidth”).ResultIU
.Cells(“PageHeight”).Formula = vsoPage.PageSheet.Cells(“PageHeight”).ResultIU

‘ 余白をゼロに設定
.Cells(“PrintPageLeftMargin”).Formula = 0
.Cells(“PrintPageRightMargin”).Formula = 0
.Cells(“PrintPageTopMargin”).Formula = 0
.Cells(“PrintPageBottomMargin”).Formula = 0
End With

‘ 2. PDF出力実行
‘ FixedFormatIntent: 印刷品質での出力
‘ PrintRange: 現在のページのみ
vsoPage.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=targetPath, _
Intent:=visDocExIntentPrint, _
PrintRange:=visPrintCurrentPage

Debug.Print “PDF出力成功: ” & targetPath
Exit Sub

ErrorHandler:
MsgBox “PDF生成中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

—

4. エンジニアのための補足:保守性を高めるヒント

データベース連携時の注意点

もしこのPDF出力を「図面管理システム」などに組み込む場合、必ず 「ファイルロックの確認」 を行ってください。`ExportAsFixedFormat` は非同期的に処理されることが多く、プログラムが完了した直後にファイルを移動しようとすると失敗します。`Sleep` APIを入れるのではなく、`Dir()` 関数でファイルサイズが固定されるまで待機するループを組むのが、最も堅牢な手法です。

複数ページ対応への拡張

上記コードは単一ページですが、これを全ページ対応にするには `ActiveDocument.Pages` をイテレートします。その際、各ページの `PageSheet` をリセットし忘れると、1ページ目の設定が2ページ目以降に悪影響を及ぼすことがあります。「各ページ処理の開始時に必ずPageSetupを再定義する」。この繰り返しこそが、予期せぬ崩れを回避する唯一の道です。

—

まとめ

Visioの自動化において、コードは「書く」ものではなく「振る舞いを制御する」ものです。
`PageSetup` を曖昧に扱うことは、将来の自分に「なぜか崩れるPDF」という負債を押し付けることに他なりません。

今回提示した「用紙サイズのカスタム固定」と「余白のゼロリセット」という定石をベースに、あなたの業務フローに合わせた堅牢なツールを構築してください。

何か不明な挙動があれば、それはVisioの仕様ではなく、あなたのコードがプリンタドライバという「幽霊」を追い払えていない証拠です。常に論理サイズを信じ、コントロールを奪い返してください。

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