インターネットブラウザの検索テキストボックスのようにAccessのテキストボックスでも検索履歴を表示させたいと思い、この方法をやってみました。
サンプルを作りました。2022年10月16日、Ver.1.1になりました。以下、フォームなどで多少ダウンロードしたサンプルと異なる点があります。
下図のようにコンボボックスとコマンドボタンを配置します。コンボボックスにて文字列を入力して検索ボタンをクリックすると「T_検索履歴」テーブルに履歴が保存されていきます。
テーブル
テーブルにて「T_検索履歴」を作ります。
ID | オートナンバー型 |
検索履歴 | 文字列型 |
最初の図のコンボボックスの名前は「コンボ0」です。検索用コマンドボタンは「cmd_検索」です。
コンボボックスの【プロパティシート】を開き、【データ】タブの【値集合ソース】を次のようにします。「distinct」を使うことによって重複文字列をひとつにまとめてくれます。
select distinct T_検索履歴.検索履歴 from T_検索履歴
「検索用コマンドボタン」の【プロパティシート】を開き、【イベント】タブの【クリック】時に「コードビルダー」を選びます。
VBAコード
VBAのエディタが開きますので下記コードを記入します。コンボボックスの文字列が空の時はテーブルに記載しません。同じ文字列が存在した時も追加しないようにしました。
テーブル「T_検索履歴」の「検索履歴」フィールドに検索文字列がどんどん追加されていきます。
Option Compare Database
'***********************************
'テーブルの中身をクリア
'***********************************
Private Sub btn_clear_Click()
If MsgBox("レコードを削除してもよろしいですか?", vbYesNo) = vbYes Then
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM T_検索履歴"
コンボ0.Requery
コンボ0.Value = ""
MsgBox "削除しました"
Else
MsgBox "キャンセルされました"
End If
End Sub
Private Sub btn_検索_Click()
Dim txt As String
If IsNull(コンボ0) = True Then
Exit Sub
Else
'重複データなら検索履歴として追記しない
If Nz(DLookup("検索履歴", "T_検索履歴", "検索履歴 = '" & txt & "'"), "empty") = "empty" Then
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_検索履歴", dbOpenDynaset)
With rst
.AddNew
.Fields("検索履歴") = コンボ0.Value
.Update
.Close
Set rst = Nothing
End With
End If
End If
Me.コンボ0.Requery
End Sub