Access

検索履歴つきテキストボックスをコンボボックスで実現(Access)(サンプル付き)

2019年11月10日

インターネットブラウザの検索テキストボックスのようにAccessのテキストボックスでも検索履歴を表示させたいと思い、この方法をやってみました。

サンプルを作りました。2022年10月16日、Ver.1.1になりました。以下、フォームなどで多少ダウンロードしたサンプルと異なる点があります。

DOWNLOAD 

検索履歴つきテキストボックスをコンボボックスで実現(Access)(サンプル付き)


下図のようにコンボボックスとコマンドボタンを配置します。コンボボックスにて文字列を入力して検索ボタンをクリックすると「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

-Access
-, ,