Visio VBAの深淵へ:PDF出力で「用紙サイズ」の呪縛を解く極意
こんにちは。現場で「なぜかPDFが真っ白になる」「余白が異常に広い」というトラブルに頭を抱えたことはありませんか?
VisioのPDF出力は、一見簡単そうに見えて、実は「プリンタの用紙設定」という目に見えない鎖に縛られています。この記事では、マクロの記録から一歩進み、Visioの描画サイズをPDFに強制的に適合させるための「PageSetupの極意」を伝授します。
ここをマスターすれば、もうPDF出力で悩むことはありません。さあ、一緒にVisioの深淵を覗いてみましょう。
—
1. なぜPDF出力がズレるのか?その正体
Visioのページ設定は、デフォルトで「プリンタ用紙サイズ」に依存しています。
つまり、「図面のサイズ」と「印刷対象の用紙サイズ」が乖離していると、Visioは勝手に余白を作ったり、無理やり縮小したりします。
我々エンジニアが求めているのは、「図面そのもののサイズでPDFを出力する」というシンプルかつ強力な動作です。これを実現するには、`PageSetup`オブジェクトをコードから直接制御する必要があります。
—
2. 実践コード:図面サイズに完全フィットさせるPDF出力
以下のコードは、現在のページサイズに合わせてPDFをエクスポートするテンプレートです。これをモジュールに貼り付けてみてください。
Sub ExportPageToFitPDF()
Dim vsoPage As Visio.Page
Dim strPath As String
‘ 現在のページを取得
Set vsoPage = ActivePage
‘ 保存先のパス(デスクトップを指定)
strPath = Environ(“USERPROFILE”) & “\Desktop\Output.pdf”
‘ — 核心部分:ページ設定を強制オーバーライド —
With vsoPage.PageSheet
‘ 1. プリンタ設定を無視し、図面サイズを使用するように設定
.Cells(“PageSizeU”).Formula = “Width=Width”
‘ 2. 印刷時のスケーリングを「100%」に固定
.Cells(“PrintScale”).Formula = “1”
‘ 3. 用紙サイズを「図面サイズに合わせる」設定(重要)
.Cells(“PageWidth”).Formula = .Cells(“PageWidth”).ResultIU & ” in”
.Cells(“PageHeight”).Formula = .Cells(“PageHeight”).ResultIU & ” in”
End With
‘ PDFエクスポートを実行
‘ visFixedFormatPDF: PDF形式を指定
vsoPage.ExportAsFixedFormat visFixedFormatPDF, strPath, _
visDocFromPage, visDocToPage
MsgBox “PDF出力を完了しました!”
End Sub
—
3. コードの読み解き:ここが「プロ」のポイント
初心者の方が陥りやすい罠は、UI上の「ページ設定」ダイアログをいじることですが、VBAでは`PageSheet`オブジェクトの`Cells`を叩くのが正解です。
- `.Cells(“PageSizeU”)`:
ここはVisioのエンジンにとっての「心臓部」です。ここを「図面サイズ=用紙サイズ」に直結させることで、プリンタドライバの余計な計算をスキップさせます。
- `.Cells(“PrintScale”)`:
ここを「1」に固定するのが重要です。自動調整(Fit to)が有効になっていると、Visioは親切心で図面を縮小してしまいます。プロは「縮小などさせない」という意志をコードで示します。
- `.ResultIU`:
Visio内部の単位は「インチ」ベースです。`ResultIU`(Internal Units)を使うことで、ユーザーの表示単位設定(cmやmm)に左右されず、常に正確な数値を扱えます。
—
4. 陥りやすいエラーと回避術
Q. 「実行時エラー:セルが見つかりません」が出る
A. Visioのバージョンやテンプレートによって、`PageSheet`に特定のセルが存在しない場合があります。念のため、`If`文でセルの存在を確認するガード節を入れるのが、堅牢なシステムを構築する第一歩です。
‘ セルがあるか確認してから代入する安全策
If vsoPage.PageSheet.CellExists(“PageSizeU”, False) Then
vsoPage.PageSheet.Cells(“PageSizeU”).Formula = “Width=Width”
End If
Q. PDFの余白が消えない
A. `PageSheet`の`DrawingResizeType`を`0`(固定サイズ)に設定してみてください。これで「図面の内容に合わせて用紙が勝手に伸び縮みする」という挙動を封じ込めます。
—
最後に:自動化の先にあるもの
「設定をコードで制御する」ということは、あなたの意図をVisioのエンジンに直接伝えるということです。
マクロの記録で生成されたコードは、いわば「その場限りのメモ」です。しかし、今回のように`PageSheet`の内部構造を理解して書いたコードは、どんな図面ファイルであっても期待通りに動く「ツール」になります。
このPDF出力のロジックをマスターすれば、次は複数の図面を一括でPDF化するバッチ処理への道が開けます。その一歩は、もう踏み出せていますよ。
何か不明点があれば、またいつでも聞いてください。あなたの自動化ライフを全力でサポートします!
