#651 サブフォームのRequeryメソッドの使い分け フォーム、VBA

フォームに表示されているデータを最新情報に更新する、いわゆる「再クエリ」をしたい場合、マニュアル操作であればリボンの[すべて更新]ボタンをクリックしたり、Shiftキーを押しながらF9キーを押したりすることで実行できます。

一方、VBAのプログラムから行いたい場合には、フォームに対して「Requery」メソッドを実行します。

そのとき、その対象が「サブフォーム」コントロール内のフォームである場合、次のような2つの書き方ができます。

  Me!受注明細_sub.Requery

  Me!受注明細_sub.Form.Requery


ここでは「受注明細_sub」というのがサブフォームコントロールの名前です。前者はそのサブフォームコントロールに対してRequeryメソッドを実行しています。一方、後者の場合はサブフォームコントロール内にあるFormオブジェクトに対してRequeryメソッドを実行しています。

両者とも表示されているデータを最新情報に更新するという動作は同じなのですが、見た目の挙動に若干の違いがあります。
ここでは、次のようなフォームを用意して、その違いを確認していきます。


  • ここではメインフォームの中にサブフォームが配置されています。

  • サブフォームのレコードソースは下図のようなクエリで、複数テーブルを結合するとともに、「原価金額」を演算フィールドとして計算しています。


  • [テーブルの値を更新]ボタンをクリックすると次のプログラムが実行され、IDが1であるレコードの「数量」フィールドの値が「10」に、またIDが64のレコードが「100」に更新されます。

      CurrentDb.Execute "UPDATE 受注明細 SET 数量=10 WHERE ID=1"
      CurrentDb.Execute "UPDATE 受注明細 SET 数量=100 WHERE ID=64"

    これは画面上で値を入力するのではなく、外からテーブルが直接更新されるという形です。画面上では、テーブル直ではなくクエリの演算フィールドを通しているため、その行にカーソルを移動させるか、あるいはクエリの作りによっては再クエリを実行しないと、「数量=10」などの変更後の値や、それに基づく「原価金額」の計算結果に更新されないことがあります。

  • [サブフォームを再クエリ]ボタンのクリックで「Me!受注明細_sub.Requery」を実行します。

  • [サブフォームのFormを再クエリ]ボタンのクリックで「Me!受注明細_sub.Form.Requery」を実行します。

【操作例】
  1. フォームを開いてそのまま[テーブルの値を更新]を実行したあと、それぞれの再クエリボタンをクリックしてみます。

    ■.Requeryの場合

    ■.Form.Requeryの場合


    どちらも原価金額が再計算されており、見た目も違いはありません。

    ※ただし、よく見ると「.Form.Requery」の方は実行後にフォーカスがサブフォーム内に自動的に移動していることが分かります。「.Requery」の方はクリックしたボタン上のままになります。


  2. スクロールバーを操作することで画面をスクロールさせます(レコード移動させるのではないので、カレントレコードは先頭のままの状態です)。そして[テーブルの値を更新]を実行したあと、それぞれの再クエリボタンをクリックしてみます。

    ■.Requeryの場合

    ■.Form.Requeryの場合


    この場合も両者に違いは見当たりません。両方とも下の方にスクロールした状態から先頭行が表示された状態に戻っています。これは、データシート形式などにおいてカレントレコードを画面上で見られる位置にしようとするAccessの働きによるものです。


  3. 画面をスクロールさせるかレコード移動ボタンを使うなどして、いったん下の方のレコードにカーソルがある状態にする、すなわちカレントレコードを移動させます。


    この状態でそれぞれの再クエリボタンをクリックしてみます。

    ■.Requeryの場合

    ■.Form.Requeryの場合


    この場合、前者はカレントレコードがそのままの状態で再クエリされ、最新情報に更新されます。アクティブコントロールも変わりません。

    一方後者は、再クエリされると同時にカレントレコードが先頭に戻ります。またアクティブコントロールもタブオーダーが先頭のコントロールに戻ります。つまり画面を開いた直後と同じような状態になります。

【結果】
上記のように、2つの方法には「再クエリ後のカレントレコードの位置」の違いがあります。意図的に先頭レコードに戻したい場合もあるかもしれません、カレントレコードや画面のスクロール位置などは保持したままにしたい場合もあるかもしれません。ケースバイケースではありますが、その点が使い分けのひとつの判断基準となります。

また、もし再クエリを実行したあとにすぐにサブフォーム内のデータを編集できる状態にしたい場合、「.Requery」ではプログラムでフォーカスを移動させる(.SetFocusメソッドを実行する)必要があります。「.Form.Requery」を使った場合はそのメソッドは要りませんが、あったからといってエラーになるわけでもありませんので、その点の大差はありません。


【補足】
  • 「Me!受注明細_sub.Form.Recalc」とした場合も、あくまでも今回のレコードソースに関してですが、「Me!受注明細_sub.Requery」と同じ動きをします(カレントレコード移動なし)。ただし「Me!受注明細_sub.Recalc」というメソッドはありませんので、「Recalc」メソッドを使う場合は常にサブフォームのFormオブジェクトに対して実行することになります。

  • どのようなときにそうなるのか分かっていないのですが、一方の書き方では最新情報に更新されず、もう一方の書き方に変えることによって正常に動作するといったケースがあります。いずれにしても、同じように見えるRequeryメソッドですが、「.Form」を付ける/付けないの2つがあり、それによって動きが変わることがあるというのは覚えておくとよいと思います。
| Index | Prev | Next |



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