• ベストアンサー

ACCESS VBA ウィンドウを閉じる

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

noname#47243
noname#47243

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

  • ベストアンサー
  • 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" と言うのも試してみたのですが、やはり閉じませんでした。 何がいけないのでしょうか・・・。

関連するQ&A

  • VBAによってAccessが壊れた!

    AccessのVBAでプログラムを組んでたらあるフォームの操作処理をしたらいきなりAccessに異変が起こり、フォームのデザイン等の編集・コーディングが一切できなくなりました(VBEが開かない)。 強引にフォームを呼んでも読み取り専用になっていて操作ができなくなってしまいました。フォームを開いても実行画面しか出なくなりました。新規作成もできません。(ボタンが全てイネイブルになってます) こういう場合どうしたらいいのでしょうか? ちなみにAccessのフォームは、現在のフォームから他のフォーム(開いている)を閉じる命令をすることはできるのでしょうか?(それをしたいがためにいろいろな方法を試していたらこうなってしまいました。そのコードをうかつにも保存した私にも責任はあるのですが・・・ちなみにDocmd.closeで墓穴を掘りました。やはり自分のフォームしか消せないんでしょうか?) バージョンはAccess2003を使っています。

  • Access2003 をVBAで動かしています。。

    Access2003 をVBAで動かしています。。 あるフォーム( Aフォーム)を開いたときに DoCmd.Maxmise つまり全画面(フルサイズ) になるようにしています。 このフォームは表示したまま、別のフォーム(12cm×15cm Bフォーム)をその上に 重ねて表示したいのですが、どうやっても Bフォームもフルサイズになってしまい、 Aフォームが隠れてしまいます。 Bフォームの大きさ指定をどうすればできるのか教えてください。

  • Access2013 VBA 複数の画面の遷移

    複数の画面のメニューの遷移をスル場合、みなさんは、フォーム名をベタ書きで書いてらっしゃるのでしょうか。それとも、遷移元のフォームの名前を取得して戻るボタンをおした時に、そのフォームをVisible = trueにしたりしているのでしょうか。 私の場合には、ModuleにPublicで宣言した各フォームの階層事の変数に遷移元の名称の場合にだけ、そのフォームの名前を変数に保存して、戻るボタンでそのフォームを表示する処理をしています。 Private Sub Form_Load module.Public変数 = module.Public遷移元の画面名 End Sub Private Sub Cmd戻るボタン Forms(module.Public遷移元の画面名).visible = true DoCmd.Close acForm, Me.Name End Sub しかし、この画面の階層毎に変数をつくり、それに遷移元の画面名をセットするのも面倒くさいやり方で、これよりも何か楽な汎用性のあるやり方はありますでしょうか? よろしくお願いします。

  • アクセス2007 VBA 並べ替え

    テーブル1のフィールド1にデータを入れ それを元に帳票フォームを作成しました。 フォームヘッダー部分に 昇順ボタンと降順ボタンを作り、 ボタンを押すごとに並び替えを行いたいのですが どのようなVBAコードを書けばいいのかわかりません。 命令分としては、 「フォームに表示されるテーブル1のフィールド1データの 昇順に並べ替える」です。 SQLを使う方法ではなく、 DocmdかacCmdを使う方法が希望です。 アクセスのヘルプの ----------------------------------------- Access 開発者用リファレンス Form."OrderBy/並べ替え" プロパティ ----------------------------------------- を見ると、 ----------------------------------------- 構文 式.OrderBy 式 Form オブジェクトを表す変数です。 ----------------------------------------- と書いてありますがこの式がわからないのでご教授よろしくお願いします。

  • アクセス2003 VBAについて

    アクセス2003VBA初心者ですが、誰が解る方詳しく教えていただけますか? 検索フォームで検索した結果を、別フォームに表示を行い、詳細ボタンを押下すると、選択したレコードの詳細フォームを開く すみません。質問事体が言葉らずかも知れませんが、よろしくお願いいたします。

  • トグルスイッチをVBAでコントロール

    マイクロソフトアクセス2000で作成しています。 メインフォームとサブフォームを使っています。 メインフォームにあるトグルスイッチを押した時に、サブフォームの最新レコードに移動したいと 考えています。 ボタンを押したときに、VBAの命令は動くのですがトグルスイッチが押した状態になりません。 VBAで押した状態にしようとしても命令言語がわかりません。 ご教授をお願い致します。 Me.トグルスイッチ1=true <- ここが動きません。 DoCmd.GoToControl "サブフォーム名" DoCmd.GoToRecord , , acNewRec

  • Access VBAで

    VBAの超初心者です。 Accessのフォームでコマンドボタンを押すと、決まった文字が入力できるフォームを作りたいと思っています。 クリック時のイベントプロシージャーはどのように記入すればよいのでしょうか。 ど素人な質問ですみません。

  • アクセスのマクロ

    友人がアクセスで作ったマクロです。3行目で止まってしまいます。どこが悪いのでしょうか。(私は全くの素人でわかりません) Private Sub 記載事項入力ボタン_Click() DoCmd.Close acForm, "初期画面", acSaveYes DoCmd.OpenForm "入力フォーム", acNormal ←ここ End Sub

  • 【ACCESS】フォームのレコードソースのクエリを動的に書き直したときの、フォームの再描画

    ACCESS2002 帳票フォームのレコードソースにクエリを指定しています。 フォーム上のコマンドボタンを押したイベントで、その レコードソースとしているクエリのSQLを書き直しています。 問題は、その書き直したクエリをもとにして画面をもう一度 表示させなおしたい(リフレッシュさせたい)ということです。   docmd.close acForm,"フォーム名"   docmd.open "フォーム名" とすると、書き直したクエリの内容でフォームが表示されます。 フォームを閉じる→フォームを開くとしないで、フォームを リフレッシュさせる方法はないのでしょうか?

  • Access VBA ・Formについて

    Access VBA及び、フォームのデザインについてお尋ねいたします。 Access VBAを活用したフォーム画面の作成を予定しています。 フォーム画面は、Excelのような表形式とし、1マスごとに表示させる内容を指定したり、処理で使用する行だけを表示してフォームの高さを変更したりしたいです。 フォームで表示した内容や入力した内容は配列型変数で取り扱い、テーブルとは非連結のフォームにしたいです。 どなたかどのようなフォーム画面を作成すればいいかお分かりの方いますでしょうか? 11列×50行の表を作成したいです。

専門家に質問してみよう