■ 概要 ■
帳票形式・データシート形式のフォームで、連続した複数のレコードを選択した場合のフィールドの値を取得する方法を説明します。
■ 準備 ■
(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のチェックを持ってきて下さい。