HOME > 即効テクニック > AccessVBA > フォーム・レポート > 帳票フォーム・データシートフォームで連続したレコードの値を取得する

即効テクニック

フォーム・レポート

帳票フォーム・データシートフォームで連続したレコードの値を取得する

(Access 97)
■ 概要 ■
帳票形式・データシート形式のフォームで、連続した複数のレコードを選択した場合のフィールドの値を取得する方法を説明します。


■ 準備 ■
(1) テーブル[テーブル1]を用意し、以下のようなサンプルデータを入力します。
      名前(テキスト型)
        A
        B
        C
        D
(2) オートフォーム、フォームウィザードで[テーブル1]をレコードソースにしたデータシート形式のフォーム[フォーム1]を作成します。
    その際、必ずレコードセレクタを [はい] にしておいて下さい。
(3) フォームのCurrent/レコード移動時イベントに、以下のプロシージャを記述します。

■ サンプルコード ■
'フォーム移動時のイベント
Private Sub Form_Current()
    Dim Frm     As Form
    Dim rsClone As DAO.Recordset
    Dim iTop    As Integer
    Dim iRecNum As Integer
    Dim iLoop   As Integer

    'オブジェクト変数に使用フォームを代入
    Set Frm = Me

    'レコードセット作成
    Set rsClone = Me.RecordsetClone
    rsClone.MoveFirst

    '複数選択されたレコードの先頭レコード位置とレコード数を取得
    iTop = Frm.SelTop
    iRecNum = Frm.SelHeight

    '行を選択していない場合と新規レコードの場合は処理中止
    If iRecNum = 0 Or Me.NewRecord = True Then
        Exit Sub
    End If

    '先頭レコードに移動
    rsClone.Move iTop - 1

    '必要なフィールドをメッセージボックスで表示
    For iTop = 1 To iRecNum
        MsgBox rsClone![名前]
        rsClone.MoveNext
    Next

    '強制的に新規レコードに移動
    DoCmd.GoToRecord acDataForm, "フォーム1", acNewRec

    '終了処理
    rsClone.Close
    Set rsClone = Nothing
End Sub

■ 動作確認 ■
  フォームをデータシートビューに変更し、任意のレコードセレクタからマウスをドラッグして複数レコードを選択します。
  すると、選択したレコードの名前フィールドの値が、順に表示されます。


■ 詳細 ■
  サンプルではSelTopプロパティで選択された複数のレコードの先頭位置を取得し、SelHeightプロパティで選択されたレコード数を取得しています。
  そこで取得した情報を元に、レコードセットクローンのカレント位置を移動させています。
  その時、SelTopプロパティが1から始まるのに対し、レコードセットのレコード番号は0から始まりますので、変換に際しては注意が必要です。

  また、フォームのCurrent/レコード移動時イベントを使用しているため、すでにフォーカスがあるレコードを基点に選択した場合、イベントが発生しないため、最後に強制的に値取得後に新規レコードにカーソルを移動しています。


■ 備考 ■
  Access2000の場合、デフォルトではDAOに参照設定されていません。
  Visual Basic Editor(VBE)を開き、メニューの[ツール]−[参照設定]から、Microsoft DAO 3.6 Object Libraryにチェックを入れて下さい。
  その際にMicrosoft ActiveX Data Object 2.1 Libraryよりも上に、DAOのチェックを持ってきて下さい。