Bar

Excel VBA プリントサーバー導入後もプリンターを指定して印刷させる方法

先日Windows Server 2012 Essentialsにプリントサーバーを導入しました。
その後、一部PCにおいてExcel VBA 上で指定したプリンター以外から印刷される問題が発生、原因はプリンターの指定方法に誤りがあったためです。
多分忘れるので備忘録としてExcel VBA プリントサーバー導入後もプリンターを指定して印刷させる方法をメモ。

今までのVBA

Worksheets("hoge").PrintOut ActivePrinter:="<printer>"

既定プリンターを確認

現在既定プリンターとなっているプリンター名を確認したい場合は下記関数を使います。
Application.ActivePrinter

プリントサーバー上のプリンター

プリンター名の前にプリントサーバーを提供するサーバー名を書きます。
サーバー名がないと対象プリンターがないため、既定プリンターから印刷されました。
Worksheets("hoge").PrintOut ActivePrinter:="\\<servername>\<printer>"
余談:登録されたプリンター名を全て表示する
Dim sh As Object
Dim obj As Object
Dim ssfPRINTERS As Integer

' ShellSpecialFolderConstants
ssfPRINTERS = 4

Set sh = CreateObject("Shell.Application")

' Printer Names
For Each obj In sh.Namespace(ssfPRINTERS).Items
    Debug.Print obj.Name
Next

Set sh = Nothing

プリンター一覧を取得するため、Shell.NameSpaceを使います。
Shell.NameSpace method (Windows)
ssfPRINTERSの値4はShellSpecialFolderConstantsを参照しました。
ShellSpecialFolderConstants enumeration