VBAでプリンタを変更する

プリンタの切り替え

VBAで、使用中のプリンタを切り替える方法。

目次

かつての考え方

Application.ActivePrinterプロパティで切り替える

VBAでプリンタを切り替えるには、Application.ActivePrinterプロパティの値を変えるしかないと思い込んでいた。

しかし、この方式には難点がある。

Apploication.ActivePrinterプロパティの難点

Application.ActivePrinterプロパティでプリンタを切り替えるときには、

Application.ActivePrinter = "JUST PDF 3 on Ne02:"

のように、プリンタ名だけでなく、「on Ne02:」の部分も渡さなければならない。

この「on」以下の部分がくせ者で、どうやって取得したらよいのかわからなかった。

強引な解決策

だから、以前、

akashi-keirin.hatenablog.com

このような、実に乱暴な対応を考えたのだった。

とりあえず、このやり方なら、「on」以下の部分が、「on NeXX:」か、「on nul:」になっているなら、(時間は少々かかってしまうが、)取得は可能だ。

問題点

しかし、このやり方には当然問題がある。

上記のように、「on」以下の部分が、「on NeXX:」か「on nul:」でなかったとしたら対応できない、ということだ。

こんな方法があった

ところが、実に簡単な解決策があった。

Worksheet.PrintOutメソッドの引数で切り替える

見出しのように、Worksheet.PrintOutメソッドの引数でプリンタを指定するという方式である。

実は、Worksheet.PrintOutメソッドの引数ActivePrinterに渡すのは、プリンタ名だけで良い。

上記の例でいえば、

Dim Sh As Worksheet
Set Sh = ActiveSheet
Call Sh.PrintOut(ActivePrinter:="JUST PDF 3")

だけで良いのである。

プリンタ名を取得するだけなら割と簡単にできる。(ShellとかWMIを使う。)

この方法なら「on Ne:XX」について調べなくてもプリンタを切り替えることが出来て便利だ。

Application.ActivePrinterプロパティの値は切り替わってしまう

ただし、(当然のことながら、)この方法で印刷をすると、Application.ActivePrinterの値は変わってしまう。

Private Sub test02()
  Dim Sh As Worksheet
  Set Sh = ActiveSheet
  Debug.Print "印刷前 :" & Application.ActivePrinter
  Call Sh.PrintOut(ActivePrinter:="JUST PDF 3")
  Debug.Print "印刷後 :" & Application.ActivePrinter
End Sub

f:id:akashi_keirin:20201219115634j:plain

こんなふうに。

解決策

とはいえ、対応は実に簡単。前もってApplication.ActivePrinterの値を取得しておき、印刷後、元に戻してやればよろしい。

Private Sub test02()
  Dim Sh As Worksheet
  Set Sh = ActiveSheet
  Dim orgPrinter As String
  orgPrinter = Application.ActivePrinter
  Debug.Print "印刷前 :" & Application.ActivePrinter
  Call Sh.PrintOut(ActivePrinter:="JUST PDF 3")
  Debug.Print "印刷直後:" & Application.ActivePrinter
  Application.ActivePrinter = orgPrinter
  Debug.Print "戻したよ:" & Application.ActivePrinter
End Sub

こいつを実行すると、

f:id:akashi_keirin:20201219115638j:plain

こんなふうにJUST PDF 3で印刷を実行し、終了後のイミディエイト・ウィンドウには、

f:id:akashi_keirin:20201219115642j:plain

このように出力される。

おわりに

あの苦労は一体何だったのか。