一致率をスクロールバーで動かしてみる(本棚ツールの改修)
昨日は以前作成した本棚ツールでの書籍名検索について、レーベンシュタイン距離を用いた一致率で絞り込みを行ってみた。
infoment.hatenablog.com
上記では「50%以上を表示させる」という設定にした。しかし、この「50」という数字がマクロ内に記述されているため、ユーザー側で変更しにくい。
ということで今回は、ユーザーによる「絞り込みの閾(しきい)値*1変更」に挑戦する。
閾値の変更に、今回は「スクロールバー」を用いることにした。
スクロールバーの右隣には、一致率を表示するためのラベルも追加した。
ユーザーフォーム(BookShelfForm)
まずはユーザーフォームの初期化で、以下を設定する。
- スクロールバーの最小値:0
- スクロールバーの最大値:100
- スクロールバーの無効化(初期化時点で一致率未計算のため)
- 一致率のラベル初期値セット。
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%の閾値で絞り込みが行われ、更にスクロールバーで閾値の上下が行えるようになった。
だいぶん、良い感じになってきた。だが、まだ問題が残っている。たとえば、絞り込んだ最初の結果が全て70%未満だった場合、何も表示されない点だ。この場合、配列の中身が無いのでエラーになってしまう。
明日は、この辺りの改良に挑戦です。
参考まで。
*1:境目となる値のこと