プリンタが存在するかどうかを判定するFunction

プリンタが存在するかを調べるFunction

軽量PDFを作成するためには、ExportAsFixedFormatメソッドを用いていたのでは限界があるので、

akashi-keirin.hatenablog.com

このときのように、プリンタにJUST PDFなどの、PDF出力用プリンタを選択する。

その場合、プリンタ名をApplication.ActivePrinterプロパティにプリンタ名をセットすることになる。

このとき、存在しないプリンタ名をセットしようとすると、当然ながらエラーが出る。

このことを利用して、プリンタが存在するかどうかを判定するFunctionを作成した。

コード

リスト1 標準モジュール
Public Function isExistPrinter( _
                  ByVal printerName As String) As Boolean
  isExistPrinter = False
  Dim tmp As String    '……(1)'
  tmp = Application.ActivePrinter
  On Error Resume Next    '……(2)'
  Application.ActivePrinter = printerName
  Application.ActivePrinter = tmp
  If Err.Number > 0 Then Exit Function
  On Error GoTo 0
  isExistPrinter = True
End Function

まず(1)からの2行

Dim tmp As String
tmp = Application.ActivePrinter

で、変数tmpApplication.ActivePrinterプロパティの値を保持しておく。

次に(2)からの5行

On Error Resume Next
Application.ActivePrinter = printerName
Application.ActivePrinter = tmp
If Err.Number > 0 Then Exit Function
On Error GoTo 0

では、最初に

On Error Resume Next

でエラーが出ても無視するようにしておいて、

Application.ActivePrinter = printerName

で、引数として受け取ったprinterNameApplication.ActivePrinterプロパティに突っ込んでみる。

printerNameが存在するプリンタ名なら、単にActivePrinterが切り替わるだけ。存在しないプリンタ名だとエラーが出る。On Error Resume Nextしているので、エラーが出ていたとしてもプログラムが停止することはないが、エラーが出ていればErr.Number > 0になっており、エラーが出ていなければErr.Number = 0のはずだ。

エラーが出るかどうかさえ分かれば良いので、この後即座に

Application.ActivePrinter = tmp

ActivePrinterを元通りにしておく。

もし、エラーが出ていたのであれば、

If Err.Number > 0 Then Exit Function

のところでreturn。

最初にisExistPrinterFalseにしてあったのだから、Falseが返る。

エラーが出ていなければ、最後にisExistPrinterTrueになるので、Trueが返る。

たったこれだけの簡単なコード。

使ってみる

まず、イミディエイト・ウインドウに、

?Application.ActivePrinter

と打ち込んで[Enter]をドン!

f:id:akashi_keirin:20180929181713j:plain

アクティブなプリンタが「JUST PDF 3 on Ne03:」だということがわかる。

で、今度はイミディエイト・ウインドウに

isExistPrinter("ち~んw")

と入力して[Enter]をポン!

「ち~んw」などというアホな名前のプリンタがあるわけがないので、当然

f:id:akashi_keirin:20180929181720j:plain

Falseが返る。

この状態で、イミディエイト・ウインドウに

?Application.ActivePrinter

と打ち込んで[Enter]をプチッ!

f:id:akashi_keirin:20180929181726j:plain

ご覧のように、アクティブなプリンタは元通りになっている。

当然、イミディエイト・ウインドウに

isExistPrinter("JUST PDF 3 on Ne03:")

と打ち込んで[Enter]をズン!

f:id:akashi_keirin:20180929181742j:plain

キッチリTrueが返っている。

おわりに

ひとまず、ここまで。