Microsoft Access Club >DAO入門講座 >このページ >次頁 < 前項  サイト内検索


カレントレコードの移動 : DAO入門講座



今までで、テーブル、クエリからレコードセットを作成してきました。レコードセットを作成したということは、メモリー上にデータの集まりを格納したということでしたね。しかし、まとまったデータを活用していかなくては意味がありません。では、そのデータの利用方法を見ていきましょう。

カレントレコード

レコードセットを用いて、テーブルやクエリのデータを参照できるレコードは1つだけです。つまり、複数のレコードがあっても、それらのレコードに対して同時アクセスができない仕様になっています。

そして、アクセスできるレコードを カレントレコード と呼ばれます。

  • Recordsetオブジェクトを作成した直後は、先頭レコードがカレントレコードになります。

必要なデータを得るためには、Move系のメソッドを用いて、目的のレコードに移動していかなくてはいけません。

カレントレコードの移動

一般的に、フォームなどで目的のレコードを表示するには、レコード移動ボタンを利用しますが、Recordsetオブジェクトの場合は、Move系のメソッドを用います。下表のとおりです。全て、recordset.Move**** という形式で利用 します。

メソッド名 働き
MoveFirst レコードセツト内の先頭のレコード移動する
MoveLast レコードセツト内の末尾のレコードに移動する
MoveNext レコードセツト内の次のレコードに移動する
MovePrevious レコードセツト内の1つ前のレコードに移動する
Move 移動するレコード数を引数として指定できます。引数が正の場合は末尾に向かって移動し、負の場合は先頭に向かって移動します。

テーブルの作成

下記のような、取引先別売上げリストテーブルを作成します。

以下のサンプルコードは、カレントデータベースにある取引先別売上げリストテーブルを、dbOpenTableタイプのレコードセツトで開きます。

MoveNextメソッド

MoveNextメソッドを用いて、次のレコードに移動します。For 〜 Nextステートメントで、3つのレコードに移動し終わると、その段階でプロシージャが終了します。

Sub RecordAllShow()
        
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long
    
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("取引先別売上げリスト", dbOpenTable)
        
    For i = 1 To 3
        Debug.Print rs!ID & " , " & rs!取引先 & " : \" & rs!売上金額
        rs.MoveNext
    Next i
        
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
        
End Sub
実行結果
  1. Recordsetオブジェクトが開かれると、先頭レコードがカレントレコードになります。これはレコードセット既定の動きです。
  2. このプロシージャを実行すると、先頭レコードから順にカレントレコードが移動(MoveNextメソッド)し、3つのレコードの内容を 以下のようにイミディエイト画面に表示します。
     1 , (株)万代 : \25444
     2 , (株)謄写出版 : \555695
     3 , 葉木部(有) : \698878

MoveLastメソッド、MovePreviousメソッド

MoveLastメソッドを用いて、末尾のレコードに移動します。For 〜 Nextステートメントで、末尾から先頭に向かって3つのレコードに移動し終わると、その段階でプロシージャが終了します。

Sub RecordAllShow()
        
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long
    
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("取引先別売上げリスト", dbOpenTable)
    
    rs.MoveLast
    
    For i = 1 To 3
        Debug.Print rs!ID & " , " & rs!取引先 & " : \" & rs!売上金額
        rs.MovePrevious
    Next i
        
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
        
End Sub
実行結果
  • Recordsetオブジェクトが開かれると、先頭レコードがカレントレコードになりますが、直ぐにMoveLastメソッドで末尾のレコードにカレントレコードを移動させます。
  • このプロシージャを実行すると、末尾のレコードから順にカレントレコードが先頭のレコードへ移動(MovePreviousメソッド)し、3つのレコードの内容を 以下のようにイミディエイト画面に表示します。
     13 , 榊原乳業(株) : \5669548
     12 , (株)加藤セメント : \7855694
     11 , 橋場技術工業(株) : \633251

MoveFirstメソッド

MoveFirstメソッドを用いて、先頭のレコードに移動します。For 〜 Nextステートメントで、2つのレコードに移動し終わると、その段階でプロシージャが終了します。

Sub RecordAllShow()
        
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long
    
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("取引先別売上げリスト", dbOpenTable)

    rs.MoveLast
    
    For i = 1 To 2
        Debug.Print rs!ID & " , " & rs!取引先 & " : \" & rs!売上金額
        rs.MoveFirst
    Next i
        
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
        
End Sub
実行結果
  • Recordsetオブジェクトが開かれると、先頭レコードがカレントレコードになりますが、直ぐにMoveLastメソッドで末尾のレコードにカレントレコードを移動させ 、末尾のレコードをイミディエイト画面に印字し、直ちに先頭行に移動(MoveFirstメソッド)します。
  • このプロシージャを実行すると、2つのレコードの内容を以下のようにイミディエイト画面に表示します。
     13 , 榊原乳業(株) : \5669548
      1 , (株)万代 : \25444

Moveメソッド

Moveメソッドを用いて、指定した行のレコードに移動します。For 〜 Nextステートメントで、3つのレコードに移動し終わると、その段階でプロシージャが終了します。

Sub RecordAllShow()
        
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long
    
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("取引先別売上げリスト", dbOpenTable)

    rs.Move 7
    
    For i = 1 To 3
        Debug.Print rs!ID & " , " & rs!取引先 & " : \" & rs!売上金額
        rs.MoveNext
    Next i
        
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
        
End Sub
実行結果
  • Recordsetオブジェクトが開かれると、先頭レコードがカレントレコードになりますが、直ぐにMoveLastメソッドで末尾のレコードにカレントレコードを移動させ 、末尾のレコードをイミディエイト画面に印字し、直ちに先頭行に移動(MoveFirstメソッド)します。
  • このプロシージャを実行すると、2つのレコードの内容をイミディエイト画面に表示します。
     8 , 町田コーポレーション : \677892
     9 , 来島工業(株) : \5784100
    10 , 笹原農業機器(有) : \78700

補足

  • Moveイベントは、引数に指定した行数に+1のレコードをカレントレコードにします。
  • レコードセットの範囲外を指定すると、エラーが発生します。

カレントレコードがありません

レコードセットのレコード数は有限です。よって、実行時エラーを回避するためにエラートラップをプロシージャ内に記述します。Moveメソッドを例にすると、下記のようなプログラミングになります。

Sub RecordAllShow()

On Error GoTo エラー
        
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long
    
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("取引先別売上げリスト", dbOpenTable)

    rs.Move 15
    
    Debug.Print rs!ID & " , " & rs!取引先 & " : \" & rs!売上金額
        
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
    
    Exit Sub
    
エラー:

    If Err.Number = 3021 Then
        MsgBox "レコードセットの範囲外です。"
        Exit Sub
    Else
        MsgBox Err.Number & " : " & Err.Description
    End If
        
End Sub
解説

レコードセットの範囲外の行数を指定し実行するとエラーナンバー3201が発生しますので、Ifステートメントでエラーを取り込み処理を行います。これが所謂 エラートラップ処理 と呼んでいます。汎用的なエラー対処法です。

実行結果

以下のようにメッセージボックスが開きます。

 

2004/05/06

ページの先頭へ 前ページへ戻る

 


カレントレコードの移動 : DAO入門講座


 

-Microsoft Access Club-

アメリカ合衆国やヨーロッパのデータセンターからcPanelレンタルサーバーをご提供します。お支払いは日本国内の銀行振込で...。1ヵ月契約からOKです。
アメリカ合衆国やヨーロッパからcPanelレンタルサーバー。
お支払いは日本国内の銀行振込。
最短契約期間は1ヵ月契約からOKです。