ADOのRecordset.Filterプロパティについてご紹介しました。
全レコードを含んだRecordsetを取得しておいて、あとからフィルタリングするという考えだったわけですが、はじめからフィルタリングした状態のRecordsetを取得する、という考え方もあります。
今回はそんな考えのプロシージャをご紹介します。
Recordset.Openメソッドの引数・Sourceに指定するSQL文で、
レコードを絞り込んだRecordsetを取得するプロシージャです。
ADODBでRecordset取得時にSQL文でレコードを絞り込むサンプルプロシージャ
「ID」「名前」「住所」というフィールドを持った、「tbl_住所録」というテーブルが存在するAccess上で、以下のプロシージャを実行すると、名前に「藤」という文字を含むレコードが、イミディエイトウィンドウに出力されます。
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Set cnn = CurrentProject.Connection
Set rst = New ADODB.Recordset
sql = "SELECT ID, 名前, 住所 FROM tbl_住所録 "
sql = sql & "WHERE 名前 Like '%藤%' "
rst.Open _
Source:=sql, _
ActiveConnection:=cnn
Do Until rst.EOF
Debug.Print rst!ID, rst!名前, rst!住所
rst.MoveNext
Loop
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
Recordset.Filterプロパティを利用する場合は、
sql = "SELECT ID, 名前, 住所 FROM tbl_住所録 "
rst.Open _
Source:=sql, _
ActiveConnection:=cnn
rst.Filter = "名前 Like '%藤%' "
でしたが、今回は、
sql = "SELECT ID, 名前, 住所 FROM tbl_住所録 "
sql = sql & "WHERE 名前 Like '%藤%' "
rst.Open _
Source:=sql, _
ActiveConnection:=cnn
と、RecordsetをOpenする際のSQL文にWHERE句を含んでいます。
RecordsetオブジェクトのFilteプロパティを利用する場合、
rst.Filter = "名前 Like '%藤%' "
の記述は、ワイルドカードとしてAccessユーザーにはお馴染みの「*」を使った、
rst.Filter = "名前 Like '*藤*' "
でもOKでしたが、今回の方法では、
sql = sql & "WHERE 名前 Like '*藤*' "
とすると「*」はワイルドカードとして見なされず、適切なレコードを取得できませんので注意が必要です。
ADODBでRecordset取得時に変数を使ってSQL文でレコードを絞り込むサンプルプロシージャ
フィルターする条件の文字を変数に格納しておいてから指定する場合、以下のようなプロシージャです。
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim flt As String
Set cnn = CurrentProject.Connection
Set rst = New ADODB.Recordset
flt = InputBox("検索する名前を入力してください。")
sql = "SELECT ID, 名前 FROM tbl_住所録 "
sql = sql & "WHERE 名前 LIKE '%" & flt & "%' "
rst.Open _
Source:=sql, _
ActiveConnection:=cnn
Do Until rst.EOF
Debug.Print rst!ID, rst!名前
rst.MoveNext
Loop
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
WHERE句を作る、
sql = sql & "WHERE 名前 LIKE '%" & flt & "%' "
の部分がポイントです。
Home » ADO(ActiveX Data Objects)の使い方 » ADOのSQL文でレコードを絞り込む