HOME > 即効テクニック > AccessVBA > データ操作 > テーブルタイプのレコードを高速検索する

即効テクニック

データ操作

テーブルタイプのレコードを高速検索する

(Access 2000/2002/2003)
●概要●
構文  expression.Seek Comparison, Key1, Key2...Key13

設定項目               内容
expression             Recordsetオブジェクトを指定[省略不可]
Comparison             文字列式"<"、"<="、"="、">="、">"のいずれかを指定
                      [省略不可]
Key1,Key2...Key13      カレントインデックスに対応する値を指定
                      [Key1のみ省略不可]

一般に同じ種類の検索では、Seekメソッドを使用するとFind系メソッドよりも高速に検索を行うことができます。
カレントインデックスに対して指定した条件を満たすレコードを検索し、そのレコードをカレントレコードにします。に指定できるRecordsetオブジェクトは、テーブルタイプです。引数は、インデックスとして定義したフィールド数と同じ数だけ設定します。Seekメソッドを使用する前に、Recordsetオブジェクトにカレントインデックスを設定しておく必要があります。カレントインデックスを設定するには、あらかじめRecordsetオブジェクトのもととなるテーブルに、インデックスを作成しておきます。
ここで作成したインデックスだけが、カレントインデックスとして指定可能です。
カレントインデックスを設定するには、RecordsetオブジェクトのIndexプロパティに、インデックス名を文字列式で代入します。
次のコードは、「社員テーブル」の主キーである「社員コード」の値を条件にして、レコードを検索するものです。

●設定●
動作確認をするためには、Visual Basic Editorのメニューから[ツール]→[参照設定]コマンドを選択し、[参照設定]ダイアログボックスで「Microsoft DAO 3.6 Object Library」にチェックを入れてください。

●サンプル●
Sub SeekSample1()
    Dim myRS As DAO.Recordset
    '[社員テーブル]をテーブルタイプのレコードセットとして開く
    Set myRS = CurrentDb.OpenRecordset("社員テーブル", dbOpenTable)
  'カレントインデックスを設定
    myRS.Index = "PrimaryKey"
  'Seekメソッドで検索
    myRS.Seek "=", "10004" 
  '該当レコードがなかった場合
    If myRS.NoMatch Then 
        MsgBox "該当するレコードはありません"
  'レコードが見つかった場合
    Else 
        MsgBox myRS!社員コード & ":" & myRS!名前
    End If
    myRS.Close
End Sub

Seekメソッドは、カレントレコードの位置に関係なく、レコードの先頭から順にカレントインデックスを検索し、条件を満たす最初のレコードをカレントレコードにします。Recordsetオブジェクトのレコードは、カレントインデックスの順に並べられているので、引数に">"か">="を指定した場合、最も小さな値を持つレコードがカレントレコードになり、そのレコード以降のレコードはすべて条件を満たしていることになります。
次のコードは、「社員コード」が10003より大きい、全レコードを表示するものです。

●サンプル2●
Sub SeekSample2()
    Dim myRS As DAO.Recordset
    '[社員テーブル]をテーブルタイプのレコードセットとして開く
    Set myRS = CurrentDb.OpenRecordset("社員テーブル", dbOpenTable)
  'インデックスを設定
    myRS.Index = "PrimaryKey"
  'Seekメソッドで検索
    myRS.Seek ">", "10003"
  '該当レコードが見つかった場合
    If Not myRS.NoMatch Then
    '最後のレコードまで繰り返す
        Do Until myRS.EOF
            MsgBox myRS!社員コード & ":" & myRS!名前
            myRS.MoveNext
        Loop
    End If
    myRS.Close
End Sub