• ベストアンサー

ACCESS VBA ウィンドウを閉じる

ACCESS VBA の初心者です。 前に進まず困っておりまして申し訳ありませんが教えてください。 フォーム1にボタンをつけそのボタンを押すとフォーム2に画面遷移するように、作っています。 フォーム2に画面遷移した場合、フォーム1は不要になるので、画面遷移と同時にフォーム1を閉じたいのですが、うまく行きません。 docmd.close と言う命令を使うとフォーム1のボタンを押すと画面遷移先のフォーム2の方が一瞬表示されてすぐに閉じてしまいます。 どうしたら、フォーム2が表示されてフォーム1が同時に閉じる事ができるでしょうか?

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

下記で、問題なくフォーム1から、フォーム2を開き、 フォーム1を閉じます。(Access2000で確認しました) 取り合えず、下記の最小限のフォームで、動作確認してみて下さい。 フォーム1、コマンドボタン1個 ----フォーム1の全コード---- Option Compare Database Option Explicit Private Sub コマンド0_Click()  DoCmd.OpenForm "フォーム2"  DoCmd.Close acForm, "フォーム1" End Sub --------------------------- フォーム2は空のフォーム --------------------------------------------------------- >何がいけないのでしょうか・・・。 推測ですが、フォーム1の「読み込み解除時」のイベントが怪しいかも。 このイベントで、閉じる事をキャンセル出来ます。 その他の原因については、現時点では思いつきません。(^^; もう少し詳しい情報を頂けたら、何か分かるかも・・・ --------------------------------------------------------- 原因を特定するためのアドバイス(その1) ・On Error Resume Next は使わない(もし使っていれば) ・ブレークポイントを設定する(F9) ・ステップ実行で1行ずつ実行する(F8) --------------------------------------------------------- 原因を特定するためのアドバイス(その2) まず、フォームのバックアップを取る。(コピーして貼り付け) 関係無いと思われる部分から、ソースを少しずつ削除する。 問題のボタンと、そのイベントプロシージャは残しますが、 その他のコントロールや、イベントプロシージャは削除していきます。 少し削除して、動作確認。少し削除して、動作確認。・・・ これを不具合がなくなるまで、繰り返します。 フォーム2に関しても、不要な部分を削除していきます。 不具合がなくなれば、その直前に削除した部分が怪しい。

noname#47243
質問者

お礼

ありがとうございます。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

チクッと同じような現象を再現してみました。 フォーム1: Option Compare Database Option Explicit Private Sub コマンド0_Click() On Error GoTo err_コマンド0   DoCmd.OpenForm "フォーム2"   DoCmd.Close acForm, "フォーム1" Exit_コマンド0_Click:   Exit Sub err_コマンド0:   Resume Exit_コマンド0_Click End Sub フォーム2: Option Compare Database Option Explicit コード自体には問題はありません。 しかし、"フォーム2"の表示に失敗し"フォーム1"も閉じられないです。 原因は、DoCmd.OpenForm "フォーム2"でエラーが発生しているからです。 この場合、エラートラップの働きでDoCmd.Close acForm, "フォーム1"はスキップされます。 理屈の上では、これが一つの原因です。 理屈の上では、フォームの誤動作が二つ目の原因です。 肝心のコード全体を示されないと、この推測が当をえているのかも疑問。 なお、フォームの誤動作は、プロシージャの移動で発生します。 あちこちからプロシージャの切り貼りを繰り返せば、動作は保証されません。

noname#47243
質問者

お礼

ありがとうございます。

回答No.1

DoCmd.Close acForm, "フォーム1" としてください。 どのフォームを閉じるのかを指定しないと、アクティブなフォームを閉じることになります。 画面遷移直後ですと、アクティブなフォームはフォーム2になります。 このような場合は、なにを閉じるのかを指定することで対応します。

noname#47243
質問者

お礼

ありがとうございます。 実は >DoCmd.Close acForm, "フォーム1" と言うのも試してみたのですが、やはり閉じませんでした。 何がいけないのでしょうか・・・。