#030 現在のレコード番号を取得・移動するには?(ページング操作) VBA

Recordsetオブジェクトの[AbsolutePosition]プロパティを使うと、現在のレコード番号を取得したり、指定したレコード番号に移動したりすることができます。なお、ここでいうレコード番号とはデータシート上の行番号にあたるものです。[AbsolutePosition]プロパティを応用すると、例えば、得点順に降順に並べ替えられた"試験成績テーブル"のようなものから、現在のレコードの受験者の順位を取得することができます。

まず次のコードが、[AbsolutePosition]プロパティを使ってテーブル tblTest の任意のレコード番号に移動し、そのフィールド(Data)の内容をデバッグウィンドウに表示するサンプルコードです。
  Dim dbs As Database
  Dim rst As Recordset
  
  Set dbs = CurrentDb
  '[AbsolutePosition]プロパティを使う場合は、ダイナセットまたはスナップショットでRecordsetオブジェクトを開きます
  Set rst = dbs.OpenRecordset("tblTest", dbOpenDynaset)
  '[AbsolutePosition]プロパティを使う場合は、いったん最後のレコードに移動して全レコードを認識させる必要があります
  rst.MoveLast
  
  '先頭レコードの[AbsolutePosition]プロパティの値は 0 なので、
  '移動したいレコード番号から -1 引いた値をセットします。
  
  '6 番目のレコードに移動したい場合は
  rst.AbsolutePosition = 6 - 1
  Debug.Print rst!Data

  '15 番目のレコードに移動したい場合は
  rst.AbsolutePosition = 15 - 1
  Debug.Print rst!Data

  '先頭レコードに移動したい場合は
  rst.AbsolutePosition = 0
  Debug.Print rst!Data
  
  '最後のレコードに移動したい場合は
  rst.AbsolutePosition = rst.RecordCount - 1
  Debug.Print rst!Data

  rst.Close

続いて次のコードは、1画面(ページ)に10件ずつテーブルの内容を表示し、次ページ・前ページと10件単位でレコード移動と表示を行う、いわゆる「ページング操作」の一例です。
ページングのサンプルイメージOption Compare Database
Option Explicit

Private pdbs As Database
Private prst As Recordset
'画面の先頭に表示されているレコード番号のカウンタ
Private plngRecNum As Long
'1ページ当りに表示されるレコードの件数
Private Const 
Private Sub Form_Load()
  Set pdbs = CurrentDb
  Set prst = pdbs.OpenRecordset("tblTest", dbOpenDynaset)
  prst.MoveLast
  prst.MoveFirst
  '現在のレコード番号を 1 に設定
  plngRecNum = 1
  '現在のレコード番号から10件分を画面に表示
  Show10Data

End Sub

Private Sub Form_Unload(Cancel As Integer)
  prst.Close
  pdbs.Close

End Sub

Private Sub cmdPrev10_Click()
'前の10レコードを表示
  If plngRecNum - pcintRecPerPage >= 1 Then
    plngRecNum = plngRecNum - pcintRecPerPage
    Show10Data
  Else
    Beep
  End If

End Sub

Private Sub cmdNext10_Click()
'次の10レコードを表示
  If plngRecNum + pcintRecPerPage <= prst.RecordCount Then
    plngRecNum = plngRecNum + pcintRecPerPage
    Show10Data
  Else
    Beep
  End If

End Sub

Private Sub Show10Data()
'現在のレコード番号から10件分を画面に表示
  Dim strTxtData As String
  Dim iintLoop As Integer
  
  On Error GoTo Err_Show10Data
  
  '現在のレコード番号に Recotdset を移動
  prst.AbsolutePosition = plngRecNum - 1
  
  '10件分のデータを組み立て
  strTxtData = ""
  For iintLoop = 1 To pcintRecPerPage
    strTxtData = strTxtData & prst!Data & vbCrLf
    prst.MoveNext
  Next iintLoop

SetTextBox:
  '組み立てられたテキストをフォームのテキストボックスにセット
  Me!txtData = strTxtData
  
Exit_Show10Data:
  Exit Sub

Err_Show10Data:
  If Err.Number = 3021 Then
    Resume SetTextBox:
  Else
    Resume Exit_Show10Data:
  End If
  
End Sub
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved