フォームであいまい検索を実現する設定の例

f:id:accs2014:20180527010621p:plain:right:w400

 フォーム上でweb検索のようなあいまい検索を行わせる設定例です。
 具体的には、このような帳票フォームのテキストボックスに入力された検索文字列から「氏名に検索文字列を含む」という条件のフィルタ文字列を生成し、適用するものとします。
 さらに1語のみを検索する例と、複数の語(2語以上)をAnd検索する例をみてみます。


1語のみを検索する例

f:id:accs2014:20180527015851p:plain:right:w600

 上記フォームのデザインビューです。
 一番上にあるテキストボックスが入力用のテキストボックスで、この名前を「検索文字列」とします。
 もう一つテキストボックスがあります(名前は「条件式」)が、これはフィルタ文字列を確認するための表示用です。

 そこでフォームモジュールに次のように入力します。

Option Compare Database

Private Sub 検索文字列_AfterUpdate()

Dim flt As String

flt = "氏名 Like '*" & Trim(Me.検索文字列) & "*'"
Me.条件式 = flt

Me.Filter = flt
Me.FilterOn = True

End Sub

 中ほどにある式により「氏名 Like '*〇〇〇*'」というフィルタ文字列が生成されますが、単純なだけあって1語しか検索語句を設定できません。2語以上の語句を空白で区切って入力しても全体が1つの語として認識されてしまいます。
 なお、語句の前後の余分な空白により検索がうまくいかないことのないようにTrim関数を用いていますが、考え方次第では不要かもしれません。


f:id:accs2014:20180527010615p:plain:right:w400

 検索の様子です。
 AfterUpdateイベントを使っていますのでテキストボックスへの入力が済んだところでフィルタが適用されます。


複数の語(2語以上)をAnd検索する例(BuildCriteria関数を利用)

f:id:accs2014:20180527015847p:plain:right:w600

 フォームは基本的に上記と同じものです(ただの色違い)が、ここでは2語以上の語句をAnd検索します。
 つまり、「空白で区切られた2語以上の語句をすべて含む」という条件でフィルタをかけます。

 ここではフォームモジュールに次のように入力します。

Option Compare Database

Private Sub 検索文字列_AfterUpdate()

Dim flt As String

flt = "*" & Replace(Replace(Trim(Nz(Me.検索文字列, "")), " ", "* And *"), " And **", "") & "*"
flt = BuildCriteria("氏名", 10, flt)
Me.条件式 = flt

Me.Filter = flt
Me.FilterOn = True

End Sub

 式は若干複雑になりますが、基本的には空白を「* And *」という文字列に変換することで検索文字列を複数の語句に分割し、And条件を加えています。
 ただし、空白が連続する場合「 And **」という余分な文字列が出ますのでこれをReplace関数で削っています。And検索ですのでこれが残っても検索結果には影響しませんが、Or検索に切り替える場合などに支障がありますのでこのようにしています。
 なお、これだけではフィルタ文字列は完成しませんので、最後にBuildCriteria関数を用いて生成しています。

 BuildCriteria関数は検索やフィルタの条件を生成する際の頼みの綱といえる存在です。詳しくは次の記事をご覧ください。
www.accessdbstudy.net


f:id:accs2014:20180527010607p:plain:right:w500

 検索の例です。
 もちろん3語でも4語でも検索できます。