- ベストアンサー
クリックイベントでフォームが閉じない理由と対策
- 2回クリックしないとフォームが閉じない理由と対策について解説します。
- フォームを閉じるためのコマンドボタンのクリックイベントが1回では反応せず、2回目のクリックでフォームが閉じる現象が発生しています。
- この現象はフォームの名前を指定せずに閉じようとしているため起こるものであり、Me.Nameではなく具体的なフォーム名を指定することで1回のクリックでフォームを閉じることができます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
【対応策】 OpenFormでは、以下の構文を使用するようにします: DoCmd.OpenForm "Fフォーム", acNormal Closeでは、以下のどちらかの構文を使用します: DoCmd.Close acForm, "Fフォーム" DoCmd.Close acForm, Me.Name (または、「Const cForm As String = "Fフォーム"」と定数を宣言しておいて 「DoCmd.OpenForm cForm, acNormal」等とします) 【原因・理由】 ご推測の通り、原因はFフォームの開き方にあります。 実は、「Form_Fフォーム.Name」といったように「Form_Fフォーム」を何らかの 形で参照した場合、そのフォームが非表示で展開されてしまいます。 (「Form_Fフォーム.Visible = True」とすると、表示させることができます) さらに、この方法を使用した場合、同じフォームを同時に複数展開させることが 可能になります。 <参考> http://okwave.jp/qa/q7778972.html この結果、 1)Form_Fフォーム.Nameの参照により、Fフォームが非表示で展開 2)DoCmd.OpenFormにより、Fフォームが通常表示で展開 と、Fフォームは二重で開かれることになります。 そのため、DoCmd.Closeを呼び出した際は、 まず「1」によって、先に展開された非表示のFフォームが閉じられ、 2回目の呼び出しでようやく「2」の通常表示のFフォームが閉じられる、 ということになり、見た目としては「2回クリックしないと当該フォームが閉じない」 という動作になっている、ということです。 従って、OpenFormでは「Form_フォーム1」を参照するのではなく、冒頭に提示 したように定数式を使用します。 (なお、上記参考URLで触れているように、同じフォームを意図的に複数表示 したいなどの特殊な場合には、【OpenForm】は使わずに、【Form_Fフォーム】 の方法だけを使用します) また、これは「DoCmd.Close」を行う場合も同様で、そこで「Form_Fフォーム」を 参照してしまうと、表示済みのFフォームが閉じられる一方で、非表示のFフォーム が展開されてしまいます。 ですので、この場合も同様に定数式を使用するか、既に展開済みの「自身」を 参照する(=新たにFフォームが非表示で展開されたりしない)「Me.Name」を使用 します。 【余談】 「Form_Fフォーム.Name」を参照するだけで本当に非表示で展開されているか どうかは、以下の方法で確認できます: 1)開いているフォームを一旦全て閉じる 2)Ctrl+Gキーの同時押しなどでイミディエイト ウィンドウを開く 3)現在開いているフォームの数を確認するため、「?Forms.Count」と入力して Enterキーで改行 →次行に「0」が表示される 4)その次の行に、「?Form_Fフォーム.Name」と入力して、Enterキーで改行 →次行に「Fフォーム」が表示される 5)「?Forms.Count」と入力した行に戻って、Enterキーで改行 →次行に「1」が表示される(=1つのフォームが開かれている) 6)一番下の行に移動して、「?Forms(0).Name」と入力して、Enterキーで改行 →「Fフォーム」が表示される(=開かれたのがFフォームだとわかる)
お礼
回答ありがとうございました。