記事一覧

【EXCEL VBA】指定したネットワークプリンターで印刷するマクロ

ネットワーク接続の共用プリンターがオフィスでは最早当たり前でありますが、エクセルVBAにおいてはそのネットワークプリンターを選択するというのは中々難しいのが現状です。

「何が難しいのか、プリンター名で選択すればいいのでは?」とまぁそうなんですが、Windowsで認識されるネットワークプリンターというのはプリンター名の他に「NeXX:」というプリンタードライバー名には記載されないポート名が付与されています。

このXXの部分は概ねプリンターをインストールした順に連番が振られるのですが、プリンターセットアップ時に取得したXXと再起動後のXXが一致しないなど結構面倒でして、また個人でプリンターを追加/削除した際にXX部分の番号が入れ替わるなど汎用マクロを配布するには少々ハードルが高くなります。

通常の対策としてはプリントダイアログを表示させ、手動で印刷プリンターを選んでもらうのが一般的。


Application.Dialogs(xlDialogPrint).Show

一度選んだら複数枚印刷は前のプリンター名を引き継ぎますが、現在選択されているプリンター名だけではXXの部分が分からないので再指定に引数としては利用できません。(印刷処理をループさせていればいいですけどね)

複数枚印刷に毎回プリントダイアログで処理が中断するのでは省力化のためのマクロであるのにその意義が失われますし、なんとか指定プリンター印刷で自動化したいところ。

数年来の課題であったこの分がなんとか解消できたので自分メモとして残しておきます。



 '印刷できたかどうかのチェック用変数
 nechk = 0

 'プリンターポートの配列、同じネットワーク上に存在するプリンター台数以上にセットするのが好ましい
 ne = Array("P1", "Ne00:", "Ne01:", "Ne02:", "Ne03:", "Ne04:", "Ne05:", "Ne06:", "Ne07:", "Ne08:", "Ne09:", "Ne10:")

 For i = 0 To UBound(ne)
   Sheets("印刷シート名").Select
   On Error Resume Next
   Application.ActivePrinter = "指定プリンター名 on " & ne(i)
     If Err.Number <> 0 Then
     Else
       ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
       nechk = 1
       Exit For
     End If
     On Error GoTo 0
   Next

nechk=0ならプリントダイアログを出す事で未印刷を防げます。
単純にResume Nextを使うだけでは印刷がスルーされるだけで根本的な解決になりません。On Error GoTo 0(※ラベル0行は作らない)を使う事で、プリンターの取得に失敗してもループが継続するようになりました。

パラレル-LAN変換機器によっては"on P1"などの様にポート名を固定されるものもあり、それはこうしたポート名の変更による影響を受けないのですが、機器が混在する場合などにはやはり対策が必要でしょう。

以上俺メモ

コメント一覧