VBAでは、テーブルやクエリを開いてのレコード操作だけでなく、フォームに表示されているレコードソースの操作も行うことができます。その場合には、フォームオブジェクトの「Recordset」または「RecordsetClone」を操作します。
これらの操作方法はRecordsetオブジェクトと基本的に同じです。しかし、RecordsetとRecordsetCloneには次のように微妙な違いがあります。
Recordset |
フォームのレコードソースそのものを表します。画面上に表示されているレコードと一体となっており、Recordsetによって返されるレコードセットを編集すると直ちに画面にも反映されます。また、レコードのポインタも同一で、このレコードセットのレコードを移動すると画面上のレコード位置もいっしょに移動します。
よって、Recordsetは、直にフォーム上のデータを操作するような場合に使います。
【注意】
Recordsetはフォームのレコードソースそのものなので、VBA上でCloseしてはいけません。フォームは表示されていても、レコードソースがなくなった状態となってしまい、以降、フォームでデータを扱うことができなくなってしまいます。
|
RecordsetClone |
RecordsetCloneは、レコードソースとは同じ実体ですが、フォームの表示とはダイレクトに結びついていません。レコードのポインタは各々独立しているため、RecordsetCloneでレコード移動しても、それといっしょに画面のレコードが移動することはありません。しかし、レコードソースレベルでは同じですので、編集結果はフォームに反映されます。画面の"表示内容"からは独立してフォームのレコードを操作したいような場合に使います。
RecordsetCloneの場合、フォームが開かれたときは先頭レコードがカレントレコードです。フォーム上でレコード移動しても、このRecordsetCloneに対してレコード移動を行なわない限り、RecordsetCloneのカレントレコードは移動しません。また、RecordsetCloneのレコード移動を行なっても、フォーム上のレコード位置には影響を与えません。RecordsetCloneは閉ても閉じなくても、フォームが開いている間は直前のレコード位置が保持され続けます。
|
■Recordsetを次レコードへ移動させるといっしょに画面上のレコードも移動します
Private Sub cmd01_Click()
With Me!frm書籍情報_sub
With .Form
.Recordset.MoveNext
Me!txtRecNum = .CurrentRecord
MsgBox .Recordset!タイトル
End With
MsgBox !タイトル
End With
End Sub
■Recordsetオブジェクトと同じAddNewメソッドで新規レコードへ移動します
Private Sub cmd02_Click()
Me!frm書籍情報_sub.Form.Recordset.AddNew
End Sub
■Recordsetオブジェクトと同じDeleteメソッドで画面上のカレントレコードを削除します
Private Sub cmd03_Click()
Me!frm書籍情報_sub.Form.Recordset.Delete
End Sub
■Recordsetオブジェクトと同じEditメソッドとUpdateメソッドで画面上のカレントレコードを更新します
Private Sub cmd04_Click()
With Me!frm書籍情報_sub.Form.Recordset
.Edit
!価格 = 3000
.Update
End With
End Sub
■Recordsetのレコード移動を繰り返すことで、画面上のレコードもいっしょに移動します。
しかしループのスタート位置は画面上のカレントレコードですので、そのまま開始したのでは全レコードを更新することはできません。MoveFirstメソッドでいったん先頭レコードに戻してからループ処理を行なわなければなりません。Recordsetの場合、画面もいっしょに動くので、このようなループは見た目が少々見苦しくなります。
Private Sub cmd05_Click()
With Me!frm書籍情報_sub.Form.Recordset
MsgBox !タイトル
Do Until .EOF
.Edit
!価格 = !価格 + 10000
.Update
.MoveNext
Loop
End With
MsgBox "すべての価格が10000円プラスされましたか?", vbOKOnly + vbInformation
With Me!frm書籍情報_sub.Form.Recordset
.MoveFirst
MsgBox !タイトル
Do Until .EOF
.Edit
!価格 = !価格 + 10000
.Update
.MoveNext
Loop
End With
MsgBox "すべての価格が10000円プラスされましたか?", vbOKOnly + vbInformation
End Sub
■次の処理を何度か繰り返すとフォーム上のレコードはそのままでRecordsetCloneだけが次レコードへ進んでいくのが分かります
Private Sub cmd06_Click()
With Me!frm書籍情報_sub
With .Form
.RecordsetClone.MoveNext
Me!txtRecNum = .CurrentRecord
MsgBox .RecordsetClone!タイトル
End With
MsgBox !タイトル
End With
End Sub
■RecordsetCloneでEditメソッドを実行すると、フォーム上のレコード位置に関係なく、RecordsetClone上のカレントレコードだけが更新されます
Private Sub cmd07_Click()
With Me!frm書籍情報_sub.Form.RecordsetClone
.Edit
!価格 = 3000
.Update
End With
End Sub
■全レコードに対して処理を行なう場合にはRecordsetCloneもいったん先頭レコードに戻してからループを開始します
RecordsetCloneのレコード移動ではフォーム上のカレントレコードは移動しませんので、スムースにデータが一括更新されたように見えます。
Private Sub cmd08_Click()
With Me!frm書籍情報_sub.Form.RecordsetClone
.MoveFirst
Do Until .EOF
.Edit
!価格 = !価格 - 10000
.Update
.MoveNext
Loop
End With
End Sub
サブフォームのレコードソースの操作 |
上記コードでは、サブフォームのレコードソースを操作しています。その場合の構文は次のようになります。「サブフォームコントロールオブジェクト」と「サブフォームオブジェクト」は実際には同じものであっても、その見方が違うことに留意してください。
me!サブフォームコントロール名.Form.Recordset
一方、メインフォームのレコードソースを操作したい場合には、次のような構文に置き換えます。”Form”というキーワードは不要です。
me.Recordset
|
|