ACCESS VBAでフォームの表示を判別する方法
ACCESSでフォームを操作する際、別のフォームが開いているか否かを判別して処理を実行したいときがあります。
他のフォームの値を参照しているような処理では、そのフォームが開いていないとエラーになってしまうからです。
今回は、VBAでフォームの表示を判別する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
フォームが開いているか判定する方法
ACCESS VBAで特定のフォームが開いているか判定するには、Application.SysCmdメソッドを利用します。
以下のように記述することで、フォームが開いていればTrueを、閉じれていればFalseを返します。
SysCmd(acSysCmdGetObjectState, acForm, "フォーム名")
フォーム名の部分を変更すれば応用可能です。
フォームの表示判定利用例
実際にApplication.SysCmdメソッドを使った、フォームの表示判定利用例を説明します。
今回は、特定のフォームを閉じた際に別のフォームの表示を最新化する、という機能です。
以下は商品登録の検索フォームです。
複数の商品レコードが一覧表示されています。
ここから、特定のレコードを選択して情報を更新するための詳細フォームを開きます。
この際、商品検索フォームは開いたままで、別タブに以下の商品登録フォームが開くようにしています。
この画面で商品情報を更新します。
今回は単価を20,000円から30,000円に変更しました。
そして、商品登録フォームを閉じると、先に開いていた商品検索フォームの画面に戻ることになります。
しかし、商品検索フォームでは先ほど変更した単価が更新されていません。
これは、ACCESSではよく発生するのですがフォームを開いたままで別フォームでデータを更新しても、リアルタイムでは反映されない、という事象です。
実際には商品検索フォームを一度閉じて、再度開けば単価は更新されるのですが、即座に反映されないのは面倒ですよね。
そのため、商品登録フォームを閉じる際にDoCmd.ReQueryを使って商品検索フォームを最新化する、という処理を追加します。
商品登録フォームをデザインビューで開き、閉じるボタンのクリック時イベントにイベントプロシージャを設定します。
設定する内容は以下の通りです。
Private Sub 閉じる_ボタン_Click()
DoCmd.Close
If SysCmd(acSysCmdGetObjectState, acForm, "商品検索") = True Then
[Forms]![商品検索].Requery
End If
End Sub
内容を解説します。
まず、DoCmd.Closeで商品登録フォームを閉じます。
その後、商品検索フォームを最新化したいので、[Forms]![商品検索].Requeryを行っています。
しかし、この際に商品検索フォームが開いていないとエラーが出てしまいます。
そのため、先にIf文で商品検索フォームが開いているか否かを判定し、開いていれば上記のReQueryを実行し、開いていなければ実行せずに閉じる、という処理にしています。
以上、VBAでフォームの表示を判別する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。