#692 フォームのRecordsetとRecordsetCloneの違い フォーム、VBA

フォームに表示されているレコードをVBAのプログラムで操作したい場合、フォームオブジェクトが持っているレコードセットを取得してそれを操作します。そのときの取得元には、似たオブジェクトとして『Recordset』『RecordsetClone』の2つがあります。


上図のように、フォームのレコードソースとなっているテーブルやクエリと直結していることはどちらも同じです。しかし、「Recordset」の方は正にフォームに表示されているレコードそのものであり、一方の「RecordsetClone」はあくまでもフォームのレコードの”写し”のようなイメージのものであるという違いがあります。

ここでは、それらの動きについて具体的にどのような違いがあるかを説明したいと思います。


まず、例として次のようなフォームと、各コマンドボタンのクリック時イベントのプログラムを用意します。





Private Sub cmd次へ_Click()

  Dim rst As Recordset

  Set rst = Me.Recordset   'RecordsetClone

  rst.MoveNext

  Me!txtCurRecord = (rst.AbsolutePosition + 1) & " レコード目 : " & rst!商品名

End Sub

Private Sub cmd更新_Click()

  Dim rst As Recordset

  Set rst = Me.Recordset   'RecordsetClone
  rst.Edit
  rst!商品名 = "あああああ"
  rst.Update

End Sub

Private Sub cmd追加_Click()

  Dim rst As Recordset

  Set rst = Me.Recordset   'RecordsetClone
  rst.AddNew
  rst!商品コード = "9999999999999"
  rst!商品名 = "いいいいい"
  rst.Update

End Sub

Private Sub cmd削除_Click()

  Dim rst As Recordset

  Set rst = Me.Recordset   'RecordsetClone
  rst.Delete

End Sub



【Recordsetの場合】
■[次へ]ボタンをクリックすると、フォームの上のカーソルも次のレコードへ移動していき、画面上のカレントレコードの商品名が取得されていることが分かります。






■[更新]ボタンをクリックすると、現在カーソルがある行の商品名が更新されていることを画面上で確認できます。




■[追加]ボタンをクリックすると、レコードが表の一番下の新規行に移動するとともに、商品コードや商品名が追加されていることを画面上で確認できます。


■[削除]ボタンをクリックすると、カーソルがあった1行が削除されていることを画面上で確認できます。このとき実際の動作では、マニュアルでレコード削除しようとしたときの削除確認のメッセージなどは表示されません。






【RecordsetCloneの場合】
※実際には「Set rst = Me.RecordsetClone」という書き方に変更してから操作します。

■[次へ]ボタンをクリックすると、オブジェクト変数rstのレコードセット上ではレコード移動およびそのレコードの商品名が取得されていることが分かりますが、画面上のカレントレコードやカーソル位置など、見た目に変化はありません。






■オブジェクト変数rstが3レコード目にある状態で[更新]ボタンをクリックすると、画面上で3レコード目の商品名が更新されていることを確認できますが、レコードのカーソル位置に変化はありません。




■[追加]ボタンをクリックしても、画面上のカレントレコードやカーソル位置など、見た目に変化はないように見えますが、画面をスクロールして最終行を見てみると、新規レコードとして商品コードや商品名が追加されていることが分かります。




■オブジェクト変数rstが3レコード目にある状態で[削除]ボタンをクリックすると、画面上の3レコード目が削除されていることを確認できますが、カーソル位置に変化はありません(この場合も削除確認メッセージは表示されません)。





以上のことをまとめると、その使い分けとして次のようなことが言えます。

  • フォーム上に表示されているカレントレコードやそのデータと完全に連動した操作を行いたい場合は「Recordset」を使う

  • フォームのレコードソースを操作したいが画面上の表示とは連動させないで操作したい場合は「RecordsetClone」を使う


補足
  • よくあるケースとして、画面上のすべてのレコードをループで回して探索したりする場合、Recordsetだといっしょにカーソルが移動しますので、見苦しい画面の動きをしてしまいますが、RecordsetCloneを使えばそのような動きを見せずに処理することができます。

  • 画面上で手作業でレコード移動を行い、何レコード目かにカーソルがあるとき、Recordsetでは必ずそのレコードがカレントレコードになっています。一方RecordsetCloneでは前回参照したレコードがカレントレコードになっていることがあります。そのため予想しない行がカレントレコードになっている可能性がありますので、たとえば全レコードを処理するようなときは「rst.MoveFirst」のような命令でいったん先頭レコードに戻してやると確実です。

  • 今回の例ではテーブルをレコードソースとしたシンプルがフォームになっていますが、クエリをレコードソースとしている場合、上記のような更新・追加・削除では再クエリしないとそれが画面表示に反映されない場合が多々あります。その点が裏でプログラムでレコード処理する場合の注意事項となります。

| Index | Prev | Next |



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