• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームのOPENとCLOSE(ACCESS VBA))

【ACCESS VBA】フォームを開く際の実行時エラー7874の原因と対処法

このQ&Aのポイント
  • ACCESS VBAでフォームを開いている際に発生する実行時エラー7874の原因と対処法について解説します。
  • フォームA(親)→フォームB(子)→フォームC(孫)と順番にフォームを開いている場合、フォームCを閉じると親フォームのオブジェクトが見つからずエラーが発生します。
  • このエラーの原因は、フォームBでフォームCを開く際に指定している条件に問題があることが考えられます。また、一時的にエラーが発生しても再度実行すると正常に動くこともあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.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イベント時には元の状態に戻る上でコードが継続されるためうまくいっているのではないでしょうか。

000200b
質問者

お礼

keikanさん、お返事ありがとうございました。 お礼が大変遅くなってしまいすみませんでした。 教えていただいたようにしてみたところうまくいきました。問題が解決できてよかったです。 ありがとうございました。

その他の回答 (1)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

>ひとつわかったのは動く時にはフォームCを閉じた時に フォームBのDoCmd.OpenForm "フォームC", , , , acFormAdd, acDialogの部分の次に帰っているということです。 規程の動作です。フォームCがacDialogで開かれているためにフォームが開いた時点で制御がフォームCに移ります。その後フォームCを閉じた時点でフォームを開いたコマンド以降が実施されます。 acDialog以外であればコードは進みます。 問題としてはフォームCがいつどのように閉じられ(クローズボタンまたはクローズコマンドなど)ているかです。 このときにフォームBがどのようになっているかです。 (ただ確認したところフォームBが閉じられていてもコードとしてのオブジェクトが残っていればエラーは出ないみたいです、先ほどの流れで行けばフォームを開いた直後のフォームBのコードに戻れればエラーは出ない。) フォームCでは何が行われていますか?

000200b
質問者

お礼

Keikanさん、いつもお返事ありがとうございます。 フォームCではテキストボックス(非連結)に入力された値をSQL文でDBに反映し、それを再度呼び出し、フォームBのSPREAD(エクセルの表のようなもの?)の指定した行に書き出しています。 書き出した時にフォーカスがフォームBに移ってフォームCを閉じる時にフォームBを閉じようとしてしまっているのでしょうか?しかし、上のような書き込み操作をせずに、ただフォームCを閉じても同じエラーが出ます。 あと、もう一点気になったのが、フォームCのCloseイベントで、フォームCのテキストボックスなどのコントロールやパブリック変数を初期化したり、フォームBを開くコードを書いているのですが、Unloadイベントに同じ内容を書いたところ動くようになりました。 これといった原因がはっきりとせず、困っています。

000200b
質問者

補足

たびたびすみません。 フォームCでクローズ処理がおこるのは、変更処理が終わったあとにDoCmd.Closeと呼び出すのと、閉じるボタンをクリックした時にDoCmd.Closeを呼び出しています。

関連するQ&A

専門家に質問してみよう