###前提・実現したいこと
TextBoxとListViewを組み合わせて、1文字入力される度に検索結果を更新する検索フォームを作りたいと思っています。
Googleインスタント検索と同じような挙動を期待して、ひとまず動くものを作りました。
ソースを動かすためには下記要件を満たして頂く必要があります。
- Sheet1のA列からG列の2行目以降に検索対象となるデータを入力
- TextBoxをオブジェクト名TextBox1として準備
- ListViewをオブジェクト名ListView1として準備
###発生している問題・エラーメッセージ
TextBoxに文字を入力していくと期待通りの動作をし、速度も実用上問題のないレベルです。
しかし、BackSpaceを押してTextBoxに入力済みの検索ワードを削除していくと、途端に検索に掛かる時間が長くなります。
なぜ検索ワードを消した際の検索が遅くなってしまうのか、どうすれば速く出来るのかアドバイスをお願いします。
同じような事をもっとスマートに実現する方法があればそれについても教えて頂きたく思います。
宜しくお願いします。
###速度計測結果
実際に15,000件弱のデータを対象に検索を実行し、実行時間を計測しました。(単位:秒)
TextBoxに文字を入力していく場合(検索ワードを4文字入力した場合の計測結果)
データの検索: 0.1
ListViewへの反映: 0.32
データの検索: 0.09
ListViewへの反映: 0.16
データの検索: 0.08
ListViewへの反映: 0.04
データの検索: 0.08
ListViewへの反映: 0
TextBoxの文字を1文字ずつ削除していく場合(入力済みの4文字を削除していく場合の計測結果)
データの検索: 1.52
ListViewへの反映: 0
データの検索: 1.52
ListViewへの反映: 0.05
データの検索: 1.55
ListViewへの反映: 0.16
データの検索: 1.61
ListViewへの反映: 0.33
###該当のソースコード
VBA
1'郵便番号データダウンロードサービスで入手可能な郵便番号データを利用する 2Private Sub UserForm_Initialize() 3 With ListView1 4 .View = lvwReport 5 .HideSelection = False 6 .FullRowSelect = True 7 .ColumnHeaders.Add , "_X0401-X0402", "全国地方公共団体コード", 120 8 .ColumnHeaders.Add , "_OldPostalCode", "旧郵便番号", 120 9 .ColumnHeaders.Add , "_PostalCode", "郵便番号", 80 10 .ColumnHeaders.Add , "_Prefectures", "都道府県名", 80 11 End With 12End Sub 13 14 15Private Sub TextBox1_Change() 16 '-------------------- ListViewのクリア ココカラ -------------------- 17 ListView1.ListItems.Clear 18 '-------------------- ListViewのクリア ココマデ -------------------- 19 20 21 '-------------------- データの検索 ココカラ -------------------- 22 Dim t As Single 23 Dim ws As Worksheet 24 t = Timer() 25 Set ws = Worksheets("Sheet1") 26 27 With ws 28 Dim lastRow As Long 29 Dim dataSet As Variant 30 lastRow = .Cells(.Rows.count, 1).End(xlUp).Row 31 dataSet = .Range(.Cells(1, 1), .Cells(lastRow, 4)) 32 33 Dim i As Long 34 For i = 2 To lastRow 35 If dataSet(i, 3) Like "*" & TextBox1 & "*" Then 36 With ListView1.ListItems.Add 37 .Text = dataSet(i, 1) '全国地方公共団体コード 38 .SubItems(1) = dataSet(i, 2) '旧郵便番号 39 .SubItems(2) = dataSet(i, 3) '郵便番号 40 .SubItems(3) = dataSet(i, 4) '都道府県名 41 End With 42 End If 43 Next i 44 End With 45 Debug.Print "データの検索: " & Round(Timer() - t, 2) 46 '-------------------- データの検索 ココマデ -------------------- 47End Sub
###補足情報(言語/FW/ツール等のバージョンなど)
Excel 2016 (office 365)
回答3件
あなたの回答
tips
プレビュー