VBSで通常使うプリンター名を取得する

「通常使うプリンター」に設定されているプリンターの名前を取得する方法を探してみました。

以下をVBSで保存して実行すると、通常使うプリンターの名前をメッセージボックスで表示します。

Dim objLocator, objService, objClassSet, objClass, strName

Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer
Set objClassSet = objService.ExecQuery("Select * From Win32_Printer")

For Each objClass In objClassSet
  If objClass.Default Then
    strName = objClass.Caption
  End If
Next

MsgBox strName,,"通常使うプリンター名"

Set objLocator = Nothing
Set objService = Nothing
Set objClassSet = Nothing
Set objClass = Nothing
Set strName = Nothing

実際には strName を他の作業に組み込んで使うことになると思います。


余談

ファイルメーカーの印刷ダイアログはOSによって制御されているらしいので、思ったように動作しないことがあります。
「印刷設定したのにその通りに印刷されない!」という事件が繰り返されないよう、「印刷設定」と「印刷」のスクリプトステップがどのように動作するか、まとめておきたいと思います。

  • 印刷設定

「用紙サイズ」と「印刷の向き」を指定できます。逆に言えばこの2つ以外は設定してもうまく反映されません。
プリンターのプロパティを設定できるように見えますが、実際には「印刷」ステップを後ろに置いて実行してみると「印刷設定」ステップでのプリンタープロパティは無視されてしまいます。
なんだか使いにくいステップですが、プレビューモードで印刷範囲を正しく表示させたいときには有用です。

  • 印刷

ダイアログを出せば基本的にすべて設定可能です。
ただし、印刷するレコードを対象レコードにしたり現在のレコードにしたりとユーザーが変更できてしまうので、ダイアログを出すことは意図しない動作の要因になり得ます。
自分で使うだけなら特に問題はないですが、不特定多数の人が使用する場合、ダイアログ無しにしておきたいです。

ダイアログ無しの場合、プロパティ設定を保存しておけば正常に印刷されますが、プリンター環境が変わった時は設定の修正が必要かもしれません。
さらに要注意点として、プロパティ設定を保存すると「印刷」ステップの用紙サイズと向きが適用されますので、「印刷設定」ステップが無意味になります。
プロパティ設定を保存しない場合、「印刷設定」の用紙サイズと向きで、前回印刷した時のプロパティを引き継いで印刷されます。

結局どうする?

  1. あらかじめ「印刷」ステップで用紙サイズや向き、プリンタープロパティをすべて設定しておく。
  2. 「印刷設定」ステップで用紙サイズと向きを指定し、「印刷」ステップはダイアログ無しでプロパティも設定しない。

のどちらかが通常は考えられます。
2. の方法の場合はプリンタープロパティが変更できないので、白黒印刷とカラー印刷などの切り替えが困難です。

プリンタープロパティはユーザーが指定できて、しかも印刷するレコードは変更できないようにしたいですよね。
そこで考えたのが「前回印刷したときのプロパティ」を作ってしまおうという方法です。

  1. 空白レイアウトで「印刷」ステップのダイアログを出し、プリンタープロパティを設定させ、空白ページを印刷する。
  2. 上記VBSを使ってプリンタ名を取得し、それを使ってVBSから印刷をキャンセルする。

これで印刷したプロパティが保存されるので、次からの「印刷」ステップに反映されます。
空白レイアウトでダミーの印刷を行っておいて、その後に実際に印刷したいレイアウトとレコードでダイアログ無しの「印刷」ステップを実行します。

空白ページは印刷されても問題ないのですが、プリンターの電源が入っていない時や用紙が無い時にエラーダイアログが出たままにならないよう、自動でキャンセルしたくてVBSを使っています。

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

19 + 1 =