Access

VBAでフォームが開いているかどうか確認する方法

Accessフォーム状態

「AフォームからBフォームに値をセットする」ような処理があります。

このとき無条件にBフォームに値を代入する処理を記述すると、Bフォームが開いていなかったとき(値を入力できる状態ではなかったとき)はエラーが発生します。

こういった場合、エラーにならないように事前にフォームBの状態を確認する必要があります。

フォームの状態を調べるにはSysCmd()関数を使う

SysCmd()関数の仕様

第一引数:オブジェクトタイプ

SysCmd()関数はフォームだけでなく、クエリーやレポート、マクロの状態も確認できます。状態を確認したいオブジェクトの定数を第一引数に指定します。

オブジェクト 定数
テーブル acTable 0
クエリ acQuery 1
フォーム acForm 2
レポート acReport 3
マクロ acMacro 4
モジュール acModule 5

第二引数:オブジェクト名

第二引数のオブジェクト名は文字列で指定します。

戻り値:状態(定数)

以下の定数の組み合わせを返します。組み合わせなので、3や5も戻ります。

(例)フォーム変更後、保存されていない状態の戻り値は3です。

定数 状態
acObjStateOpen 1 開いている
acObjStateDirty 2 変更後保存されていない
acObjStateNew 4 新しい

オブジェクトが開いていないか、または存在しない場合は、SysCmd メソッドは 0 を返します。

フォームが開いていたら値を代入するサンプルスクリプト

実はデザインモードで開いていもSysCmd()関数は1を返します。

デザインモードで開いているときに値を代入するとエラーになります。

代入エラー

なので、上記のサンプルプログラムも不完全と言えば不完全ですが、エンドユーザーがデザインビューで開いていることまで予期できなくてもまぁいいのかな?とは思います。

ACCDEファイル(実行形式ファイル)の提供やランタイム版での提供であれば、そもそもデザインビューは使えません。

念のためエラートラップでシステムエラーが表示されないようにしておけば問題ないでしょう。

ABOUT ME
アズビーパートナーズ
アズビーパートナーズ
プログラマーと社内SEとしての経験を活かして、 情報システム部門のご相談を承ります。 得意な分野はAccessによる短納期開発、 BIツール(QlikSense/QlikView)の開発です。 現在はCMSを利用したホームページの作成にも力を入れています。