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

当ページのリンクには広告が含まれています。
Accessフォーム状態
  • URLをコピーしました!

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

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

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

目次

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

SysCmd()関数の仕様

SysCmd(acSysCmdGetObjectState, オブジェクトタイプ, オブジェクト名)

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

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

オブジェクト定数
テーブルacTable0
クエリacQuery1
フォームacForm2
レポートacReport3
マクロacMacro4
モジュールacModule5

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

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

戻り値:状態(定数)

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

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

定数状態
acObjStateOpen1開いている
acObjStateDirty2変更後保存されていない
acObjStateNew4新しい

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

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

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

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

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

代入エラー

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

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

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

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次