• ベストアンサー

VisibleとOpenFormは意味が同じ?

データベースにフォームが1つあります。 標準モジュールに Sub Visible() Form_フォーム1.Visible = True End Sub Sub OpenForm() DoCmd.OpenForm "フォーム1" End Sub を作り、どちらも実行させても同じ動きをします。(フォームが開きます) この二つは同じ動きをすると思っていいのでしょうか?

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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」  といった形で宣言して別のフォームにそのフォームで発生した  イベントに合わせて実行するコードを記述する場合も、  この方法を採ります)

BJLUEUYCT
質問者

お礼

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

その他の回答 (1)

回答No.1

「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検索してみてください。

BJLUEUYCT
質問者

お礼

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

関連するQ&A