ACCESS VBA Me.RefreshとDoCmd.ReQueryの違い

Me.RefreshとDoCmd.ReQueryの違い

ACCESS VBAでフォームの表示を最新化する際によく利用するのが、Me.RefreshとDoCmd.ReQueryです。

どちらも表示を最新化するのですが、動作にはちょっとした違いがあります。

今回は、Me.RefreshとDoCmd.ReQueryの違いをご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

Me.RefreshとDoCmd.ReQuery

Me.RefreshとDoCmd.ReQueryは、どちらもデータを最新化するための処理で、VBAで利用します。


 Me.Refresh
 


 DoCmd.Requery
 

のように記述し、それだけで動作するので利用するのは簡単です。

それぞれの機能についてはマイクロソフトでは以下のように説明されています。

Me.Refresh

Refresh メソッドは、指定したフォームまたはデータシートの基になるレコードソースに含まれるレコードを直ちに更新して、データに加えられた変更を反映します。

DoCmd.ReQuery

Requery アクションを使用して、コントロールのソースを再クエリすることで、アクティブオブジェクトの指定されたコントロール内のデータを更新します。コントロールを指定しない場合は、オブジェクト自体のソースを再クエリします。アクティブ オブジェクトやそのコントロールの表示データを最新のものにするには、このアクションを使います。

マイクロソフトの解説はなかなか難解なのですが、これだけだと違いが分かりにくいですよね。
基本は同じ挙動をするのですが、実務面での二つの違いを簡単に言うと以下の通りです。

Me.Refreshフォームの表示を最新化するが、クエリの計算式によっては値が最新化されないケースがある
DoCmd.ReQuery必ず計算結果が最新化されるが、カレントレコードが1に移動してしまう

あいまいな表現となってしまいますが、カレントレコードが移動しても問題ない場合はDoCmd.ReQueryを利用した方が無難です。
一方で、カレントレコードを移動させたくない場合は、Me.Refreshで試してみて、うまく結果が最新化できない場合はあきらめてDoCmd.ReQueryを使用しましょう。

Me.RefreshとDoCmd.ReQueryの違い

今回は実際にフォームを作って検証してみます。

以下のフォームを作成しました。

売上情報の入力用フォームで、メインフォームとサブフォームから成っています。

下の方にRefreshボタンと、ReQueryボタンを設置しました。
それぞれのボタンを押すとMe.RefreshとDoCmd.ReQueryが行われます。

フォームをデザインビューで見てみましょう。

サブフォームの下段には金額をSumで合計するコントロール、金額合計を配置してあります。
その合計値をメインフォームでも表示するために、メインフォームの小計コントロールは、コンロトールソースにサブフォームの金額合計を参照するようにしてあります。

この設定でサブフォームの金額が変わったときにメインフォームの小計が連動して更新されます。

ではここで、2行目の明細の単価を変えてみましょう。

明細行の金額が変わり、合計が60,000円になるべきところ、金額合計と小計は50,000円のままでずれています。

ACCESSは基本的にテーブルやクエリの値をフォームに表示にするのでこうしたずれは発生しないのですが、テーブル、クエリの値をフォームに反映するタイミングによっては一時的にこうしたずれが発生することがあるのです。

こうした際にフォームを最新化することで合計値のずれを修正することが可能です。

ここで、Refreshボタンを押してみましょう。

無事に金額合計と小計が最新化されました。

一方、ReQueryボタンではどうでしょうか。

こちらも同様に金額が最新化できました。

ただし、売上明細のカーソルが1行目に移動してしまっています。
このように、DoCmd.ReQueryを行うとカーソルが1レコード目に移動してしまいますので、連続入力が必要な場面でDoCmd.ReQueryを利用すると入力効率が落ちてしまう場合があります。

以上、Me.RefreshとDoCmd.ReQueryの違いをご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。