ACCESSでは複数のフォームを行き来して操作することが一般的です。
最も多いのは、検索フォームでレコードを探し、その詳細を表示する詳細フォームへ遷移するという動きではないでしょうか。
この際、詳細フォームで入力した情報が、すぐに検索フォームに反映されていると使い勝手がよくなります。
今回は、フォームを閉じる際に別フォームを最新化する機能をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
フォームサンプル
では、実際に作成した画面を先にご紹介しましょう。
以下の検索フォームを作成しました。

このフォームではレコードを検索し、さらに選択したレコードの詳細画面を開くことができます。

そして、フォームの閉じるボタンを押すと、再度先ほどの検索フォームに移動します。
これだけであればDoCmd.OpenFormやDoCmd.Closeなどを利用して比較的簡単に作成できます。
しかし、単純にフォームを開いたり閉じたるするだけですと、詳細フォームで変更した内容が検索フォームには即時反映されません。
それは、ACCESSの画面表示がテーブルやクエリを基にしており、元データが変更された際にフォーム側で変更が反映されるには、一度画面を開き直すかクエリを再実行するなどの処理が必要なためです。
詳細フォームを閉じた際に検索フォームを最新化する
そこで、詳細フォームを閉じた際に検索フォームを最新化するように、VBAで設定します。
売上伝票入力フォームの閉じるボタンのクリック時イベントに、以下のイベントプロシージャを設定しました。
Private Sub 閉じる_ボタン_Click()
DoCmd.Close
'検索フォームが開いていれば最新化
If SysCmd(acSysCmdGetObjectState, acForm, "売上検索") = True Then
[Forms]![売上検索].Requery
End If
End Sub
基本的には、売上伝票入力フォームを閉じる際に、
[Forms]![売上検索].Requery
で、売上検索フォームを最新化する、というプロシージャです。
フォーム名.Requeryで指定したフォームの表示を最新化することが可能です。
条件分岐で
If SysCmd(acSysCmdGetObjectState, acForm, "売上検索") = True Then
を記述しているのは、売上検索フォームが開いていない場合にエラーが出ないようにする対処です。
売上検索フォームが開いていない状態でRequeryを行ってしまうとエラーが発生します。
そのため、先に売上検索フォームが開いているか否かを判定しているのです。
ここで利用しているSysCmdメソッドは、ACCESSのオブジェクトの状態を知ることができるメソッドです。
引数にacSysCmdGetObjectState、acFormと指定することで、指定したフォームが開いているか否かを判定できます。
以上、フォームを閉じる際に別フォームを最新化する機能をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に300以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

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