プリンタ名を調べる

プリンタ名を取得する

akashi-keirin.hatenablog.com

コチラをうpしたところ、Twitterで次のサイト(『パソコンの小技・備忘録(ExcelのVBAで、パソコンのプリンタ一覧を取得したい。)』)をご紹介いただいた。

たぶん、

プリンタ名を比較するときにApplication.ActivePrinterの返り値をそのまま使うことができないのだ。
そんなわけで、仕方なく純粋なプリンタ名だけをまず切り出して、比較しているのだ。

のところを見て、教えてくださったのだろう。

サンプルコードに学ぶ

前掲サイトに掲載されているコードは

'変数の定義'
Dim tempShell As Object
Dim tempObj As Object
Dim intRow As Integer

'オブジェクトの設定と繰り返し処理'
Set tempShell = CreateObject("Shell.Application")    '……(1)'
intRow = 1
For Each tempObj In tempShell.NameSpace(4).Items    '……(2)'
  If intRow > 1 Then
    '取得したプリンタ名をセルに書き込む'
    Cells(intRow, 1) = tempObj.Name
  End If
  intRow = intRow + 1
Next

Set tempShell = Nothing

こんなの。

そういえば、「Shell」とか、今ひとつよく分かっていなかったので、この機会にちょっと調べてみた。

Shellオブジェクト

まず、(1)の

Set tempShell = CreateObject("Shell.Application")

では、Shell.Applicationというクラスのインスタンスを生成して変数tempShellにぶち込んでいる。

Windows Dev Centerの「Shell Object」の項には、

Represents the objects in the Shell. Methods are provided to control the Shell and to execute commands within the Shell. There are also methods to obtain other Shell-related objects.

とあるので、「Shell」というものの中にあるオブジェクトを操れるようにするオブジェクトぐらいの意味なのだろう(適当)。

(2)の

For Each tempObj In tempShell.NameSpace(4).Items

からは、おなじみFor Eachを用いて、[Shellオブジェクト].NameSpace(4).Itemsコレクションの要素を1つ1つ取り出す処理であることが読み取れる。

結局、tempObjという変数には何が入ることになるのか、ちょっと面倒だけれど、せっかくなので丁寧にたどってみる。

まず、ShellオブジェクトのNameSpaceメソッド。

Windows Dev Centerの「Shell NameSpace method」の項によると、

Creates and returns a Folder object for the specified folder.

とある。特殊フォルダの「Folder」オブジェクトを生成したり取得したりするメソッドっぽい(適当)。

ちなみに、上掲コードでは

tempShell.NameSpace(4)

と、NameSpaceメソッドの引数に「4」を渡している。

先ほどの「Shell NameSpace method」の項VB用のサンプルコードを見ると、

Set objFolder = objShell.NameSpace(ssfPERSONAL)

と、引数のところに「ssf」で始まる定数が使われている。

これは、「ShellSpecialFolderConstants」という組み込み列挙体らしい。

VBEでも、参照設定で「Microsoft Shell Controls And Automation」にチェックを入れて、オブジェクト・ブラウザーを見ると、

f:id:akashi_keirin:20180430092514j:plain

こんなふうに表示される。

「4」というのは、「ssfPRINTERS」のことだと分かる。

ちなみに、Windows Dev Centerの「ShellSpecialFolderConstants enumeration」の項によると、「ssfPRINTERS」というのは、

0x04 (4). Virtual folder that contains installed printers.

ということらしい。「Virtual folder」というのがよく分からんが、インストールされたプリンタを管理しているフォルダなんだろう(適当)。

tempShell.NameSpace(4)という式で、めでたくFolderオブジェクトが取得できるので、今度は、tempShell.NameSpace(4).ItemsでFolderオブジェクトのItemsメソッドを使う。

Windows Dev Centerの「Folder object」の項によると、「Items」メソッドというのは、

Retrieves a FolderItems object that represents the collection of items in the folder.

とある。

FolderItemsオブジェクトというのを返すみたい(適当)。

FolderItemsオブジェクトというのはFolderItemオブジェクトのコレクションなので、For Eachで取り出されるのはFolderItemオブジェクトということになる。

Windows Dev Centerの「FolderItem object」の項を見れば、メンバが分かる。

ちゃんとNameプロパティもある。

上掲コード中、For Eachブロック内の

If intRow > 1 Then

という条件分岐がイマイチ意味がよく分からないが、全体として

プリンタ情報を管理している特殊フォルダの中身を一つ一つチェックして、Nameプロパティをセルに書き出す

というコードになっていることが分かる。

実行結果

上掲サンプルコードにテキトーなプロシージャ名を付けて実行すると、

f:id:akashi_keirin:20180430092600j:plain

このとおり。

なるほど、純粋なプリンタ名が取得できている。

ただし、これを

akashi-keirin.hatenablog.com

このときの軽量PDF出力メソッドにどう生かすか、となると、ちょっとめんどくさそう。

参考

コチラもどうぞ!

akashi-keirin.hatenablog.com