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/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」
といった形で宣言して別のフォームにそのフォームで発生した
イベントに合わせて実行するコードを記述する場合も、
この方法を採ります)
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検索してみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
モーダルフォームとモードレス...
-
ExcelVBAのユーザーフォームの...
-
クリックイベントなのに、2回ク...
-
ユーザーフォームのテキストボ...
-
VBAでユーザーフォームを再表示...
-
エクセルVBAのフォームを最...
-
Form_Load と Form_Activate の...
-
フォームウィンドウを最前面に...
-
Hideについて(.NET)
-
複数モニタ使用時のフォームの...
-
エクセルのVBAでユーザーフォー...
-
accessのフォーム上でで画像を...
-
テキストボックス入力データの...
-
Microsoft Formsの「個人情報や...
-
'ユーザーフォーム右上隅の[×...
-
アクセスのUserFormにはInitial...
-
VB.NETでフォームロード中のエ...
-
ユーザーフォームのコピー?
-
MSGBOXのフォント大きさ変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームのテキストボ...
-
クリックイベントなのに、2回ク...
-
MSGBOXのフォント大きさ変更
-
VBAでユーザーフォームを再表示...
-
Hideについて(.NET)
-
Form_Load と Form_Activate の...
-
モーダルフォームとモードレス...
-
コントロールの存在確認
-
ユーザーフォーム上に現在日時...
-
【VBAユーザーフォームで閉じる...
-
エクセルVBAのフォームを最...
-
ACCESSのフォーム、開くんです...
-
Microsoft Formsの「個人情報や...
-
VBA(エクセル)のユーザー...
-
フォームウィンドウを最前面に...
-
ユーザーフォームのラベルに時...
-
'ユーザーフォーム右上隅の[×...
-
Excelにて、ユーザーフォームで...
おすすめ情報