Recordset.FindNext メソッド (DAO)

適用先: Access 2013、Office 2013

ダイナセット タイプまたはスナップショット タイプの Recordset オブジェクトで、指定された条件を満たす次のレコードを検索し、そのレコードをカレント レコードにします (Microsoft Access ワークスペースのみ)。

構文

。FindNext(Criteria)

expression: Recordset オブジェクトを表す変数。

パラメーター

名前

必須かどうか

データ型

説明

基準

必須

String

レコードの検索に使用する文字列です。 SQL ステートメントの WHERE 句に似ていますが、WHERE という語は付けません。

注釈

特定の条件を満たすレコードだけでなく、すべてのレコードを検索対象とする場合は、 Move メソッドを使用してレコード間を移動します。 テーブル タイプの Recordset でレコードを検索するには、 Seek メソッドを使用します。

条件を満たすレコードが検出されない場合、カレント レコードを参照するポインターは不明となり、 NoMatch プロパティが True に設定されます。 recordset に条件を満たすレコードが複数含まれている場合の検出対象は、 FindFirst では最初に出現したもの、 FindNext では次に出現したもの、などとなります。

次の表に、各 Find メソッドの検索開始位置と検索方向を示します。

Find メソッド

検索開始位置

検索方向

FindFirst

レコードセットの先頭

レコードセットの末尾

FindLast

レコードセットの末尾

レコードセットの先頭

FindNext

現在のレコード

レコードセットの末尾

FindPrevious

カレント レコード

レコードセットの先頭

ただし、いずれかの Find メソッドを使用した場合と、 Move メソッドを使用した場合の結果は同じではなく、後者は、条件を指定せずに、最初のレコード、最後のレコード、次のレコード、または前のレコードをカレント レコードにするだけです。 Find 操作の後に Move 操作を使用する場合もあります。

NoMatch プロパティの値を必ず確認して、Find 操作が成功したかどうか調べてください。 検索が成功した場合、 NoMatchFalse です。 失敗した場合、 NoMatchTrue で、カレント レコードは未定義となります。 この場合は、カレント レコードを参照するポインターを有効なレコードに戻す必要があります。

Find メソッドを Microsoft Access データベース エンジンに接続された ODBC アクセスのレコードセットで使用すると、効率が悪い場合があります。 特に大きなレコードセットを操作するときは、criteria の表現を変更すると、より迅速に特定のレコードを検出できる場合があります。

ODBCDirect ワークスペースでは、 Find メソッドと Seek メソッドはどの種類の Recordset オブジェクトでも使用できません。これは、ODBC 接続を介した Find または Seek の実行がネットワーク上であまり効率的ではないためです。 代わりに、返されるレコードを Find メソッドまたは Seek メソッドで使用する条件を満たすレコードのみに制限する適切な WHERE 句を使用して、クエリ (つまり、OpenRecordset メソッドへのソース引数を使用) を設計する必要があります。

Microsoft Access データベース エンジンに接続している ODBC データベースでダイナセット タイプの大きな v オブジェクトを操作している場合、 Find メソッド、 Sort プロパティ、または Filter プロパティを使用すると、処理速度が遅いことがあります。 パフォーマンスを向上するには、カスタマイズした ORDER BY 句または WHERE 句のある SQL クエリ、パラメーター クエリ、またはインデックスが作成されている特定のレコードを取得する QueryDef オブジェクトを使用します。

日本語版の Microsoft Access データベース エンジンを使用する場合であっても、日付が格納されたフィールドを検索するときは米国の日付形式 (month-day-year) を使用することが推奨され、使用しないとデータが検出されないことがあります。 Visual Basic の Format 関数を使用して、日付を変換してください。 例:

    rstEmployees.FindFirst "HireDate > #" _ 
        & Format(mydate, 'm-d-yy' ) & "#" 

抽出条件が文字列と非整数値を連結したもので構成され、かつシステム パラメーターでコンマなどのピリオド以外の小数点の記号が使用されている場合 (たとえば、strSQL = "PRICE > " & lngPrice と lngPrice = 125,50)、メソッドを呼び出そうとするとエラーが発生します。 連結時に数値がシステムの既定の小数点の記号を使って文字列に変換されますが、Microsoft Access の SQL で小数点の記号として使用できるのはピリオドのみであるためです。

注:

  • パフォーマンスを向上させるには、抽出条件の形式は"field = value" (fieldは基になるベース テーブルのインデックス フィールド)、または "field LIKE prefix" (fieldは基になるベース テーブルのインデックス フィールド) のどちらかにし、prefix ("ART*"など) はプレフィックスを付けた検索文字列 にしてください。

  • 一般に、同じような検索を行う場合は、 Find メソッドよりも Seek メソッドを使用する方がパフォーマンスが優れています。 ただし、これを使用できるのは、テーブル タイプの Recordset オブジェクトだけを検索対象とする場合です。

次の例は、FindFirst および FindNext メソッドを使用して、Recordset 内のレコードを見つける方法を示しています。

サンプル コードの提供元:Microsoft Access 2010 Programmer's Reference

    Sub FindOrgName()
    
        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        
        'Get the database and Recordset
        Set dbs = CurrentDb
        Set rst = dbs.OpenRecordset("tblCustomers")
    
        'Search for the first matching record   
        rst.FindFirst "[OrgName] LIKE '*parts*'"
        
        'Check the result
        If rst.NoMatch Then
            MsgBox "Record not found."
            GotTo Cleanup
        Else
            Do While Not rst.NoMatch
                MsgBox "Customer name: " & rst!CustName
                rst.FindNext "[OrgName] LIKE '*parts*'"
            Loop
    
            'Search for the next matching record
            rst.FindNext "[OrgName] LIKE '*parts*'"
        End If
       
        Cleanup:
            rst.Close
            Set rst = Nothing
            Set dbs = Nothing
    
    End Sub