AccessのVBAでADO(Microsoft ActiveX Data Objects)を使用してLike演算子を使用したSQL文を実行してレコードセットを取得す場合、通常のクエリーでは前方一致や後方一致に"*"アスタリスクを使用しますが、ADOでは"*"ではなく、"%"(パーセント)記号を使用します。
忘れてたのでサンプルプログラムとともに覚書。
Where句にLike演算子を使用する際の違い
Accessの通常のクエリーでWhere句にLike演算子を使用した前方一致や後方一致の検索条件を指定する場合、SQL文は以下のようになります。
SELECT * FROM 社員 Where [備考] Like "*ダイビング*"
上記のSQLは、社員テーブルの備考フィールドに入力された値に"ダイビング"を含む、例えば"趣味はダイビングです。"のような文字列が入ったレコードだけを抽出するSQL文です。
"ダイビング"の前後に"*"を指定しているので、文章中のどこでも構わないので"ダイビング"という文字列が入っているという条件になります。
このSQL文をVBAでADOを使用してレコードセットを取得する場合、ADOでは前方一致、後方一致を示す記号が"*"ではなく"%"となるので以下のようにSQL文を変更する必要があります。
SELECT * FROM 社員 Where [備考] Like "%ダイビング%"
Accessの通常のクエリーと同じSQL文を使用してもレコードセットが取得できないので注意してください。
Like演算子を使用したVBAのサンプルプログラム
とりあえずADOを使用したVBAのサンプルプログラムを参考として記載しておきます。
サンプルプログラムの実行はAccessのサンプルデータベース"Northwind"を使用しています。
サンプルプログラムを実行する際は、"Microsoft ActiveX Data Objects"の参照設定が必要です。
Sub Sample()
Dim con As New ADODB.Connection, rec As New ADODB.Recordset
Dim srcSQL As String
srcSQL = "SELECT * FROM 社員 Where [備考] Like '%ダイビング%'"
Set con = CurrentProject.Connection
rec.Open srcSQL, con
Do Until rec.EOF
Debug.Print rec("姓") & " " & rec("名")
rec.MoveNext
Loop
End Sub
ADOを使用したLike演算子を使ったSQLの実行についてのまとめ
Like演算子を使用したSQLの実行は、しばらく作ることがなかったのでAccessの通常のクエリーとADOで使う記号が違うことをすっかり忘れていた。
VBAから実行しているSQL文を通常のクエリーに貼り付けた時にきちんとレコードが抽出されたので悩んでしまった。
DAO(Data Access Object)の場合は"*"でOKだったような...
こういうことがないようにするためのこのブログなのでしっかり覚書きしておきます。
ちなみにLike演算子を使用したSQLの実行はデータ量が多いとかなり時間がかかります。
SQL ServerやMySQLなどでは検索対象のフィールドにフルテキストインデックスを設定することでLike演算子を使用せずに高速に検索することができます。
データ量や使用頻度などを考慮してAccessではなくSQL ServerやMySQLへの移行を考慮したほうがいいかもしれません。
コメント
助かりました。ありがとうございます。
どういたしまして!記事が役に立って良かったです!