ACCESS VBA Requeryでフォームの表示を最新化する方法
ACCESSはフォーム上に様々な計算式を入れることが可能です。
入力内容に応じて随時計算結果が表示されるのはとても便利ですが、時には結果がすぐに反映されなくて困ることももあります。
今回は、Requeryメソッドを使って、フォームの表示を最新化する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
サブフォームを強制的に再計算させる
ACCESSではフォーム上で計算をさせることが多々あります。
例えば、下記のフォームでは、売上明細がサブフォームになっており、サブフォームの金額合計をメインフォームに表示しています。
赤枠部分が計算結果になります。
しかし、ACCESSではフォームで入力したデータがテーブル上に反映されるタイミングに若干のずれが発生する場合があります。
そうなると、フォームで入力した内容と、計算結果がずれるということが発生してしまいます。
そんな時に使用するのが、Requeryメソッドです。
こちらを使うと、強制的に再計算させることが可能です。
例えば、上記のフォームでは売上金額を計算させるために下記のVBAコードを記述しています。
[Forms]![売上伝票入力]![売上明細サブフォーム].Requery
[Forms]![売上伝票入力]![小計] = DSum("金額", "SLC_売上明細", "売上ID = " & uriage_id)
[Forms]![売上伝票入力]![消費税] = [Forms]![売上伝票入力]![小計] * [Forms]![売上伝票入力]![消費税率] / 100
[Forms]![売上伝票入力]![伝票合計] = [Forms]![売上伝票入力]![小計] + [Forms]![売上伝票入力]![消費税]
最初の行でサブフォーム自体をRequeryし、結果を最新化します。
その上で、2行目以降はテーブルの値を用いてDsum関数等で計算し、計算結果をメインフォーム(今回は売上伝票入力)の対象コントロールに格納するのです。
Requeryを入れなくても正常に計算されることもあるのですが、念のために入れることが多いですね。
更新ボタンの作成
なお、上記ではコントロールを指定してRequeryを行っていますが、特に指定せずにフォーム全体に対してRequeryを行うことも可能です。
例えば下記のような検索フォームで、検索結果を確実に反映さる時のために、更新ボタンを設置することがあります。
この更新ボタンの設定は非常に簡単です。
以下のコードをボタンクリック時動作にイベントプロシージャとして設定しています。
Private Sub 更新_ボタン_Click()
DoCmd.Requery
End Sub
このボタンを設定しておけば、万一タイミングの問題で結果が最新化されなかった場合も、ユーザー側で更新ボタンをクリックして解決できるケースがあります。
念のために作っておくと安心でしょう。
Requeryの注意点
フォームを最新化するのに便利なDoCmd.Requeryですが、一つだけ注意点があります。
それは、Requeryを行うとカレントレコードが一番最初に移動してしまうことです。
例えば、複数の行がある以下のようなフォームを例にとります
ここで、例えば単価や金額の更新後イベントにDoCmd.Requeryを入れると表示の結果は最新化されますが、選択中のレコードが一番上の明細ID:54に移動してしまいます。
連続して入力しようとするときにこれは不便です。
そのため、Requeryを入れるタイミングはよく考えた方が良いでしょう。
以上、Requeryでフォームの表示を最新化する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。