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 を返します。

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

If SysCmd(acSysCmdGetObjectState, acForm, "フォームA") = 1 then
  Forms![フォームA]![コントロール名]="テスト"
End If

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

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

代入エラー

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

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

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

\逆引き辞書があると便利です/
[itemlink post_id=”1386″]

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。