MS Access Tips/Sample and VBA and Blog customize etc...

AccessでWEB検索のように曖昧検索したい

WEB検索のように複数キーワードを空白で区切って入力して、And条件で曖昧検索したい。

これもよくみかける質問ですね。

方法もWEB検索すればいろいろ見つかると思いますが、AC2000以降なら、Replace関数とBuildCriteria関数を使うとシンプルなコードで実現できます。

AccessでWEB検索のように曖昧検索

難易度:

仕様

帳票フォームでフォームヘッダーに検索語入力用のテキストボックス、検索実行用のコマンドボタンが配置してあり、 テキストボックスに検索語をスペース区切りで入力して、コマンドボタンをクリックすると、帳票フォームのデータが絞り込まれる(抽出される)という仕様とします。

テキストボックスの名前を、txtFind
コマンドボタンの名前を、cmdFind
抽出対象のフィールド名を、フィールド1
とします。

コード

コマンドボタンのクリック時のイベントプロシージャを下記のように記述します。

注: Microsoft DAO *.* Object Library に参照設定が必要

別フォーム(フォーム1)で開きたい場合は、6、7行目(ハイライト部分)を下記のように変更します。

解説

BuildCriteria関数はAC2000から追加された関数で、クエリのデザインビューの抽出欄に入力した式をWHERE句条件式に変換するAccessの機能を関数にしたものと思われます。

例えば、

BuildCriteria("フィールド1", dbText, "Null Or ''")
と記述すると、
フィールド1 Is Null Or フィールド1=''
と適切に変換してくれます。

複数キーワードで曖昧抽出したいときは、クエリの抽出条件欄には

*キーワード1* And *キーワード2* And *キーワード3*
というように入力します。そこで、空白区切りの検索語をReplace関数でこの式になるように変換します。その式をBuildCriteria関数で変換すると、
フィールド1 Like "*キーワード1*" And フィールド1 Like "*キーワード2*" And フィールド1 Like "*キーワード3*"
という適切な条件式に変換されます。

拍手する

10 Comments

枝村あゆみ says..."抽出の解除"

ACCESSでの曖昧検索したいを拝見させていただきました。
すごくわかりやすく、参考にさせていただきました。
もう一点教えていただきたいのですが、
この抽出を解除するにはどうしたらよいのでしょうか?

ご返信いただけますと大変助かります。
どうぞ宜しくお願い致します。

2011.05.19 17:50 | URL | #- [edit]
hatena says..."re:抽出の解除"

> この抽出を解除するにはどうしたらよいのでしょうか?

下記のコードで解除できます。

Me.Filter = ""
Me.FilterOn = False

2011.05.19 19:05 | URL | #5uE6dEgY [edit]
まっぷっぷ says..."うまくできません"

今回、こちらでお世話になっております。

どこが悪いのか・・・ 記述通りにやっているつもりなのですが
うまくできません。

テーブルはフィールド1だけの

 1 あ
 2 い
 3 う
 4 え
 5 お
 6 あい
 7 うえお


というものです。

これをクエリで抽出条件のところに、フォームのテキストボックス
の文字で検索されるよう[Forms]![F_41]![txtFind]としています。
(フォーム名:F_41、テキストボックス:txtfind)

テキストボックスに【あ い】と入れて1,2,6行目が抽出されるよう
したいのですが、抽出できません。【あ】だけなど1文字なら成功します。

strFilter = "*" & Replace(Me.txtFind, " ", "* OR *") & "*"
に変えてみたりもしたのですが・・・

どこがわるいでしょうか?
お時間ございましたら、ご返信いただけないでしょうか?

2012.03.21 16:46 | URL | #oyV.6EWY [edit]
hatena says..."re:うまくできません"

それでいいはずなんですが?
変ですね。

下記のようにデバッグ用のコードを挿入して、コマンドボタンをクリック後、
イミディエイトウィンドウ(Ctrl+Gで表示されます)に表示される
式をコピーしてここに貼り付けてもらえますか。


Private Sub cmdFind_Click()
Dim strFilter As String

  strFilter = "*" & Replace(Me.txtFind, " ", "* Or *") & "*"
  strFilter = BuildCriteria("フィールド1", dbText, strFilter)
  Debug.Print strFilter '←デバッグ用コード
  Me.Filter = strFilter
  Me.FilterOn = True
End Sub

2012.03.21 16:56 | URL | #5uE6dEgY [edit]
まっぷっぷ says...">hatenaさん"

早速のお返事感謝です。
イミディエイトウィンドウには、下記の通り表示されました。

フィールド1 Like "*あ*" Or フィールド1 Like "*い*"

宜しくお願いいたします。

2012.03.21 17:05 | URL | #oyV.6EWY [edit]
hatena says..."re:まっぷっぷ さん"

肝心なところを見落としてました。

> これをクエリで抽出条件のところに、フォームのテキストボックス
> の文字で検索されるよう[Forms]![F_41]![txtFind]としています。

これは、フォーム「F_41」のレコードソースのクエリですよね。
この抽出条件は削除してください。

Filterプロパティで抽出するので、クエリには抽出条件は不要です。

2012.03.21 17:21 | URL | #5uE6dEgY [edit]
まっぷっぷ says...">hatenaさん"

ありがとうございます! できました!!
なるほど、できないのはこんな理由だったのですね。

ずいぶん悩んでいたのですが、すごくうれしいです。
質問してよかった。
本当にありがとうございます。

2012.03.21 17:29 | URL | #oyV.6EWY [edit]
まっぷっぷ says...">hatenaさん"

たびたびすみません。
一つ問題が・・・

F_41を開くと、元になっているクエリの内容が全部表示されて
しまいます。
フォームを開いた時は、何も表示されていない状態で
テキストボックスに入力して初めて、結果が表示されるように
するには、どうしたらよいでしょうか?

すみません・・

2012.03.21 17:49 | URL | #oyV.6EWY [edit]
hatena says..."フォームを開いた時は0件にするには"

フォームの開くときのイベントプロシージャに下記のコードを記述してください。

  Me.Filter = "False"
  Me.FilterOn = True

2012.03.21 18:22 | URL | #5uE6dEgY [edit]
まっぷっぷ says...">フォームを開いた時は0件にするには"

ありがとうございます。

コマンドボタンのコードに何か追加すればいいのかと
思っていたのですが、全く別でしたね。
すみません。

おかげさまで、問題なく開くことができました。
ありがとうございます!!

2012.03.21 18:34 | URL | #oyV.6EWY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/96-eaad0b42
該当の記事は見つかりませんでした。