一致率をスクロールバーで動かしてみる(本棚ツールの改修)

昨日は以前作成した本棚ツールでの書籍名検索について、レーベンシュタイン距離を用いた一致率で絞り込みを行ってみた。
infoment.hatenablog.com

上記では「50%以上を表示させる」という設定にした。しかし、この「50」という数字がマクロ内に記述されているため、ユーザー側で変更しにくい。

ということで今回は、ユーザーによる「絞り込みの閾(しきい)値*1変更」に挑戦する。
f:id:Infoment:20181119214924p:plain

閾値の変更に、今回は「スクロールバー」を用いることにした。
f:id:Infoment:20181119215204p:plain
スクロールバーの右隣には、一致率を表示するためのラベルも追加した。

ユーザーフォーム(BookShelfForm)

まずはユーザーフォームの初期化で、以下を設定する。

  1. スクロールバーの最小値:0
  2. スクロールバーの最大値:100
  3. スクロールバーの無効化(初期化時点で一致率未計算のため)
  4. 一致率のラベル初期値セット。
Private Sub UserForm_Initialize()
    Call InitUserform
    Call SetBookShelfListBox
    ReDim BookList(1 To UBound(Books), 1 To 3)
    
    ' 今回追加
    ScrollBar1.Min = 0
    ScrollBar1.Max = 100
    ScrollBar1.Enabled = False
    MatchRatioLabel = "一致率:0%"
End Sub

テキストボックスの値変更に伴うイベントでは、昨日のように、いきなり一致率で選別するのではなく、まず全て配列内に格納する。
つづいで、スクロールバーの値を変更する。絞り込みは、スクロールバーの値変更イベントで行う。

Private Sub TextBox1_Change()
    Dim str1  As String
        str1 = TextBox1.Value
    Dim str2 As String
    Dim i As Long
    Dim j As Long
        j = j + 1
    Dim MatchRatio As Long
        For i = 1 To UBound(Books)
            str2 = Books(i).書籍名称
            MatchRatio = Levenshtein3(str1, str2)
            BookList(i, 1) = str2
            BookList(i, 2) = i
            BookList(i, 3) = MatchRatio
        Next
        ScrollBar1.Enabled = True
        ScrollBar1.Value = 70
End Sub
Private Sub ScrollBar1_Change()
    Dim TempList As Variant
    ReDim TempList(1 To UBound(Books), 1 To 3)
    
    Dim i As Long
    Dim j As Long
        j = 1
        For i = 1 To UBound(Books)
            If BookList(i, 3) >= ScrollBar1.Value Then
                TempList(j, 1) = BookList(i, 1)
                TempList(j, 2) = BookList(i, 2)
                TempList(j, 3) = BookList(i, 3)
                j = j + 1
            End If
        Next
        
    Dim SQC As SeaquenceClass
    Set SQC = New SeaquenceClass
        TempList = SQC.SpecialRedim(TempList, j - 1)

        ListBox1.Clear
        ListBox1.List = TempList
        MatchRatioLabel = "一致率:" & ScrollBar1.Value & "%"
End Sub

なお、上記に登場する「SpecialRedim」については、下記を参照されたし。
infoment.hatenablog.com


これで、まず最初に70%の閾値で絞り込みが行われ、更にスクロールバーで閾値の上下が行えるようになった。
f:id:Infoment:20181119221011g:plain

だいぶん、良い感じになってきた。だが、まだ問題が残っている。たとえば、絞り込んだ最初の結果が全て70%未満だった場合、何も表示されない点だ。この場合、配列の中身が無いのでエラーになってしまう。

明日は、この辺りの改良に挑戦です。

参考まで。

*1:境目となる値のこと