たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_ADOの利用_レコード操作その6【Recordset】【Find】【Seek】レコードの検索

ADOでデータベースに接続し、Recordsetを使用してレコードを検索する記述

今回の記述に関する前情報

何を行うか

Recordsetで、指定のテーブルのなかで指定の条件でレコードを検索
削除対象はカレントレコード

使えるメソッド

FindメソッドとSeekメソッドでそれぞれ検索ができるが、書式や検索方法が異なるのでそれぞれ開設する

【Find】メソッドを使用して検索

パターン1:カレントプロジェクトの指定のテーブルの値を更新

Findメソッド利用時の書式

Recordsetのオブジェクト変数.Find 条件式 , スキップする行数 , 検索方向 , 開始位置
※検索方向 adSearchFoward / adSearchBackward

記述例における利用パーツ

ステートメント
  →Do Loop / If
・メソッド
  →Find / MoveNext / Open / Close

注意点

条件式はひとつのみ、比較演算子・Like演算子を使用可能
条件を満たすレコードにカレントレコードが移動する
検索方向を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】メソッドを使用して検索

パターン2:別のAccessファイルの指定のテーブルの値を更新

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

▼実行結果▼