こんにちは!Visioの図面整理や大量印刷のたびに、プリンターの設定画面を行ったり来たりしていませんか?「A4のページはこっちの複合機、A1の大判図面はプロッターへ…」なんて手動で切り替えているうちに、うっかり設定ミスで白紙が大量に出てしまったり。
今回は、そんな現場のプチストレスを完全に解消する「図面サイズに応じたプリンターの自動振り分け印刷」のテクニックを伝授します。
「マクロの記録」から一歩進んで、Visioオブジェクトモデルの核心に触れる、実務で即戦力になるコードを用意しました。ここをクリアすれば、あなたのVisio VBAの基礎力は確実にプロの領域へ到達しますよ。さあ、一緒に見ていきましょう!
—
1. なぜVisioの印刷自動化は手強いのか?(基本思想の理解)
ExcelやWordなら `ActiveSheet.PrintOut` と書くだけで終わりですが、Visioは「図面(Document)」の中に「複数のページ(Page)」が混在し、さらにページごとに用紙サイズや向きがバラバラになり得るという特殊な構造を持っています。
Visio VBAをマスターするための第一歩は、このオブジェクトの階層構造を把握することです。
[Application] (Visioアプリ全体)
└─ [ActiveDocument] (いま開いている図面ファイル)
└─ [Pages] (ページ全体のコレクション)
└─ [Page] (個々のページ。ここに用紙サイズが宿る)
プリンターの制御(`Application.ActivePrinter`)は、OSやプリンタードライバーを巻き込むため、一歩間違えると「指定したプリンターが見つからない!」という実行時エラーでマクロがクラッシュします。ここをスマートにいなすのが、一流のエンジニアの腕の見せ所です。
—
2. 実装の全体像:サイズ判定から印刷までの流れ
今回作成するマクロの戦略はこうです。
1. 対象ページを一枚ずつスキャンする。
2. そのページの用紙サイズ(幅と高さ)をミリメートル単位で取得する。
3. サイズを判定して、最適なプリンター名を文字列変数に代入する。
4. `Application.ActivePrinter` にそのプリンター名を設定する。
5. そのページだけを印刷(`PrintOut`)する。
これを自動化するスクリプトが次のコードです。開発タブの「Visual Basic」を開き、標準モジュールに貼り付けてみてください。
—
3. 実用コード:自動プリンター振り分けエンジン
Sub AutoRoutePrinting()
Dim vsoPage As Visio.Page
Dim dblWidth As Double
Dim dblHeight As Double
Dim strTargetPrinter As String
Dim originalPrinter As String
‘ 1. 現在のデフォルトプリンターを退避(処理終了後に戻すため)
originalPrinter = Application.ActivePrinter
‘ 2. 図面内の全ページをループ処理
For Each vsoPage In ActiveDocument.Pages
‘ ページの幅と高さ(内部単位はインチなのでミリメートルに変換して判定)
‘ Page.PageSheetからPageWidthとPageHeightのセル値を取得します
dblWidth = vsoPage.PageSheet.Cells(“PageWidth”).Result(“mm”)
dblHeight = vsoPage.PageSheet.Cells(“PageHeight”).Result(“mm”)
‘ — 3. サイズに応じたプリンターの動的振り分けロジック —
‘ ※お使いの環境のプリンター名(正確な文字列)に書き換えてください
If dblWidth > 420 Or dblHeight > 420 Then
‘ A3(297×420)を超えるサイズは大型プロッターへ
strTargetPrinter = “HP DesignJet Plotter”
Else
‘ A4やA3などの一般図面はオフィスの複合機へ
strTargetPrinter = “Office_Network_Printer_A4”
End5 If
‘ 4. プリンターの切り替え実行(エラー対策込み)
On Error GoTo PrinterError
Application.ActivePrinter = strTargetPrinter
On Error GoTo 0 ‘ エラートラップ解除
‘ 5. 該当ページのみを印刷
‘ 引数省略で「現在のページの表示設定に従う」印刷になります
vsoPage.PrintOut
Debug.Print “ページ「” & vsoPage.Name & “」を [” & strTargetPrinter & “] で印刷しました。”
Next vsoPage
‘ 6. プリンターを元に戻す
Application.ActivePrinter = originalPrinter
MsgBox “すべてのページの印刷指示が完了しました!”, vbInformation, “自動印刷完了”
Exit Sub
PrinterError:
MsgBox “指定されたプリンターが見つかりません: ” & strTargetPrinter & vbCrLf & _
“プリンター名が正しいか、ネットワーク接続を確認してください。”, vbCritical, “プリンターエラー”
Application.ActivePrinter = originalPrinter
End Sub
—
4. コードの深掘り:初心者が押さえるべき3つのポイント
① ページのサイズを正確に取得する(`PageSheet`の魔術)
Visioの図面サイズは、実はシェイプの一種である「PageSheet」という裏側の定義シートに隠されています。
`vsoPage.PageSheet.Cells(“PageWidth”).Result(“mm”)` と書くことで、Visioの内部単位(インチ)を私たちが普段使う「mm(ミリメートル)」に瞬時に変換して取得できます。この `Result` メソッドの使い所はVisio VBAの基本中の基本です。
② プリンター名の一致(完全一致の罠)
`Application.ActivePrinter` に代入する文字列は、Windowsの「コントロールパネル」や「設定」にあるプリンターの名前と1文字たりとも違ってはいけない完全一致である必要があります。
動かす前に、メモ帳などに現在の `Application.ActivePrinter` の中身を `MsgBox` で出力させて確認しておくと、予期せぬエラーを防げます。
③ 異常系への備え(エラートラップ)
ネットワークプリンターは、一時的なオフラインや名前の変更などで簡単に見失います。
コード内の `On Error GoTo PrinterError` のように、「もしプリンターが見つからなくても、そこでマクロを強制終了させず、元のプリンターに戻して安全に離脱する」という設計(フェイルセーフ)が、プログラミング中級者への分水嶺となります。
—
まとめ:ここをクリアすればVisio VBAは怖くない!
今回は、`ActivePrinter` を軸に、ページごとの動的なプロパティ判定とプリンターの切り替えを組み合わせた実用的なコードをご紹介しました。
- オブジェクトの階層(Document ➔ Pages ➔ Page)をたどること
- 内部単位(インチ)を `Result(“mm”)` で実用値に変換すること
- トラブル時の安全策(プリンターの退避と復元)を入れること
この3つさえ押さえておけば、どんなに複雑なレイアウトの図面束であっても、あなた専用の全自動印刷ロボットを自由自在に組み立てることができます。
日々のルーティンワークはコードに任せて、あなた更有意義なクリエイティブな時間に使ってくださいね。それでは、次のステップでお会いしましょう!
