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

#Else


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


Windowsの既定のプリンター名をセットする

https://www.exceltip.com/printing-in-vba/change-the-default-printer-using-vba-in-microsoft-excel.html


特集記事
最新記事
アーカイブ
タグから検索
ソーシャルメディア
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square