リストの絞り込み の続き⑤ ~ 各棚のリストをユーザーフォームが開かれた状態で更新 ~

昨日は、選択した本棚の蔵書リストが表示されるよう、リストボックスを追加しました。

infoment.hatenablog.com

しかしこのままでは、せっかく Modeless でユーザーフォームを呼び出したのに、違う本棚を選択してもリストが更新されません。
そこで今回は、ユーザーフォーム初期化の内容を標準モジュールに移動させ、本棚を選択するたびにリストが更新されるようにしてみましょう。


シートモジュールのSelectionChangeイベントを、下記のとおり修正します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim myReg As RegExp
        Set myReg = New RegExp
        myReg.Pattern = "[1-9]{1}-[A-Z]{1}"
        
        If myReg.test(StrConv(Target.Value, vbNarrow)) = True Then
            ChangeColor ActiveSheet, Target
            Call InitUserform ' 今回追加した行
        End If
End Sub


次に標準モジュールに、InitUserform を追加します。

Public Sub InitUserform()
    Dim tempSeq As Variant
        Call BookShelfInformation
        ReDim tempSeq(1 To Books.Count, 1 To 2)
    Dim i As Long
        i = 1
        For Each Book In Books
            If Selection.Value = Book.本棚番号 Then
                tempSeq(i, 1) = Book.書籍名称
                tempSeq(i, 2) = Book.通し番号
                i = i + 1
            End If
        Next
    Dim seq As Variant
        ReDim seq(1 To i - 1, 1 To 2)
        seq = tempSeq
        BookShelfForm.ListBox2.List = seq
End Sub


ユーザーフォーム側は、初期化プロシージャの内容がごっそり出て行ったので、とてもスッキリしたものになりました。

Private Sub UserForm_Initialize()
    Call InitUserform
End Sub


これで本棚を選択し直すたびに、本棚リストが更新されるようになりました。
f:id:Infoment:20180817230142p:plain
f:id:Infoment:20180817230204p:plain


さて、ここまで作りこんだことで、初期に比べてだいぶん高機能化することができました。そこで、機能追加はこれぐらいにして、今までに作成した箇所を少し見直してみることにします。

やはり一番気になるのは、リストボックスを選択した際の処理です。ListBox1とListBox2のMouseUPがほぼ同じ内容なので、これを何とか一つに纏めたい。恐らく様々な手法があると思いますが、私が知るのは以下の二つです。

  1. 異なる部分を引数にした、共通で使用できるサブプロシージャを作成。
  2. いずれかのリストボックスがクリックされたことを検知したうえで、そのリストボックスに合わせた処理を行うサブプロシージャを一つ作成。

1. の方法は、リストボックス毎に作成したサブプロシージャを Call する必要があります。100個のリストボックスがあれば、100箇所に呼び出しの記述が必要になるため、これも中々面倒ですね。

そこで次回(明日の予定)は、2. の手法でのまとめに挑戦してみます。

参考まで。