【入門編】【中級者向け】ページ設定の「プリンタ用紙サイズ」と「図面サイズ」の不一致を検出し修正する監査ツール – Visio VBA解析バイブル

スポンサーリンク

こんにちは、現場のエンジニア諸君。私はこれまで数多くの業務自動化を指揮してきましたが、Visioというツールは、その「柔軟さ」ゆえに、自動化の現場で最もエンジニアを悩ませるツールの一つだと言えます。

特に多くのユーザーが頭を抱えるのが、「画面では綺麗なのに、印刷(PDF化)すると余白がズレる」という問題です。これは、Visio内部で「図面のサイズ(Drawing Size)」と「プリンタ用紙のサイズ(Printer Paper Size)」が別々に管理されていることが原因です。

マクロの記録を卒業し、一段上の「プロの自動化」を目指すなら、このPageSheet(ページシート)の構造を理解することは避けて通れません。今日は、全ページの不一致を検出し、一括で修正する「ページ設定監査ツール」の作り方を通して、Visio VBAの本質を伝授しましょう。

—

1. Visioの「二重構造」を理解する

Visioのページ設定を理解する鍵は、「すべてのページは、実は巨大なExcelシート(PageSheet)である」という視点を持つことです。

私たちがマウスで設定を変えるとき、裏側ではPageSheet内の特定の「セル」の値が書き換わっています。

  • 図面サイズ(PageWidth / PageHeight): 私たちが作図するキャンバスの大きさ。
  • プリンタ用紙サイズ(PaperSize): 出力する紙の大きさ。

この2つが食い違っていると、印刷時に勝手に縮小されたり、巨大な余白が生まれたりします。これをVBAで制御するには、`Page.PageSheet`プロパティにアクセスし、該当するセルを的確に叩く必要があります。

—

2. ページ設定監査ツールの実装

では、実戦的なコードを見ていきましょう。このツールは、アクティブなドキュメントの全ページをスキャンし、図面サイズと用紙サイズが一致していないページを特定して、自動的に修正します。

Option Explicit

‘—————————————————————————–
‘ ツール名:Visioページ設定・一括監査&修正ツール
‘ 目的:図面サイズとプリンタ用紙サイズの不一致を解消し、印刷ミスを防ぐ
‘—————————————————————————–
Public Sub AuditAndFixPageSettings()
Dim vsoPage As Visio.Page
Dim vsoPageSheet As Visio.Shape
Dim reportMessage As String
Dim errorCount As Integer

‘ パフォーマンス向上のため画面更新とイベントを一時停止
Application.ScreenUpdating = False
Application.EventsEnabled = False

reportMessage = “【監査ログ】” & vbCrLf
errorCount = 0

‘ ドキュメント内の全ページをループ
For Each vsoPage In ActiveDocument.Pages
‘ 背景ページ(Background)はスキップする設計
If vsoPage.Background = False Then

‘ ページ設定を保持している「PageSheet」を取得
Set vsoPageSheet = vsoPage.PageSheet

‘ 監査ロジック:用紙サイズと図面サイズの整合性をチェック
‘ visPrintPropertiesPaperSize: 1=レター, 9=A4, 8=A3 など
‘ visPageWidth / visPageHeight: 実際の描画領域

‘ ここでは「用紙サイズに合わせて図面を構成しているか」を確認
‘ 本来はより複雑な比較が必要だが、今回は「自動フィット設定」の状態をチェック
If Not IsPageSizeConsistent(vsoPageSheet) Then
errorCount = errorCount + 1
reportMessage = reportMessage & “・Page: ” & vsoPage.Name & ” [不一致検出] -> 修正中…” & vbCrLf

‘ 修正処理の実行
FixPageSetup vsoPage
End If
End If
Next vsoPage

‘ 状態を戻す
Application.ScreenUpdating = True
Application.EventsEnabled = True

‘ 結果表示
If errorCount = 0 Then
MsgBox “すべてのページの整合性は完璧です。素晴らしい!”, vbInformation, “監査完了”
Else
MsgBox reportMessage & vbCrLf & “合計 ” & errorCount & ” 箇所の不一致を修正しました。”, vbExclamation, “修正完了”
End If
End Sub

‘ — 補助関数:整合性チェック —
Private Function IsPageSizeConsistent(ByRef vsoPageSheet As Visio.Shape) As Boolean
‘ PrintPropsセクションのPaperSizeセルの値を取得
‘ ここでは「プリンタ設定と図面サイズが連動しているか」を簡易判定する例
‘ 0 = 手動設定(ズレの元), 1 = 自動(理想)
‘ 実際にはPageWidthとPaperSizeの定数比較を行うのが上級者
On Error Resume Next
IsPageSizeConsistent = (vsoPageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesPaperKind).ResultIU = 1)
On Error GoTo 0
End Function

‘ — 補助関数:ページ設定の強制同期 —
Private Sub FixPageSetup(ByRef vsoPage As Visio.Page)
Dim vsoPageSheet As Visio.Shape
Set vsoPageSheet = vsoPage.PageSheet

‘ ここが極限の知見:Visioのページ設定を「図面サイズ=用紙サイズ」にする黄金律
‘ 1. 用紙サイズを図面サイズに合わせる設定 (OnPageSize)
‘ 2. 印刷倍率を100%に固定
‘ 3. センタリングを有効化

With vsoPageSheet
‘ 用紙サイズを「A4(9)」や「A3(8)」に固定するのではなく、
‘ 「図面サイズに合わせる」という振る舞いをセルに叩き込む
.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesPaperKind).FormulaForceU = “1”
.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesPrintScale).FormulaForceU = “1” ‘ 100%
.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesCenterX).FormulaForceU = “True”
.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesCenterY).FormulaForceU = “True”
End With
End Sub

—

3. このコードが「中級者向け」である理由

マクロの記録で生成されるコードは、`ActivePage.PageWidth = “297 mm”` のような直接的な代入になりがちです。しかし、プロのコードは違います。

① CellsSRC メソッドの活用

コード内で `CellsSRC(visSectionObject, visRowPrintProperties, …)` という書き方をしています。これは、Visio内部のデータ構造(Section, Row, Column)を直接指定する、最も高速で堅牢なアクセス方法です。名前(文字列)でセルを指定するよりも、実行速度が速く、言語環境(日本語版・英語版)に左右されない強さがあります。

② FormulaForceU の意味

`.Result` ではなく `.FormulaForceU` を使っている点に注目してください。Visioのセルには「数式」が入っていることが多く、単なる値の上書きでは、他のセルとの連動で値が戻ってしまうことがあります。`Force` を使うことで、エンジニアの意図を強制的に反映させます。

③ イベントの停止

`Application.EventsEnabled = False` を入れていますね。Visioはページサイズを変えるたびに多くの再計算イベントが発生します。これを止めないと、ページ数が多いドキュメントでは処理が激重になります。

—

4. 陥りやすいエラーと回避策

初心者がこの領域で必ずぶつかる壁が「単位」です。

Visio内部(Internal Units)では、長さはすべて「インチ」で管理されています。「210mm」と書きたいときに、単純に `210` と入れると、Visioは `210インチ` と解釈し、巨大なページが出来上がってしまいます。

  • 対策: `ResultIU`(内部単位での取得)や `FormulaForceU = “210 mm”` のように、単位を明示的に含めた文字列を渡すのが安全です。

—

最後に:ここをクリアすれば基本はバッチリです

ページ設定をVBAで自在に操れるようになると、「図面を生成して、PDFで保存し、メールで送る」という一連の業務フローが、一寸の狂いもなく自動化できるようになります。

Visio VBAは一見複雑ですが、「すべてはPageSheetというセル(スプレッドシート)の集合体である」という本質を掴めば、恐れることは何もありません。

この監査ツールをベースに、自分たちの業務でよく使う用紙サイズや余白設定を組み込んでみてください。それこそが、マクロの記録を卒業した証です。

また現場でお会いしましょう。健闘を祈ります!

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