- ベストアンサー
【ACCESS VBA】フォームを開く際の実行時エラー7874の原因と対処法
- ACCESS VBAでフォームを開いている際に発生する実行時エラー7874の原因と対処法について解説します。
- フォームA(親)→フォームB(子)→フォームC(孫)と順番にフォームを開いている場合、フォームCを閉じると親フォームのオブジェクトが見つからずエラーが発生します。
- このエラーの原因は、フォームBでフォームCを開く際に指定している条件に問題があることが考えられます。また、一時的にエラーが発生しても再度実行すると正常に動くこともあります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>フォームCではテキストボックス(非連結)に入力された値をSQL文でDBに反映し、それを再度呼び出し、フォームBのSPREAD(エクセルの表のようなもの?)の指定した行に書き出しています。 書き出した時にフォーカスがフォームBに移ってフォームCを閉じる時にフォームBを閉じようとしてしまっているのでしょうか?しかし、上のような書き込み操作をせずに、ただフォームCを閉じても同じエラーが出ます。 フォームCを引くときにダイアログにせずに開いてください。 たぶん、ダイアログでフォームCが開かれてフォームBのコードが中断されています。そのときにフォームBに関係する操作を行うため、今までのコード関係が破棄され新たにその操作に対するコードが実行されるのだと思います。 この時点で、ダイアログのフォームCが閉じたときに戻る呼び出し点が無くなっているために前のコード戻ることが出来ずエラーになったと思われます。 フォームBのDoCmd.OpenForm "フォームC", , , , acFormAdd, acDialogのあとで msgbox "てすと" を入れてみてください。 また フォームBのDoCmd.OpenForm "フォームC", , , , acFormAdd のあと msgbox "てすと" と動きを比較してみてください。 またCloseイベントはそのフォーム等が閉じようとするときに発生し、UnLoadイベントはメモリ等から解放されるときに発生します。 上記の理由でClose時には元のコードに戻る準備が出来ていない状態でフォームBに操作を行うためコードの継続が出来ない状態にっているが、UnLoadイベント時には元の状態に戻る上でコードが継続されるためうまくいっているのではないでしょうか。
その他の回答 (1)
- keikan
- ベストアンサー率42% (75/176)
>ひとつわかったのは動く時にはフォームCを閉じた時に フォームBのDoCmd.OpenForm "フォームC", , , , acFormAdd, acDialogの部分の次に帰っているということです。 規程の動作です。フォームCがacDialogで開かれているためにフォームが開いた時点で制御がフォームCに移ります。その後フォームCを閉じた時点でフォームを開いたコマンド以降が実施されます。 acDialog以外であればコードは進みます。 問題としてはフォームCがいつどのように閉じられ(クローズボタンまたはクローズコマンドなど)ているかです。 このときにフォームBがどのようになっているかです。 (ただ確認したところフォームBが閉じられていてもコードとしてのオブジェクトが残っていればエラーは出ないみたいです、先ほどの流れで行けばフォームを開いた直後のフォームBのコードに戻れればエラーは出ない。) フォームCでは何が行われていますか?
お礼
Keikanさん、いつもお返事ありがとうございます。 フォームCではテキストボックス(非連結)に入力された値をSQL文でDBに反映し、それを再度呼び出し、フォームBのSPREAD(エクセルの表のようなもの?)の指定した行に書き出しています。 書き出した時にフォーカスがフォームBに移ってフォームCを閉じる時にフォームBを閉じようとしてしまっているのでしょうか?しかし、上のような書き込み操作をせずに、ただフォームCを閉じても同じエラーが出ます。 あと、もう一点気になったのが、フォームCのCloseイベントで、フォームCのテキストボックスなどのコントロールやパブリック変数を初期化したり、フォームBを開くコードを書いているのですが、Unloadイベントに同じ内容を書いたところ動くようになりました。 これといった原因がはっきりとせず、困っています。
補足
たびたびすみません。 フォームCでクローズ処理がおこるのは、変更処理が終わったあとにDoCmd.Closeと呼び出すのと、閉じるボタンをクリックした時にDoCmd.Closeを呼び出しています。
お礼
keikanさん、お返事ありがとうございました。 お礼が大変遅くなってしまいすみませんでした。 教えていただいたようにしてみたところうまくいきました。問題が解決できてよかったです。 ありがとうございました。