#634 任意の数のサブフォームをまとめて再クエリする方法 フォーム、VBA

ひとつのフォームに複数のサブフォームコントロールが配置されている場合、あるタイミングで同時にすべてのサブフォームを再クエリするには、単純に「サブフォーム名.Requery」という命令を列挙するだけです。


【例】

Me!サブフォーム1.Requery
Me!サブフォーム2.Requery
Me!サブフォーム3.Requery
    〜〜〜〜〜〜〜〜


しかし、同じようなレイアウトのフォームがデータベース内にたくさんある場合、おそらくフォームごとに「サブフォーム名」を変える必要があります。またフォームによってサブフォームの数も異なるかもしれません。

そのようなとき、『あるフォーム内にあるすべてのサブフォームコントロールを(名前によらず)探索してそれぞれについて再クエリを実行する』という共通的なプロシージャを標準モジュールにあらかじめ作っておくことによって、フォームごとにサブフォームコントロール名が違っていても、サブフォームの数が違っていても、同じ命令でかつ1行でプログラムを記述することができます。


それには、まず次のようなプロシージャを標準モジュールに記述します。

Public Sub SubFormRequery(frm As Form)

  Dim ctl As Control

  '引数のフォーム内のサブフォームを探索して再クエリ
  For Each ctl In frm.Controls
    With ctl
      If .ControlType = acSubform Then
        .Requery
      End If
    End With
  Next ctl

End Sub


そして、それを呼び出す側の特定のフォームには、下記のようなコードを記述します。ここでは「cmdRequery」という名前のコマンドボタンのクリックでそれを実行するようにしています。サブフォームコントロール名は一切記述されていません。

Private Sub cmdRequery_Click()
'[再クエリ]ボタンクリック時

  '全フォームを再クエリ
  SubFormRequery Me

End Sub


実行例:
■[再クエリ]ボタンクリック前


■[再クエリ]ボタンクリック後



【注】
フォームやレコードソースの構造あるいは動作環境によっては「.Requery」だけではうまく動作せず、「.Form.Requery」と書いた方がいいケースもあるようです。
| Index | Prev | Next |



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