プリンタ名を調べる
プリンタ名を取得する
コチラをう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」にチェックを入れて、オブジェクト・ブラウザーを見ると、
こんなふうに表示される。
「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プロパティをセルに書き出す
というコードになっていることが分かる。
実行結果
上掲サンプルコードにテキトーなプロシージャ名を付けて実行すると、
このとおり。
なるほど、純粋なプリンタ名が取得できている。
ただし、これを
このときの軽量PDF出力メソッドにどう生かすか、となると、ちょっとめんどくさそう。
参考
コチラもどうぞ!