#629 フォームの全レコードのチェックマークをON/OFFする方法 フォーム、VBA

サブフォーム内にある全レコードのYes/No型フィールドの値を一括してON/OFFする方法です。

ここでは、メインフォームにオプショングループコントロールならびにトグルボタンコントロールを配置して、その切り替えによってサブフォームの値を変更します。

例では、オプショングループは「fraチェックマーク」という名前とし、その中に配置されたトグルボタンはそれぞれ『ONは「1」』、『OFFは「2」』という値を「オプション値」プロパティに設定します(トグルボタンの名前はなんでもかまいません)。

またサブフォームコントロールの名前は、「frm商品マスタ_sub」(ソースオブジェクトとなるフォームの実体の名前はなんでもかまいません)とします。

またサブフォーム内のチェックボックスは、Yes/No型フィールドである「対象」という名前のフィールドと連結されています。




そして、オプショングループの切り替えでアクションを起こすようにしますので、その「AfterUpdate/更新後処理」イベントプロシージャにそのプログラムを記述します。

Private Sub fraチェックマーク_AfterUpdate()
'チェックマークのオプショングループの更新後処理

  Dim blnOnOff As Boolean
  Dim rst As Recordset

  'オプショングループの選択値を取得にBoolean値に変換
  '  (ONならTrue、OFFならFalse)
  blnOnOff = (Me!fraチェックマーク = 1)

  'サブフォームのレコードセットクローンを取得
  Set rst = Me!frm商品マスタ_sub.Form.RecordsetClone
  With rst
    'レコードがあるときだけ処理
    If .RecordCount > 0 Then
      'いったん先頭レコードに戻す
      .MoveFirst
      'すべてのレコードをたどるループ
      Do Until .EOF
        '指定のON/OFF状態に更新
        .Edit
          !対象 = blnOnOff
        .Update
        .MoveNext
      Loop
    End If
    .Close
  End With

  'サブフォームを再クエリして最新情報を表示
  Me!frm商品マスタ_sub.Requery

End Sub


実行例:
■ONをクリックしたとき


■OFFをクリックしたとき



※ネットワークでテーブルを共有している場合、フィールド値を直接するこのような操作が複数のパソコンから同時に行われると、処理結果が想定外のものとなる可能性が高いです。そこで実際には、たとえば次のような回避策をとった方がよいかもしれません。
  • いったん共有テーブルのデータをそのままローカルの作業テーブルに転送(テーブル作成クエリなどで)し、それに対して更新操作を行い、最後に何らかのアクションでローカルの作業テーブルの値を正式なテーブルに書き戻す
  • このフォームが開かれた時点、あるいはレコードセット等に対してロックを掛けるような仕組みを設ける
  • この処理を複数のユーザーが同時に開けない、もしくは特定のユーザーしか開けないような仕組みをあらかじめ設ける
| Index | Prev | Next |



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