プロが教える店舗&オフィスのセキュリティ対策術

クリックイベントなのに、2回クリックしないとフォームが閉じないです。

フォームに閉じると言うコマンドボタンがあり、クリックイベントで

Private Sub cmd_閉じる_Click()
DoCmd.Close acForm, Me.Name
End Sub

としてるのですが、なぜか1回ボタンを押しただけではフォームが閉じません。
2回目押した時にフォームがとじます。
ダブルクリックでも閉じます。


Private Sub cmd_閉じる_Click()
'DoCmd.Close acForm, Form_Fフォーム.Name
End Sub
のように、フォーム名を指定すると1回のクリックで閉じます。
しかしMe.Nameだと2回目じゃないと閉じない理由がわかりません。

Fフォームは他フォームから
DoCmd.OpenForm Form_Fフォーム.Name, acNormal
で開いたから2回クリックしないと閉じないのでしょうか?

A 回答 (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://oshiete.goo.ne.jp/qa/7778972.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フォームだとわかる)
    • good
    • 1
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/01/18 20:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A