- ベストアンサー
VisibleとOpenFormは意味が同じ?
データベースにフォームが1つあります。 標準モジュールに Sub Visible() Form_フォーム1.Visible = True End Sub Sub OpenForm() DoCmd.OpenForm "フォーム1" End Sub を作り、どちらも実行させても同じ動きをします。(フォームが開きます) この二つは同じ動きをすると思っていいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1の方の回答と一部かぶりますが・・・(汗) > この二つは同じ動きをすると思っていいのでしょうか? 私の知る限りでは、主に以下の2点で、違いが発生します: 1)OpenFormでは名前を使ってFormsコレクションに追加されるが、 Visibleを使用した場合は、名前は使われない。 (前者では「Forms(0)」「Forms("フォーム1")」のどちらでも 参照可能だが、後者では「Forms(0)」でのみ参照可能) ※「Forms!フォーム1.Visible」がエラーになるのもこのためです: http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDotVsBangOperator.html (『定義』の標題以降を参照下さい) 2)Access組込の右クリックメニューを無効にしていない場合、 OpenFormでは「デザインビュー」(Access2007以降では 加えて「レイアウトビュー」も)が選択肢に含まれるが、 Visibleの場合はこの選択肢が表示されない。 「1」については、コレクションのインデックスはユニークでなければ ならないことによる制限と思われます。 つまり、No.1の方も紹介されている通り、Visibleの方では同じ フォームを同時に複数展開できる仕様となっており、名前では ユニークにならない可能性をはらむため、Formsコレクションに 対して名前をキーとして追加することができない、ということです。 (但し、同時に複数展開できるのは「New」キーワードを使用した 場合のみで、今回提示されたようにVisibleのみで展開する 場合は、1つのインスタンスしか生成できないようです) 「2」については、OpenFormでは「フォームビュー」「デザインビュー」 等の複数のビューを持つ「Formオブジェクト」そのものを直接 扱っているのに対して、Visibleの場合は「Formオブジェクト」で 定義された「フォームビュー」(又はデータシートビュー)を、メモリ 上にコピーして表示させている、ということではないかと思います。 なお、Visibleを使用した場合でも、DoCmd.Closeはエラーには なりません。 (Closeに関しては、そのデータベースにない名前を指定した場合 ですら、エラーになりません(汗): Access2003、Access2007で確認) 但し、No.1の方がご紹介の「Set Frm = New Form_フォーム1」 という構文を使用して、同一フォームのインスタンスを複数表示 させた場合、DoCmd.Closeでは意図したインスタンスを閉じること ができない、という問題があります。 (このフォーム1上に設置したコマンドボタンで、ボタンをクリックした インスタンスだけを閉じるようにする場合は、そのボタンのクリック 時イベントに、【フォーム名の指定を省略したDoCmd.Close】 を使用します: 「DoCmd.Close , , acSavePrompt」等) ですので、やはり私としてもVisibleによるフォームの起動は、 その方法が必要な場合に限って採用した方がよいと思います。 (同時に複数開く場合の他、モジュールレベルで 「Private WithEvents Frm As Form」 といった形で宣言して別のフォームにそのフォームで発生した イベントに合わせて実行するコードを記述する場合も、 この方法を採ります)
その他の回答 (1)
- hatena1989
- ベストアンサー率87% (378/433)
「Form_フォーム1」というのはクラス名になります。 VBAウィンドウの「プロジェクト エクスプローラ」で確認できます。 クラスは、フォームモジュールがないと生成されません。 フォームの「コード保持」プロパティが「いいえ」のフォームでは Form_フォーム1.Visible = True ではエラーになります。 クラスというのは設計図のようなものです。 それを元に実体(インスタンス)が作成されます。 Form_フォーム1.Visible = True というコードは実際は裏で下記のような処理が行われています。 Dim Frm As Form Set Frm = New Form_フォーム1 '設計図から実体を生成する Frm.Visible = True '実体の可視をはいにして表示する。 ただし、このように生成したフォームはAccessの標準の方法ではないので、 Forms!フォーム1 というような参照はできません。 MsgBox Forms!フォーム1!テキスト1 とするとエラーになります。また、 DoCmd.Close acForm, "フォーム1" としても閉じることはできません。 このように動作というか管理方法が異なってきます。 通常は標準の方法で使用するのをお勧めします。 クラスからインスタンスを生成する方法だと同じフォームを複数表示させることができますので、それが必要な時に使うことはあります。興味があれば、「同じフォームを複数表示する」をキーワードにWEB検索してみてください。
お礼
ありがとうございました。
お礼
ありがとうございました。