「AフォームからBフォームに値をセットする」ような処理があります。
このとき無条件にBフォームに値を代入する処理を記述すると、Bフォームが開いていなかったとき(値を入力できる状態ではなかったとき)はエラーが発生します。
こういった場合、エラーにならないように事前にフォームBの状態を確認する必要があります。
フォームの状態を調べるにはSysCmd()関数を使う
SysCmd()関数の仕様
SysCmd(acSysCmdGetObjectState, オブジェクトタイプ, オブジェクト名)
第一引数:オブジェクトタイプ
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″]