VBAでプリンタを変更する
プリンタの切り替え
VBAで、使用中のプリンタを切り替える方法。
目次
かつての考え方
Application.ActivePrinterプロパティで切り替える
VBAでプリンタを切り替えるには、Application.ActivePrinter
プロパティの値を変えるしかないと思い込んでいた。
しかし、この方式には難点がある。
Apploication.ActivePrinterプロパティの難点
Application.ActivePrinter
プロパティでプリンタを切り替えるときには、
Application.ActivePrinter = "JUST PDF 3 on Ne02:"
のように、プリンタ名だけでなく、「on Ne02:
」の部分も渡さなければならない。
この「on
」以下の部分がくせ者で、どうやって取得したらよいのかわからなかった。
強引な解決策
だから、以前、
このような、実に乱暴な対応を考えたのだった。
とりあえず、このやり方なら、「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
こんなふうに。
解決策
とはいえ、対応は実に簡単。前もって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
こいつを実行すると、
こんなふうにJUST PDF 3で印刷を実行し、終了後のイミディエイト・ウィンドウには、
このように出力される。
おわりに
あの苦労は一体何だったのか。