プリンタの一覧を取得してリストボックスに表示

今日の職場での勉強会テーマ。備忘録としてここに残しておく。

テーマ:プリンタの一覧を取得して、リストボックスに表示する。

f:id:Infoment:20190111224333p:plain

参照設定

プリンタの一覧を取得するために、参照設定を行う。
Microsoft Shell Controls And Automation」
f:id:Infoment:20190111224742p:plain

いつものように今回も、勉強会では2チームに分かれてマクロを作成。

AddItemで項目作成

Aチームは、複数あるプリンタ名を一つずつ取得して、リストボックスに追加する方法を採用した。

Private Sub UserForm_Initialize()
    Dim ShellApp As Shell32.Shell
    Set ShellApp = New Shell32.Shell
    Dim PrinterName As Variant
        For Each PrinterName In ShellApp.Namespace(ssfPRINTERS).Items
            ListBox1.AddItem PrinterName
        Next
End Sub

リスト用配列を作成

Bチームは、リストにセットするための配列をまず作成。

Function GetPrinterList() As Variant
    Dim ShellApp As Shell32.Shell
    Set ShellApp = New Shell32.Shell
    
    Dim TempSeq() As Variant
    ReDim TempSeq(0)
    Dim i As Long
        i = 0
    Dim PrinterName As Variant
        For Each PrinterName In ShellApp.Namespace(ssfPRINTERS).Items
            TempSeq(i) = PrinterName
            i = i + 1
            ReDim Preserve TempSeq(i)
        Next
        
        ReDim Preserve TempSeq(i - 1)
        GetPrinterList = TempSeq
End Function

下ごしらえは長くなったが、その分UserForm_Initializeがすっきりする。

Private Sub UserForm_Initialize()
    ListBox1.List = GetPrinterList
End Sub

f:id:Infoment:20190111231007p:plain

AチームとBチーム、どちらの方式でも良いが、好みはBチームかな。
それと勉強会では、
ShellApp.Namespace(4).Items
としていたが、「4」が何を指しているか、知らないと分からない。勿論素直に「そういうもんだ」と丸暗記して使用しても良いのだけど、「ssfPRINTERS」の方が何をしているか理解しやすいと思う。

参考まで。