使用できるプリンタの一覧はApplication.Printersコレクションにより、また通常使うプリンタはApplication.Printerオブジェクトで取得できます。プリンタの名前はいずれもDeviceNameプロパティです。
これにより簡単なVBAでプリンタ名の一覧と通常使うプリンタ名を取得し、プリンタを選択して印刷する例を試してみます。
準備
プリンタの状態
準備というか事前の状況ですが、コントロールパネル(デバイスとプリンター)でプリンタはこのようになっています。
「通常使うプリンター」を設定していることに注意してください(この例では「Microsoft Print to PDF」です)。
印刷するオブジェクト
印刷するのは「サンプルレポート」という名前のレポートです。下記の手順を試す場合は先に作成しておいてください。
手順
フォームを作成して2つのコントロールを設置します。
1つはリストボックスで、「名前」は「lstプリンタ一覧」とします。
もう1つはコマンドボタンで、「名前」は「cmd印刷」とします(「標題」は「印刷」としています)。
リストボックスについて、「値集合タイプ」は「値リスト」とし、「値リストの編集の許可」は「いいえ」とします。
特に前者はこうしておかないと後でエラーが出ます。
フォームモジュールに次のようなコードを記します。
補足ですが、まず先に実行されるのはフォームのLoadイベントの方です。
プリンタ一覧はApplication.Printersにより取得できるわけですが、リストボックスに記すにあたっては名前が必要ですので、これをDeviceNameプロパティにより順次取得してリストボックスのAddItemメソッドで追加しています。
そして通常使うプリンタはApplication.Printer.DeviceNameですのでこれをリストボックスの値とし、つまりリストボックスの既定値のようにしています。
ボタンがクリックされたときは選択されているプリンタ名に基づきApplication.Printerを設定し、印刷を開始します。
なおApplication.printerはAccessの既定のプリンタであり、さしあたり「通常使うプリンター」が割り当てられますが、これを変更しても「通常使うプリンター」が変更されることはありません。またAccessを閉じるまではこの設定が残りますので、随時「通常使うプリンター」に戻したいときは適当な変数に代入しておき印刷後に戻しておくといった工夫が必要です。
Option Compare Database Private Sub cmd印刷_Click() '選択されているプリンタをアプリ既定のプリンタにする Set Application.Printer = Application.Printers(Me.lstプリンタ一覧.Value) 'レポート印刷 DoCmd.OpenReport "サンプルレポート", acViewNormal End Sub Private Sub Form_Load() Dim i As Printer 'リストボックスに各プリンタを追加 For Each i In Application.Printers Me.lstプリンタ一覧.AddItem i.DeviceName Next 'アプリ既定のプリンタ(デフォルトは通常使うプリンタ)を選択した状態にする Me.lstプリンタ一覧.Value = Application.Printer.DeviceName End Sub
フォームビュー開いた様子です。
リストボックスにプリンタの一覧が表示され、さらに通常使うプリンタが選択された状態となっています。
印刷ボタンをクリックすると選択されているプリンタにより印刷が開始されます。
この例では印刷によりPDFが出力されますので、保存用のダイアログが表示されています。
物理プリンタを選択している場合はただちに用紙への印刷が開始されます。
備考
「設定」>「デバイス」>「プリンターとスキャナー」の画面で「Windowsで通常使うプリンターを管理する」にチェックを入れている場合は(これがWindowsのデフォルト。このとき「通常使うプリンター」は存在しません)、Accessを閉じてもApplication.Printerの値が残ります。