Accessで複数のレポートの印刷設定を行う。

レポートを印刷する際、通常使うプリンターの設定を使わず、給紙方法などのプリンターの設定が必要な場合があります。

この様な状況で複数のレポートを印刷する場合、レポート一つ一つ個別にプリンターの設定をするのは面倒ですよね。出来ればプリンターの設定をまとめて行いたいものです。

対応策としてレポートにプリンターの設定を保存する方法や、サブレポートを使って対応する方法などもありますが、印刷時にプロパティの設定で随時変更できるようにしたいと思います。

今回はWIN32 API関数を使ってプリンターのプロパティを開き、設定されたプリンターの情報で複数のレポートを印刷するためのVBAを作成してみます。

動作イメージは以下の通りです。
140127_2

1.フォームのデザイン

140127_3

2.プリンターのプロパティを開くためのAPI

プリンターのプロパティを開くため、まずはフォームに以下のコードを設定して下さい。(2~13行目)

Option Compare Database
Option Explicit

Private Const PRINTACTION_PROPERTIES = 1& 'プリンターのプロパティの表示
Private Const PRINTACTION_DOCUMENTDEFAULTS = 6 '印刷設定ダイアグラムの表示

'プリンタのプロパティ取得等のコマンドを実行する関数
Private Declare Function SHInvokePrinterCommand Lib "Shell32.dll" _
    Alias "SHInvokePrinterCommandA" (ByVal hwnd As Long, _
    ByVal uAction As Long, ByVal lpBuf1 As String, _
    ByVal lpBuf2 As String, ByVal fModal As Long) As Long

Dim objDefaultprt As Printer '現在のプリンタ

3.フォームを開いた時にプリンターの一覧を取得する

Printerオブジェクトのプロパティ使ってコンボボックス[cmbプリンター]の値にプリンター一覧をセットします。(8~10行目)

Private Sub Form_Load()
    Dim objPrinter As Printer
    
    '現在のプリンタ設定を一旦退避
    Set objDefaultprt = Application.Printer
    
    'プリンターの一覧を取得しコンボボックスにセット
    For Each objPrinter In Printers
        Me!cmbプリンター.AddItem objPrinter.DeviceName
    Next
    
    '通常使うプリンタを表示
    Me!cmbプリンター.Value = Printer.DeviceName
End Sub

4.プリンターのプロパティを開く

API関数を利用してプリンターのプロパティ画面を開きます。(9~10行目)
Printers コレクションを使い印刷するプリンターを設定します。(13行目)

Private Sub cmdプロパティ_Click()
    Dim lngRet       As Long
    Dim strPrinter As String
    
    'コンボボックスで選択されているプリンター名を取得
    strPrinter = Me!cmbプリンター.Value
    
    'プリンターのプロパティを表示
    lngRet = SHInvokePrinterCommand(Me.hwnd, _
            PRINTACTION_PROPERTIES, strPrinter, vbNullString, 1)

    '選択されたプリンタの情報を設定
    Set Application.Printer = Application.Printers(strPrinter)
End Sub

ちなみにプロパティ画面ではなく、印刷設定画面を表示したい場合は以下の設定で可能です。

    lngRet = SHInvokePrinterCommand(Me.hwnd, _
            PRINTACTION_DOCUMENTDEFAULTS , strPrinter, vbNullString, 1)

※PRINTACTION_PROPERTIESをPRINTACTION_DOCUMENTDEFAULTSに変更

5.レポートを印刷する

Private Sub cmd印刷_Click()    
    'レポートを開く
    'DoCmd.OpenReport "rpt_レポート1"
    'DoCmd.OpenReport "rpt_レポート2"
    
    'プリンタ設定を元に戻す
    Set Application.Printer = objDefaultprt
End Sub

以上、今回は複数のレポートでプリンターのプロパティを同時に設定する為のVBAコードでした。

今回のサンプルファイルは以下のリンクからダウンロード可能です。