ListBoxを操作するクラスモジュール ⑩ まとめ

ListBoxを操作するクラスモジュールを、私なりに作成してきた。
前回は、レーベンシュタイン距離を用いて、「探している文字と何か似てる」ものを探すことに挑戦した。
infoment.hatenablog.com

今日も、前回の続きから。
f:id:Infoment:20201014230753p:plain

前回の更新から色々と調整して、一通りの目途がついた。
ということで今日は、今までのまとめとする。

クラスモジュール(ListBoxControl)

今まで細切れに載せてきたクラスモジュールだが、今日は全文を載せる。

↓ こちらをクリックして展開表示。

ユーザーフォーム

今回はまとめということで、今まで紹介した機能のいくつかを盛り込んだ。
f:id:Infoment:20201014231145p:plain

それぞれの機能を、それなりに簡略化できたと思う。

Option Explicit

Dim Lbc(1 To 2) As VBAProject.ListBoxControl
Dim Tb As ListObject

' ユーザーフォームの初期化。
Private Sub UserForm_Initialize()
    
    Set Tb = ActiveSheet.ListObjects(1)

    ' リストボックスに表示する範囲を、一旦配列に格納。
    Dim arr As Variant
        arr = Tb.Range
    
    ' クラスモジュールの初期化。
    Dim i As Long
        For i = 1 To 2
            Set Lbc(i) = New VBAProject.ListBoxControl
            Set Lbc(i).TargetListBox = Me.Controls("ListBox" & i)
        Next
        
        ' リストの内容として配列をセット。
        Lbc(1).InitializeList arr, True, True
End Sub

' 全選択ボタン。
' ※ボタンを押すたび、全解除と切り替わる。
Private Sub AllSelectButton_Click()
    Select Case AllSelectButton.Caption
        Case "全選択"
            Lbc(1).SelectAll
            AllSelectButton.Caption = "全解除"
        Case "全解除"
            Lbc(1).UnselectAll
            AllSelectButton.Caption = "全選択"
    End Select
End Sub

' O型だけ全て選ぶボタン。
Private Sub OTypeSelectButton_Click()
    Lbc(1).FindAndSelectAll "O型", Tb.ListColumns("血液型").Index - 1
End Sub

' 選択中のものを非選択に、非選択中のものを選択するボタン。
Private Sub ReverseButton_Click()
    Lbc(1).ReverseSelection
End Sub

' 鳥取県民だけのリストにするボタン。
Private Sub TottoriButton_Click()
    Lbc(1).FindAndUpdateList "鳥取県", Tb.ListColumns("都道府県").Index - 1
End Sub

' リセットボタン。
Private Sub ResetButton_Click()
    Lbc(1).ResetList
    Lbc(2).TargetListBox.Clear
    
    TextBox1.Value = vbNullString
    TextBox2.Value = vbNullString
End Sub

' 正規表現を利用した絞り込み。
Private Sub TextBox1_Change()
    Lbc(1).ResetList
    If TextBox1.Value <> vbNullString Then
        Lbc(1).RegExpAndUpdateList TextBox1.Value
    End If
End Sub

' 名前の一致率表示。
Private Sub TextBox2_Change()
    Dim arr As Variant
        If TextBox2.Value <> vbNullString Then
            arr = Lbc(1).MatchRatioAll(TextBox2.Value, 1)
            Lbc(2).InitializeList arr, True, True
        Else
            Lbc(2).TargetListBox.Clear
        End If
End Sub

' 選択項目を元のリストボックスでも選択。
Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim SelectedIndex As Long
        If Lbc(2).SelectedCount <> 1 Then
            SelectedIndex = 1
        Else
            SelectedIndex = Lbc(2).SelectedValues(0, 0)
        End If
        
        Lbc(1).UnselectAll
        Lbc(1).TargetListBox.Selected(SelectedIndex) = True
        Lbc(1).TargetListBox.ListIndex = SelectedIndex
End Sub
確認結果

各ボタンなどの動作を確認した結果がこちら。
f:id:Infoment:20201014231642g:plain

一応、想定したとおりに動いてくれた。
ということで、今回のシリーズはここまで。

今後、何か機能拡張したら、都度こちらに追記することにします。

参考まで。