VBA Userformをプリントアウトする時にプリンターを選択する方法
失敗するやり方
Excel のシートをプリントアウトする際、特定のプリンターを指定してプリントアウトする方法があります。
よく知られている方法です。
Dim 元のプリンター As String
元のプリンター = Application.ActivePrinter
Application.ActivePrinter = "Microsoft Print to PDF on Ne01:"
ActiveSheet.Printout
Application.ActivePrinter = 元のプリンター
現在のアクティブプリンター名を取得して、いったん変数に入れておき、アクティブプリンターを、別のプリンターに切り替えます。そして、印刷を実行した後、アクティブプリンターを元に戻す、というやり方です。
驚くべき事に、このやり方、UserformのPrintform メソッドでは通用しません。
なぜなら、UserformのPrintformで使われるプリンターはWindowsの既定のプリンター以外に選択できないからです。
まさかと思いましたが、本当にそうでした。
そうすると、あとは、Printformを実行する前後でWindowsの既定のプリンターを切り替える方法しかありません。
ソースコード
’==============================
’標準モジュールに書くコード
’==============================
#If VBA7 Then
Public Declare PtrSafe Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
Public Declare PtrSafe Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
#End If
*’*******************************************************
’Windowsの既定のプリンター名を取得する関数
’*******************************************************
Public Function GetDefaultPrinter() As String
Dim printerName As String, ret As Integer
printerName = Space(255)
ret = GetProfileString("Windows", ByVal "device", "", printerName, Len(printerName))
If ret Then printerName = UCase(Left(printerName, InStr(printerName, ",") - 1))
GetDefaultPrinter = printerName
End Function
*’*******************************************************
’Windowsの既定のプリンター名をセットするプロシージャー
’*******************************************************
Public Sub SetDefaultPrinter(printerName As String)
CreateObject("WScript.network").SetDefaultPrinter printerName
End Sub
’==============================
’Userformモジュールに書くコードの例
’==============================
Private Sub CommandButton1_Click()
Dim originalPrinter$
originalPrinter = GetDefaultPrinter
SetDefaultPrinter "Microsoft Print to PDF"
Me.PrintForm
SetDefaultPrinter originalPrinter
End Sub
参考ページ
Windowsの既定のプリンター名を取得する
https://blog.jtbworld.com/2006/01/get-name-of-default-printer-using-vba.html