トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)
レコードを検索する(Findメソッド)
レコードを検索する時は、Findメソッドを使用して、指定した条件に一致するレコードを見つけ出します。しかし、カレントレコードに対する操作は全く行わないので、見つけ出すことだけになります。また、複数のレコードを求めるためにはDo~Loopステートメントを使用します。
Findメソッドを呼び出す前には、Move系メソッドなどで行を特定しておく必要があります。該当レコードが見つからなかった場合は、RecordsetオブジェクトのBOF、またはEOFが未定義の状態になります。該当レコードが見つかったら、それがカレントレコードになります。
◆ Findメソッド
【書式】
Recordsetオブジェクト.Find 検索条件,スキップロウ,検索方向,スタート
- 検索条件:検索に使用するフィールド、比較演算子、文字列式など
- スキップロウ:検索を開始するカレント行またはStartブックマークからの行のオフセットを指定する長整数型の値。(既定値は0で、カレント行から検索が開始)
- 検索方向:adSerchForwardは、検索に成功しなかった時、Recordsetの終わりで停止。adSerchBackwardは、検索に成功しない時、Recordsetの先頭で停止。
- スタート:検索の開始位置として使用するバリアント型のブックマークを指定
《 記述例 》
テーブル「T_売上」の商品名を基に検索してレコードを表示するには、以下のように記述します。
Sub レコードの検索1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bm As Variant Dim mySQL As String Dim strData As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic strData = InputBox("検索する商品名を入力しなさい。") strData = "商品名='" & strData & "'" rs.Find strData, 0, adSearchForward If rs.EOF Then MsgBox "該当するレコードが見つかりませんでした" Else MsgBox "商品名:" & rs!商品名 & "の金額: \" & Format(rs!金額, "#,##0") End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
まず、検索する商品名の入力を促す入力ボックスが表示されます。任意の商品名を入力します。

検索したい商品名の金額が表示されるメッセージが表示されます。

《 記述例 》
同じ商品名が複数存在した場合、すべてを表示させるためには、Do~Loopステートメントを使用して、売上日、商品名、金額を表示させるには次のように記述します。
Sub レコードの検索2() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bm As Variant Dim mySQL As String Dim strData As String Dim strBun As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic strData = InputBox("検索する商品名を入力しなさい。") strData = "商品名='" & strData & "'" rs.Find strData, 0, adSearchForward Do Until rs.EOF If rs.EOF Then MsgBox "該当するレコードが見つかりませんでした" Else strBun = strBun & vbNewLine & "売上日:" & rs!売上日 strBun = strBun & " 商品名:" & rs!商品名 strBun = strBun & " 金額: \" & Format(rs!金額, "#,##0") rs.Find strData, adSearchForward End If Loop MsgBox "検索されたレコードは" & vbNewLine & strBun rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
複数存在する「HDD-1T」と入力する。[OK]ボタンをクリックします。

検索されたレコードがすべてメッセージ表示されます。同じ商品名なので、金額は同じですが、売上日は異なることが分かります。

DAOとADOの検索Findメソッドの違い
DAOには、FindFirst、FindLast、FindNext、FindPreviousの4つの検索メソッドがありますが、ADOには1つのFindメソッドだけしかありません。検索は、常に現在のレコードから開始され、Findメソッドは、検索方向と検索を開始する現在レコードからオフセット(SkipRows)を指定できる引数を持っています。
DAOメソッド | ADO のFindのSkipRows | ADOの検索方向 |
---|---|---|
FindFirst | 0 | adSearchForward |
FindLast | 0 | adSearchBackward |
FindNext | 1 | adSearchForward |
FindPrevious | 1 | adSearchBackward |
レコードを検索する(Seekメソッド)
Seekメソッドを使用して、指定した条件に一致するレコードを検索できます。ただし、Seekメソッドを使用する場合は、検索するテーブルフィールドにインデックスを設定しておく必要があります。
さらに、RecordsetオブジェクトのOpenメソッドの引数Optionに「adCmdTabledirect」を指定する必要もあります。
◆ Seekメソッド
【書式】
Recordsetオブジェクト.Seek キー値,オプション
- キー値:インデックスの各列と照合するための値を指定
- オプション:インデックスの各列とそれに対応するKeyvaluesを比較する時の比較の種類をSeekEnum値で指定
SeekEnum値
定数 | 値 | 説明 |
adSeekFirstEQ | 1 | キー値と一致する最初のキーを検索 |
adSeekLastEQ | 2 | キー値と一致する最後のキーを検索 |
adSeekAfterEQ | 4 | キー値と一致するキー、またはその直後のキーのどちらかを検索 |
adSeekAfter | 8 | キー値と一致するキーの直後のキーを検索 |
adSeekBeforeEQ | 16 | キー値と一致するキー、またはその直前のキーのどちらかを検索 |
adSeekBefore | 32 | キー値と一致するキーの直前のキーを検索 |
Seekメソッドで検索する場合は、あらかじめテーブルのフィールドにインデックスを設定する必要があります。ここでは、「T_売上」テーブルに「No」フィールドを追加して[データ型]は「オートナンバー型」を設定して自動的にインデックスを設定しておきます。

《 記述例 》
[No]フィールドでレコードの検索をするには、以下のように記述します。
Sub レコードの検索3() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bm As Variant Dim mySQL As String Dim strData As String Dim strBun As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect strData = InputBox("商品Noを入力しなさい。") If strData = "" Then Exit Sub rs.Index = "primarykey" rs.Seek strData, adSeekFirstEQ If rs.EOF Then MsgBox "該当するレコードが見つかりませんでした" Else strBun = strBun & vbNewLine & "No:" & rs!No strBun = strBun & " 商品名:" & rs!商品名 strBun = strBun & " 金額: \" & Format(rs!金額, "#,##0") End If MsgBox "検索されたレコードは" & vbNewLine & strBun rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作を確認すると、まず[商品NO]の入力を促す入力ボックスが表示されます。任意のNOを入力して、[OK]ボタンをクリックします。

指定したNOのレコードがメッセージとして表示されます。
