2.6 レコードセットの操作/検索
レコードセットオブジェクト内の特定のレコードを検索する方法です。

条件にマッチする先頭のレコードへジャンプ(読み込み)したいときは、レコードセットオブジェクトのFindFirstというメソッド、条件にマッチする最終のレコードへジャンプ(読み込み)したいときは、レコードセットオブジェクトのFindLastというメソッドを実行します。

ただし、条件にマッチするレコードが1件しか無いときは、どちらを使っても結果は同じです。
FindFirstの使用例
FindFirstの使用例です。検索条件は、フィールド名=値の形式で指定します。たとえば、フィールド「漢字氏名」が古畑忍三郎のレコードを検索するときは次の通りです。

daoRS.FindFirst "漢字氏名 = '古畑忍三郎'"
 ※FindFirstの検索条件で文字列を指定するときは、文字列をで囲みます。

また、AndOrを用いて複数のフィールドを指定することができ、例えばフィールド「性別」が1で、フィールド「関係」が2のレコードを検索したいときは次の通りです。

daoRS.FindFirst "性別 = 1 and 関係 = 2"

条件にマッチするレコードの有無は、NoMatchプロパティで参照でき、TrueヒットするレコードなしFalseヒットするレコードありです。

以下の例では、「住所録テーブル」というテーブルをオープンした後、FindFirstメソッドを使い、条件にヒットする先頭のレコードへカーソルを移動(読み込み)しています。

Sub prcFindFirst2000()

    'Access VBA Tips
    '2.6 レコードセットの操作/検索
    'Access2000以降での手順

    Dim daoDB As DAO.Database
    Dim daoRS As DAO.Recordset

    'データベースのオープン(データベースオブジェクトの作成)
    Set daoDB = CurrentDb

    'テーブルのオープン(レコードセットの作成)
    Set daoRS = daoDB.OpenRecordset("住所録テーブル", dbOpenDynaset)

    '条件にヒットする先頭レコードへカーソルを移動します
    daoRS.FindFirst "漢字氏名 = '古畑任三郎'"

    '条件にヒットするレコード有無のチェック
    If daoRS.NoMatch = False Then
       '条件にヒットするレコードがあったときは
       'イミディエイトウィンドウへカナ氏名を表示します
       Debug.Print daoRS("カナ氏名")
    Else
       '条件にヒットするレコードがなかったときは
       'イミディエイトウィンドウへ「???」を表示します
       Debug.Print "???"
    End If

    'テーブルのクローズ
    daoRS.Close

    'データベースのクローズ
    daoDB.Close

End Sub
 ※Access2000以降の場合。ただし、DAOを使うときは参照設定が必要です。



Sub prcMoveFirst97()

    'Access VBA Tips
    '2.6 レコードセットの操作/検索
    'Access97までの手順

    Dim daoDB As Database
    Dim daoRS As Recordset

    'データベースのオープン(データベースオブジェクトの作成)
    Set daoDB = DBEngine.Workspaces(0).Databases(0)

    'テーブルのオープン(レコードセットの作成)
    Set daoRS = daoDB.OpenRecordset("住所録テーブル", DB_OPEN_DYNASET)

    '条件にヒットする先頭レコードへカーソルを移動します
    daoRS.FindFirst "漢字氏名 = '古畑任三郎'"

    '条件にヒットするレコード有無のチェック
    If daoRS.NoMatch = False Then
       '条件にヒットするレコードがあったときは
       'イミディエイトウィンドウへカナ氏名を表示します
       Debug.Print daoRS("カナ氏名")
    Else
       '条件にヒットするレコードがなかったときは
       'イミディエイトウィンドウへ「???」を表示します
       Debug.Print "???"
    End If

    'テーブルのクローズ
    daoRS.Close

    'データベースのクローズ
    daoDB.Close

End Sub
 ※Access97までの場合。
FindLastの使用例
FindLastの使用例です。検索条件の指定やヒットするレコードの有無はメソッドと同様です。

以下の例では、「住所録テーブル」というテーブルをオープンした後、FindLastメソッドを使い、条件にヒットする最後のレコードへカーソルを移動(読み込み)しています。

Sub prcFindLast2000()

    'Access VBA Tips
    '2.5 レコードセットの操作/先頭と最後
    'Access2000以降での手順

    Dim daoDB As DAO.Database
    Dim daoRS As DAO.Recordset

    'データベースのオープン(データベースオブジェクトの作成)
    Set daoDB = CurrentDb

    'テーブルのオープン(レコードセットの作成)
    Set daoRS = daoDB.OpenRecordset("住所録テーブル", dbOpenDynaset)

    '条件にヒットする最終レコードへカーソルを移動します
    daoRS.FindLast "漢字氏名 = '古畑任三郎'"

    '条件にヒットするレコード有無のチェック
    If daoRS.NoMatch = False Then
       '条件にヒットするレコードがあったときは
       'イミディエイトウィンドウへカナ氏名を表示します
       Debug.Print daoRS("カナ氏名")
    Else
       '条件にヒットするレコードがなかったときは
       'イミディエイトウィンドウへ「???」を表示します
       Debug.Print "???"
    End If

    'テーブルのクローズ
    daoRS.Close

    'データベースのクローズ
    daoDB.Close

End Sub
 ※Access2000以降の場合。ただし、DAOを使うときは参照設定が必要です。



Sub prcFindLast97()

    'Access VBA Tips
    '2.5 レコードセットの操作/先頭と最後
    'Access97までの手順

    Dim daoDB As Database
    Dim daoRS As Recordset

    'データベースのオープン(データベースオブジェクトの作成)
    Set daoDB = DBEngine.Workspaces(0).Databases(0)

    'テーブルのオープン(レコードセットの作成)
    Set daoRS = daoDB.OpenRecordset("住所録テーブル", DB_OPEN_DYNASET)

    '条件にヒットする最終レコードへカーソルを移動します
    daoRS.FindLast "漢字氏名 = '古畑任三郎'"

    '条件にヒットするレコード有無のチェック
    If daoRS.NoMatch = False Then
       '条件にヒットするレコードがあったときは
       'イミディエイトウィンドウへカナ氏名を表示します
       Debug.Print daoRS("カナ氏名")
    Else
       '条件にヒットするレコードがなかったときは
       'イミディエイトウィンドウへ「???」を表示します
       Debug.Print "???"
    End If

    'テーブルのクローズ
    daoRS.Close

    'データベースのクローズ
    daoDB.Close

End Sub
 ※Access97までの場合。
Copyright(C) 1999-2006 結城圭介。 All rights reserved