アプリ版:「スタンプのみでお礼する」機能のリリースについて

データベースにフォームが1つあります。

標準モジュールに
Sub Visible()
Form_フォーム1.Visible = True
End Sub

Sub OpenForm()
DoCmd.OpenForm "フォーム1"
End Sub

を作り、どちらも実行させても同じ動きをします。(フォームが開きます)
この二つは同じ動きをすると思っていいのでしょうか?

A 回答 (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/AcTip …
  (『定義』の標題以降を参照下さい)
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」
 といった形で宣言して別のフォームにそのフォームで発生した
 イベントに合わせて実行するコードを記述する場合も、
 この方法を採ります)
    • good
    • 1
この回答へのお礼

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

お礼日時:2012/11/11 23:04

「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検索してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/11 23:04

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