Chapter5-9 フォームのレコードソースの操作

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


※「CurrentRecord」プロパティはフォーム上の現在のレコード番号を返します。ここではそれをあるテキストボックスに代入しています。


■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
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved