Home >VBA 基礎 > このページ
レコード検索(ADO編)

■Contents

01 Findメソッド
02 先頭レコードを検索する
03 連続して検索する
04 Seekメソッド

01.Findメソッド

 Recordset から指定した条件を満たすレコードを検索します。条件が一致すれば、そのレコードをカレントレコードにします。それ以外のときは,RecordsetオブジェクトのBOFプロパティまたはEOFプロパティがTrueになり,カレントレコードは未定義になります。
【書式】recordset.Find Criteria, SkipRows, SearchDirection, Start
設定値 説明
recordset 開いているRecordsetオブジェクト
Criteria 列の名前、比較演算子と検索に使用する値を指定するステートメントを含む文字列型 の値を指定します。 比較演算子に "like" を使用する場合、文字列値にパーセント (%) を含めると、曖昧検索することができます。ただし,パーセントは、検索文字列の末尾のみに使用するか、または検索文字列の先頭と末尾の両方で使用することができます。
SkipRows 検索実行時に読み飛ばすレコード数です。この引数を省略するか,または0を指定すると,Findメソッドはカレントレコードから検索を行います。もしも,カレントレコードが検索条件を満たしている場合は,つねにこのレコードが検索され,他のレコードを検索することはできません。SkipRows引数を 1 にすると,カレントレコードを読み飛ばして,次のレコードを検索することができます。(省略可能)
SearchDirection adSearchBackward 後方検索をし、Recordset の先頭で終了します。一致するレコードが見つからない場合、レコードポインタは BOF に移動します
adSearchForward 前方検索をし、Recordset の末尾で終了します。一致するレコードが見つからない場合、レコードポインタは EOF に移動します。
RecordsetオブジェクトのCursorTypeプロパティがadOpenForwardOnlyの場合は,カレントレコードから先頭レコード方向への検索は実行できません。(省略可能)
Start 検索開始位置を指定します。省略した場合は,カレントレコードから検索を開始します。(省略可能)
■検索条件の書き方
 ●テキスト型のフィールドの場合,検索する値をシングルクォーテーション(’)で囲みます。
   検索する値を変数で指定する場合も,シングルクォーテーションが必要です。
    
    (例) RS.Find "クラス = ’TA’"
        RS.Find "クラス = ’ " &  Str  &  "’"

数値型のフィールドの場合は検索する値をそのまま記述します。

   (例) RS.Find "得点  > 80"
       RS.Find "得点  > " & Str 

 ●日付時刻型フィールドの場合,検索する値をシャープ記号(#)で囲みます。検索する値を変数で  指定する場合も,シャープ記号が必要です。

   (例) RS.Find "入学日 = #2004/04/01#"
       RS.Find "入学日 =  # " & Str & "#"



02.先頭レコードを検索する

 FindメソッドのSkipRows引数を 0,SearchDirection引数をadSearchForwardにすると,カレントレコードからレコードセットの最終方向に向かって検索できます。
【サンプルコード】
   Public Sub検索()
       Dim CN As ADODB.Connection
       Dim RS As ADODB.Recordset
       Dim criteria As String
        
       Set CN = CurrentProject.Connection
       Set RS = New ADODB.Recordset
       RS.Open "生徒名簿", CN, adOpenKeyset, adLockOptimistic
    
       '検索
       criteria = "氏名 Like '山田%'"
       RS.Find criteria, 0, adSearchForward
    
       '確認
       If RS.EOF Then
         MsgBox ("見つかりません")
       Else
         MsgBox (RS!学籍番号 & "  " & RS!氏名)
       End If
    
       RS.Close:  Set RS = Nothing
       CN.Close:  Set CN = Nothing
   End Sub



03.連続して検索する

  同じ条件で連続して検索する場合は,1つ目のレコードを検索する場合は,SkipRows引数を0にして実行し,2つ目以降のレコードを検索する場合は,SkipRows引数を1にします。
【サンプルコード】
  Public Sub 連続検索()
     Dim CN As ADODB.Connection
     Dim RS As ADODB.Recordset
     Dim Criteria As String
     Dim I As Integer    ’SkipRows引数
     Dim intcount As Long  ’検索されたレコード数
     
     Set CN = CurrentProject.Connection
     Set RS = New ADODB.Recordset
     RS.Open "T_家族", CN, adOpenKeyset, adLockOptimistic
        
      Criteria = "氏名 Like '山田%'"
      I = 0
          
       Do Until RS.EOF
        
         RS.Find Criteria, I, adSearchForward
         
          If RS.EOF = False Then    ’--------------------------------@
              Debug.Print RS!会員コード & " " & RS!氏名 ’---------------A
              intcount = intcount + 1
          End If
             
          If I = 0 Then I = I + 1
             
       Loop
            
      If intcount = 0 Then
          MsgBox "該当するレコードはありません"
      Else
          MsgBox intcount & "件のレコードが見つかりました"
      End If
   
      RS.Close:  Set RS = Nothing
      CN.Close:  Set CN = Nothing
End Sub
※@の条件判断がないとEOFがTrueの時もA部分が実行されるため、以下のメッセージが表示されます。



04.Seekメソッド

 Seekメソッドはテーブルに設定されているインデックスを利用して検索を行うため,Findメソッドよりも高速にレコードを検索できます。RecordsetオブジェクトのOpenメソッドのoptions引数にadCmdTableDirectを指定して作成したRecordsetオブジェクトだけで実行可能です。
【書式】recordset.Seek KeyValues, SeekOption
    
 recordset:開いているRecordsetオブジェクト
 KeyValues:検索する値
 SeekOption:検索方法
 SeekメソッドのKeyValues引数は,検索する値のデータ型によって記述法が異なります。テキスト型の場合はその文字列をダブルクォーテーション(")で,日付時刻型の場合はシャープ記号(#)で囲みます。数値型の場合は,検索する値をそのまま記述します。

 例えば,[学籍番号]フィールドに[番号]というインデックスが設定されているときに,このインデックスを使ってレコードを検索するには,次のように記述します。インデックスの設定方法はこちらを参照してください。
RS.Index = "番号"
RS.Seek "775501A", adSeekFirstEQ
■SeekOption
定数 説明
adSeekFirstEQ 1 KeyValues と一致する最初のキーを検索します。
adSeekLastEQ 2 KeyValues と一致する最後のキーを検索します。
adSeekAfterEQ 4 KeyValues と一致するキー、またはその直後のキーのどちらかを検索します。
adSeekAfter 8 KeyValuesと一致するキーの直後のキーを検索します。
adSeekBeforeEQ 16 KeyValues と一致するキー、またはその直前のキーのどちらかを検索します。
adSeekBefore 32 KeyValues と一致するキーの直前のキーを検索します。

 検索に使用するフィールドは,テーブルに設定されているインデックスです。どのインデックスを使って検索を実行するかは,RecordsetオブジェクトのIndexプロパティで指定します。
【書式】recordset.Index = indexname

 recordset:開いているRecordsetオブジェクト
 indexname:テーブルに設定されているインデックス名
【サンプルコード】
   Public Sub Seek検索()
       Dim CN As ADODB.Connection
       Dim RS As ADODB.Recordset
       Dim DAT As Long
       
       Set CN = CurrentProject.Connection
       Set RS = New ADODB.Recordset
       RS.Open "生徒名簿", CN, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    
       '検索
       DAT = 2101
       RS.Index = "番号"
       RS.Seek DAT, adSeekFirstEQ
    
       '確認
       If RS.EOF Then
         MsgBox "該当するレコードはありません"
       Else
         Debug.Prinr RS!学籍番号 & "  " & RS!氏名
       End If
    
       RS.Close:  Set RS = Nothing
       CN.Close:  Set CN = Nothing
   End Sub

ホームページに|前のページに |次のページに

CopyRight(C) 2004 cbcnet. All Rights Reserved