リストボックスのいずれかがクリックされたことを検知する
昨日は、4つのサブプロシージャを一つに集約してみた。
infoment.hatenablog.com
うっかり、エラー処理を書き忘れていたので、先ほど慌てて追記した。指定パスにサブフォルダやファイルが存在しない場合は、空配列を戻り値としてある。
今日は、三つあるリストボックスの処理を、一つのサブプロシージャで行うことに挑戦する。
今回の作戦は、以下のとおり。
- リストボックス検知用のクラスモジュールを作成する。
- 各リストボックスのクリックを、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
クリックイベント確認のため、リストボックスに「ダミー」という単語を一つずつ追加した。
結果は、以下のとおり。
取り敢えず、各リストボックスのクリックを全て「myListBox_Click」で検知できるようになった。
続きは、また明日。
参考まで。