« VBAからAdobe Reader 6.0でPDFファイルを印刷する。 | トップページ | 非表示で残ってしまったExcel/Wordなどを表示する。 »

2007年1月17日 (水)

ExcelのApplication.ActivePrinterは「仕様障害」?

ActivePrinterにプリンタ名をそのまま代入してもエラーになります。
「プリンタ名 on ポート名」の形式でないと駄目なようです。
しかも、そのポート名が、USBポートのように:抜きで6文字以上の場合、
ユーザが設定し、プリンタのプロパティで表示されるポート名ではなく、
OSが勝手に割り当てたネットワークポート名のNe??:なのです。
ユーザはこれをどうやって指定すればよいのでしょうか?
全く困ったものです。

Ne??:に対応するだけなら、VBAだけで割り出せます。

Sub SetActivePrinter1(Name)
Dim n
Dim PortName
For n = 100 To 199
  PortName = Name & " on Ne" & Right(n, 2) & ":"
  TrySetActivePrinter PortName
  If Err = 0 Then Exit For
Next
If Err Then Err.Raise Err.Number
MsgBox Application.ActivePrinter
End Sub

Sub TrySetActivePrinter(Name)
On Error Resume Next
Application.ActivePrinter = Name
End Sub

LPTn:などのポートにも対応するには、レジストリを見るしかなさそう。

Sub SetActivePrinter2(Name)
Dim wShell
Const Key = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\"
Set wShell = CreateObject("WScript.Shell")
Application.ActivePrinter = Name & " on " & Split(wShell.RegRead(Key & Name), ",")(1)
End Sub

Wordは、ActivePrinterにプリンタ名をそのまま代入しても、問題ないようです。

« VBAからAdobe Reader 6.0でPDFファイルを印刷する。 | トップページ | 非表示で残ってしまったExcel/Wordなどを表示する。 »