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