リストの絞り込み の続き⑤ ~ 各棚のリストをユーザーフォームが開かれた状態で更新 ~
昨日は、選択した本棚の蔵書リストが表示されるよう、リストボックスを追加しました。
しかしこのままでは、せっかく 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
これで本棚を選択し直すたびに、本棚リストが更新されるようになりました。
さて、ここまで作りこんだことで、初期に比べてだいぶん高機能化することができました。そこで、機能追加はこれぐらいにして、今までに作成した箇所を少し見直してみることにします。
やはり一番気になるのは、リストボックスを選択した際の処理です。ListBox1とListBox2のMouseUPがほぼ同じ内容なので、これを何とか一つに纏めたい。恐らく様々な手法があると思いますが、私が知るのは以下の二つです。
- 異なる部分を引数にした、共通で使用できるサブプロシージャを作成。
- いずれかのリストボックスがクリックされたことを検知したうえで、そのリストボックスに合わせた処理を行うサブプロシージャを一つ作成。
1. の方法は、リストボックス毎に作成したサブプロシージャを Call する必要があります。100個のリストボックスがあれば、100箇所に呼び出しの記述が必要になるため、これも中々面倒ですね。
そこで次回(明日の予定)は、2. の手法でのまとめに挑戦してみます。
参考まで。