プリンタ情報の取得/設定
●vbaでプリンターの情報を取得するには名前程度ならばvbaのみで可能ですが、ポート番号等はレジストリの情報の取得が必要となってきます。ここではwindowsAPI(Application Programming Interface)を用いて実現させています。
windowsAPIの導入は定型的なコードがありますのでそれを利用します。
(windowsAPIの様々な種類)
(旧)
https://docs.microsoft.com/ja-jp/previous-versions/msdn10/Hh240557(v=MSDN.10)
https://docs.microsoft.com/ja-jp/windows/win32/apiindex/windows-api-list?redirectedfrom=MSDN
(上記のレジストリ情報の場所:プリンター名とポート番号)
コンピューター\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices
(windowsAPIの様々な種類)
(旧)
https://docs.microsoft.com/ja-jp/previous-versions/msdn10/Hh240557(v=MSDN.10)
https://docs.microsoft.com/ja-jp/windows/win32/apiindex/windows-api-list?redirectedfrom=MSDN
レジストリ情報の例 |
---|
(上記のレジストリ情報の場所:プリンター名とポート番号)
コンピューター\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices
●vbaでのプリンター名の一覧取得
単純に、今使っているプリンター名とポート番号は
(表示例) PX-505F Series(ネットワーク) on Ne00:
(参考)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.activeprinter
[プリンター一覧情報(名前、ポート番号)の重要性]
現在のプリンターは上記の様に比較的簡単に、名前とポート番号(Ne**の形式)は取得できますが、印刷の自動化等の処理を行う場合 自動的に使用するプリンターを設定変更したりする必要があります。
そのような場合にプリンターの一覧情報の取得が必要になってくるわけです。
とりあえず名前の一覧の取得には以下の方法が主なものとして上げられます。
1)Namespace(4)の利用
Shell.Applicationというクラスのオブジェクトの[Shellオブジェクト].NameSpace(4).Itemsコレクション のプロパティ(name)を取り出す操作で、各プリンター名を取得します。
オブジェクトブラウザで見るNamespace(4)の利用の参考情報
2)ExecQueryメソッドの利用
ExecQueryの書式
Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='サービス名'")
3)Accessモジュールの利用
Application.Printersコレクションの
.DeviceNameプロパティ
.DriverNameプロパティ
.Portプロパティ
で取得出来ます。(excelのvbaとは異なります)
上の3種類の方法の具体的なコードは、下のプリンターの名前の一覧表示 に示すので参考にしてください。
サンプルファイルもダウンロード出来ます。
その他の様々なプリンター情報の取得方法(参考情報)
■■■PowerShell■■■
https://docs.microsoft.com/ja-jp/powershell/scripting/samples/working-with-printers?view=powershell-7.2
■■■コマンドでよければ■■■
C:\Windows\System32\cmd.exe
「wmic printer get name」で名前の一覧が取得出来ます。
一方、ポート番号(Ne**形式)の取得は、vbaでは出来ないので、windowsAPIを使用します。
その方法具体的については下記にある
プリンターのポート番号の取得のための関数(windowsAPIの利用) を参照してください。
単純に、今使っているプリンター名とポート番号は
MsgBox Application.ActivePrinter
と言うコードで簡単に取得出来ます。(表示例) PX-505F Series(ネットワーク) on Ne00:
(参考)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.activeprinter
[プリンター一覧情報(名前、ポート番号)の重要性]
現在のプリンターは上記の様に比較的簡単に、名前とポート番号(Ne**の形式)は取得できますが、印刷の自動化等の処理を行う場合 自動的に使用するプリンターを設定変更したりする必要があります。
そのような場合にプリンターの一覧情報の取得が必要になってくるわけです。
とりあえず名前の一覧の取得には以下の方法が主なものとして上げられます。
1)Namespace(4)の利用
Shell.Applicationというクラスのオブジェクトの[Shellオブジェクト].NameSpace(4).Itemsコレクション のプロパティ(name)を取り出す操作で、各プリンター名を取得します。
オブジェクトブラウザで見るNamespace(4)の利用の参考情報
2)ExecQueryメソッドの利用
ExecQueryの書式
Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='サービス名'")
3)Accessモジュールの利用
Application.Printersコレクションの
.DeviceNameプロパティ
.DriverNameプロパティ
.Portプロパティ
で取得出来ます。(excelのvbaとは異なります)
上の3種類の方法の具体的なコードは、下の
その他の様々なプリンター情報の取得方法(参考情報)
■■■PowerShell■■■
https://docs.microsoft.com/ja-jp/powershell/scripting/samples/working-with-printers?view=powershell-7.2
■■■コマンドでよければ■■■
C:\Windows\System32\cmd.exe
「wmic printer get name」で名前の一覧が取得出来ます。
一方、ポート番号(Ne**形式)の取得は、vbaでは出来ないので、windowsAPIを使用します。
その方法具体的については下記にある
設定画面 |
---|
プリンター名の一覧取得その1(Namespace(4)の利用)
プリンター名の一覧取得その2(ExecQueryメソッドの利用)
プリンター_プリンター名一覧取得1~2(ダウンロード)
プリンター名の一覧取得その3(Accessモジュールの利用)
※このコードの実行にはAccessモジュール(ライブラリーファイル)を導入する必要があります
VBEの画面で、「ツール」->「参照設定」
Microsoft Access *** Object Libraryにチェック[OK]ボタンを押す
プリンター_プリンター名一覧取得3(ダウンロード)
ここでは、windowsAPIを使って、レジストリにあるプリンターのポート番号を取得する方法を紹介します。 vbaだけではレジストリの情報は取得出来ませんのでまず、そのための関数を設定します。
windowsAPIのための宣言
GetRegValue関数の設定
以上の、宣言、設定によって「GetRegValue」関数が使えるようになり、これを用いて プリンターのポート番号を取得します。
設定画面 |
---|
上記の「GetRegValue」関数を用いて、プリンター名の取得と同時にそのポート番号も取得します。
プリンター_名前一覧/ポート番号取得(ダウンロード)
設定画面 |
---|
実際にプリンターで印刷するときの、印刷パラメータを設定します。印刷パラメータの設定ダイアログは 「Application.Dialogs(xlDialogPrint).Show」のコード記述で出来ます。
プリンター_パラメータ設定(ダウンロード)
プリンター情報取得/設定(まとめ)です。
プリンターの名前とポート番号の一覧取得。プリンター印刷時の様々なパラメータを設定します。