【入門編】Application.Printerオブジェクトによる帳票出力先の動的切り替え – Access VBA解析バイブル

スポンサーリンク

Access VBAでプリンタを自在に操る:帳票出力の「自動化」を極める

こんにちは。日々の業務効率化に情熱を燃やすエンジニアの皆さん、ようこそ。

Accessで帳票を作成していると、必ずぶつかる壁があります。「PCが変わるたびにプリンタ設定をやり直すのが面倒」「特定の帳票だけ、なぜか別のプリンタから出てくる」……そんな悩みを抱えていませんか?

今日は、Accessの`Application.Printer`オブジェクトを使いこなし、「出力先をコードで完璧に制御する」という、プロの技術を伝授します。ここをマスターすれば、あなたのシステムは環境に依存しない、堅牢なツールへと進化します。

1. なぜ「プリンタの動的切り替え」が必要なのか?

通常、Accessのレポートは「最後に保存したプリンタ設定」を記憶しています。しかし、開発環境と運用環境のプリンタが異なる場合、この「記憶」はしばしば仇となります。

  • 環境依存のエラー: 開発者のPCにはある「PDF出力用プリンタ」が、ユーザーのPCには存在しない。
  • 用紙サイズのズレ: 「A4横」で設定したはずが、プリンタ側のデフォルトが「A4縦」で印刷されてしまう。

これらを解決するのが、「VBAで印刷直前にプリンタと用紙設定を上書きする」というアプローチです。

2. 魔法のオブジェクト「Application.Printer」

Accessでは、現在のプリンタ設定は `Application.Printer` というオブジェクトに集約されています。これを書き換えることで、Access全体(あるいはレポート単体)の出力先をその場で操作できるのです。

実践:プリンタを切り替えて出力するコード

まずは、最も汎用的な「特定のプリンタを指定してレポートを印刷する」コードを見てみましょう。

Public Sub PrintReportToSpecificPrinter(reportName As String, printerName As String)
Dim prt As Printer

‘ 1. 指定したプリンタが見つかるか確認し、オブジェクトにセット
‘ ※存在しないプリンタ名を指定するとエラーになるので、必ずエラーハンドリングを
On Error Resume Next
Set Application.Printer = Application.Printers(printerName)

If Err.Number <> 0 Then
MsgBox “プリンタ ‘” & printerName & “‘ が見つかりません。”, vbCritical
Exit Sub
End If
On Error GoTo 0

‘ 2. レポートを開いて印刷(acViewNormalは印刷実行)
DoCmd.OpenReport reportName, acViewNormal

‘ 3. 後始末:設定をデフォルトに戻す(これを忘れると後続の処理に影響します)
Set Application.Printer = Nothing
End Sub

コードの重要ポイント解説

  • `Application.Printers` コレクション: PCにインストールされている全てのプリンタのリストです。ここから名前を指定して抽出します。
  • `Set Application.Printer = Nothing`: これが最も重要です。設定を「何も指定しない状態」に戻すことで、AccessはWindowsの「通常使うプリンタ」を参照するようになります。これを忘れると、あなたのプログラムが原因でユーザーのPCの印刷設定が狂い続けます。

3. さらに一歩先へ:用紙サイズや向きを制御する

プリンタを変えるだけでなく、用紙設定も細かく制御したい場合は、`Report.Printer` オブジェクトを個別操作します。

Sub SetupReportSettings(reportName As String)
Dim rpt As Report

‘ レポートを隠しモードで開く
DoCmd.OpenReport reportName, acViewDesign, , , acHidden
Set rpt = Reports(reportName)

‘ 用紙設定を細かく変更
With rpt.Printer
.PaperSize = acPRPSA4 ‘ A4サイズ
.Orientation = acPRORLandscape ‘ 横向き
.Copies = 1 ‘ 部数
End With

‘ 設定を保存して閉じる
DoCmd.Close acReport, reportName, acSaveYes

‘ 印刷実行
DoCmd.OpenReport reportName, acViewNormal
End Sub

4. 初学者が陥りやすい「罠」

この領域でよくある失敗を、先輩として先回りして指摘しておきますね。

1. プリンタ名の一致: `Application.Printers(“Canon LBP6000”)` のように指定する場合、PC上のプリンタ名と完全に一致している必要があります。名前が少しでも異なると「インデックスが有効範囲にありません」というエラーが出ます。

  • 解決策: `For Each p In Application.Printers` を使って、プリンタ名の一部が含まれているかチェックするループ処理を組みましょう。

2. 実行権限: ネットワークプリンタの場合、接続が不安定だとエラーになります。`On Error` 文でのガードは必須です。
3. レポートの保存: `acSaveYes` を使いすぎると、意図せずレポートのデザイン自体が変更されてしまうことがあります。基本は「実行時にのみ設定を書き換え、保存しない」のが安全です。

最後に:なぜこれを知っておくべきなのか

Access VBAの真髄は、「手作業の再現」ではなく「環境を支配すること」にあります。

プリンタ設定をコードで制御できるようになれば、あなたはもう「印刷ダイアログを何度も開く」という無駄なクリックから解放されます。これができるだけで、周囲のユーザーから「Accessの達人」として信頼されるようになるはずです。

まずは、自分のPCにあるプリンタ名をデバッグウィンドウで取得するところから始めてみてください。

‘ PCの全プリンタ名を取得するスニペット
Dim p As Printer
For Each p In Application.Printers
Debug.Print p.DeviceName
Next p

ここをクリアすれば、Access VBAの基本はもうバッチリです。さあ、あなたのシステムを、もっと賢く、もっと自由にしましょう。応援しています!

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