リストボックスのいずれかがクリックされたことを検知する

昨日は、4つのサブプロシージャを一つに集約してみた。
infoment.hatenablog.com

うっかり、エラー処理を書き忘れていたので、先ほど慌てて追記した。指定パスにサブフォルダやファイルが存在しない場合は、空配列を戻り値としてある。

今日は、三つあるリストボックスの処理を、一つのサブプロシージャで行うことに挑戦する。
f:id:Infoment:20181102173805p:plain
今回の作戦は、以下のとおり。

  1. リストボックス検知用のクラスモジュールを作成する。
  2. 各リストボックスのクリックを、WithEventsで検知させる。

文章にすると、あっさりしている。具体的には、次の通り。

標準モジュール

どのリストボックスがクリックされたか解るように、列挙型を一つ準備する。

' リストボックス
    Public Enum ListBoxNumber
        myVbFolder1 = 1
        myVbFolder2
        myVbFile1
    End Enum


各リストボックスは、↓ こちらで登録。

    Public LB(ListBoxNumber.myVbFolder1 To ListBoxNumber.myVbFile1) As New SelectFileClass

Public Sub SetLB()
    With SelectFileForm
        LB(ListBoxNumber.myVbFolder1).SetListBox .FolderListBox1, ListBoxNumber.myVbFolder1
        LB(ListBoxNumber.myVbFolder2).SetListBox .FolderListBox2, ListBoxNumber.myVbFolder2
        LB(ListBoxNumber.myVbFile1).SetListBox .FileListBox1, ListBoxNumber.myVbFile1
    End With
End Sub
クラスモジュール(SelectFileClass)
    ' 各リストボックスのクリック検知用
    Private WithEvents myListBox As MSForms.ListBox
    ' どのリストボックスがクリックされたかの検知用
    Dim myIndex As Long

newListBox には各リストボックスを、Index には先ほど設定した列挙型を充てることで、クリックされたリストボックスがどれかを判別する。

Public Sub SetListBox(newListBox As MSForms.ListBox, _
                      Index As Long)
    Set myListBox = newListBox
        myIndex = Index
End Sub


今回は試しに、以下のクリックイベントを設置してみる。
上手くいけば、クリックしたリストボックスに対応する1~3の数字が表示される。

Private Sub myListBox_Click()
    MsgBox myIndex
End Sub
ユーザーフォーム(SelectFileForm)

ここまでクラスモジュールに委ねたため、ユーザーフォーム側は閑散としている。

Option Explicit
Dim SQC As SeaquenceClass

Private Sub UserForm_Initialize()
    Set SQC = New SeaquenceClass
        FolderListBox1.List = SQC.GetFolderFileNames(ParentFolderPath)
        FolderListBox2.AddItem "ダミー"
        FileListBox1.AddItem "ダミー"
    Call SetLB
End Sub

クリックイベント確認のため、リストボックスに「ダミー」という単語を一つずつ追加した。

結果は、以下のとおり。
f:id:Infoment:20181102185701g:plain

取り敢えず、各リストボックスのクリックを全て「myListBox_Click」で検知できるようになった。

続きは、また明日。

参考まで。