トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)

VBA_Access

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のレコードがメッセージとして表示されます。