ADOでデータベースに接続し、Recordsetを使用してレコードを検索する記述 Recordsetで、指定のテーブルのなかで指定の条件でレコードを検索 FindメソッドとSeekメソッドでそれぞれ検索ができるが、書式や検索方法が異なるのでそれぞれ開設する パターン1:カレントプロジェクトの指定のテーブルの値を更新 Recordsetのオブジェクト変数.Find 条件式 , スキップする行数 , 検索方向 , 開始位置 ・ステートメント 条件式はひとつのみ、比較演算子・Like演算子を使用可能 カレントプロジェクトのデータベースに接続する場合の記述 ▼実行結果▼ パターン2:別のAccessファイルの指定のテーブルの値を更新 ・seekメソッド設定部分 ・ステートメント まずはインデックスを設定することが必須 カレントプロジェクトのデータベースに接続する場合の記述 ▼実行結果▼
今回の記述に関する前情報
何を行うか
削除対象はカレントレコード使えるメソッド
【Find】メソッドを使用して検索
Findメソッド利用時の書式
※検索方向 adSearchFoward / adSearchBackward
記述例における利用パーツ
→Do Loop / If
・メソッド
→Find / MoveNext / Open / Close
注意点
条件を満たすレコードにカレントレコードが移動する
検索方向をadOpenFowardOnlyにしている状態で検索方向をadSearchBackwardを使用するとエラーになる
nullを検索する場合には「Recordsetのオブジェクト変数.Find "フィールド名 = Null"」と記述する
【実践】指定のテーブルの指定のフィールドの値をFindメソッドで検索する記述例
テーブル「yubin_data_base」のフィールド「prefecture」が「ほっかいDo」のレコードを探し
そのレコードのフィールド「postcode」「city」の値をイミディエイトウィンドウに表示
▼取得対象テーブル「yubin_data_base」▼
▼記述例▼
Sub data_find()
Dim CNT As ADODB.connection
Dim RST As ADODB.Recordset
Set CNT = CurrentProject.connection
Set RST = New ADODB.Recordset
RST.Open "yubin_data_base", CNT, adOpenStatic
Do
RST.Find "prefecture='ほっかいDo'"
If Not RST.EOF Then
Debug.Print RST("postcode"), RST("city")
RST.MoveNext
Else
Exit Do
End If
Loop
RST.Close: CNT.Close
Set RST = Nothing: Set CNT = Nothing
End Sub
【Seek】メソッドを使用して検索
Seekメソッド利用時の書式
Recordsetのオブジェクト変数.Seek 検索対象の値 , 検索方法
※検索方法 adSeekFirstEQ / SeekLastEQ / SeekAfterEQ / SeekAfter / SeekBeforeEQ / SeekBefore
・index指定部分
Recordsetのオブジェクト変数.Index = インデックス名
記述例における利用パーツ
→If
・プロパティ
→Index
・メソッド
→Seek / Open / Close
注意点
RecordsetオブジェクトのOoenメソッドの最後にadCmdTableDirectを指定
※この方法でDoLoopステートメントを使用するのはやめたほうがいいらしい…検索したいときはもうFindメソッドだけ使用でいいのかな…?
▼adCmdTableDirectを使用する際には注意が必要▼
https://coconala.com/blogs/2747290/131941
【実践】指定のテーブルの指定のフィールドの値をSeekメソッドで検索する記述例
テーブル「KEN_ALL_ROME_sub」にて]
「ID」フィールドが「14」のレコードの「postcode」「prefecture」「city」フィールドの各値をイミディエイトウィンドウに表示
▼取得対象テーブル「KEN_ALL_ROME_sub」▼
▼記述例▼
Sub data_seek()
Dim CNT As ADODB.connection
Dim RST As ADODB.Recordset
Set CNT = New ADODB.connection
Set RST = New ADODB.Recordset
CNT.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\user\デスクトップ\tama-shi\ken_all\yubin_data\KEN_ALL.accdb"
RST.Open "KEN_ALL_ROME_sub", CNT, adOpenForwardOnly, adLockReadOnly, adCmdTableDirect
RST.Index = "ID"
RST.Seek 14, adSeekFirstEQ
If RST.EOF Then '指定したレコードがなければカレントレコードは最終レコードの後に移動する
Debug.Print "指定のレコードはありませんでした"
Else
Debug.Print RST("postcode"), RST("prefecture"), RST("city")
End If
End Sub