2009-09-22 9 views
9

どのようにしてあるフォームから別のフォームに値を渡すことができますか?例:ユーザ選択はリストからの組織であり、これによりユーザは旅行に関する様々な情報を入力できるようにする旅行形態を開く。ある場所では、訪問している組織の連絡先情報(POCの名前と電話だけ)を入力できる小さなポップアップフォームを追加したいと思います。MSAccess 2003 - あるフォームから別のフォームに値を渡すためのVBA

したがって、最初のフォームが選択画面から開いたときに、テキストボックスに隠されているIDが2つあります(一方はtripID、もう一方はOrgID)。これを2番目の小さなポップにどのように渡しますかその連絡先情報がそれに関連するIDを持つようにします。

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

+0

私はAccessで作業して以来、しばらくしていますが、他のフォームを呼び出し、モジュールレベル/フォームレベルの変数を設定してから、別のフォームを閉じることはできますか? –

答えて

16

最善のアプローチを助けることができていない変数の束を渡ししようとする:OpenArgsを使用してパラメータを渡すことについての詳細情報については

、参照。あまりにも多くのコードで、柔軟性がありません。たとえば、2つの値を渡す必要がある場合、その要件が5つの値に増加すると何年もかかりますか?価値観を維持して渡そうとするのは、あまりにも多くのコーディング作業です。

ms-accessの各フォームは、実際にコードで操作できるクラスオブジェクトです。したがって、ここでオブジェクトアプローチを使用すると、コードを少なく書くだけでなく、コードがよりクリーンでモジュラー化され、グローバル変数が不要になり、コードを異なるフォーム間で再利用できることがよくあります。ここで

はどのようにある:

一つの形態は、することができます(実際には、あなたも遅けれオンロードイベントとして使用することができます)上のオープンイベントの形で第二の形で別のフォームを起動する一般的に

PREVIOUSフォームオブジェクトへの参照を取得します。言い換えれば、オブジェクトアプローチをここで使用できます。フォーム上のロードイベントで、私達は行く、そして、

Option Compare Database 
Option Explicit 
dim frmPrevious  as form 

Set frmPrevious = Screen.ActiveForm 

さて、任意のコードをフォームのモジュールレベルで

は、フォームの私はとフォームオブジェクトを宣言する私たちのフォームでは、コード、イベント、コード内の前のフォームからパブリックとして宣言された変数などを自由に使用することができます。

したがって、以前のフォームのディスクへの書き込みを強制し、データを再ロードする場合。

frmPrevious.Refresh 

あなたが行く、その後、ID値を設定したい場合:

frmPrevious!ID = some value 

そして、あなた二つの形式ならば、あなたもこのようにそのフォームのPUBLIC変数としてフォームが以前宣言し、できることに注意してください

frmPrevious.frmPrevious!ID = some value 

だから、単純な形態は、各フォームのコードモジュール内のオブジェクトを宣言(またはあなたは、コード内の値を使用する必要があるものLESTで):深い、あなたが行くことができます。上記のことは、どのコードも前のフォームオブジェクトに対する準備が整っていることを意味します。フォームで恥骨として宣言された関数は、フォームのMETHODとなり、同じように実行することができます。

frmPrevious.MyCustomRefresh 

、あるいは請求書番号を生成し、セットアップする前のフォームを強制的にいくつかのオプションのようなもの:

frmPrevous.SetInvoice 

または frmPrevious.SetProjectStatusOn

だから、あなたは、前後の値とデータをシャッフルすることができないだけで、しかし、あなたは簡単にあなたがprevousフォームのコードで構築特徴や機能を実行することができます。

実際にコーディング標準として、私のフォームのMOSTには、MyRefreshという擬似関数があります。

このアプローチの美しさは、以前のフォームから+ use + set値を読み取ることができることに注意してください。これにより、コードで値を受け取るだけでなく、前の形式で値を設定することができます。したがって、このアプローチは双方向性です。フォーム間でデータと値を前後にシャッフルすることができます。もう1つの利点は、変数に限らず、フィールド、コントロールの値(イベント、プロパティ)などを使用できることです。

このアプローチは、今までのフォームの多くがあなたの手元にあることを意味します。

変数の全体を渡すようにしないでください。フォームへの参照を渡すとすぐに素敵な準備が整ったオブジェクトができ、このタイプのコーディングの問題は簡単になります。

+1

ありがとう!私は特に説明を感謝します。私は学ぶのに役立ちます!ありがとうアルバート! – Justin

+0

このアプローチは非常に面白いです。私は個人的には、開いているすべてのウィンドウのコレクションを保持する特定のオブジェクトと、ウィンドウがフォームのインスタンスとして宣言されている場所と、まったく同じようなもの(少なくとも精神的に)を使用します。これにより、標準フォームのメソッドやプロパティに加えて、特定の「ウィンドウ」メソッドとプロパティのセリフを持つことができます。 –

+1

これは素晴らしかったが、メモは1つだけだった。私はこれがアクティブなサブフォームへの参照を取得するために働いているとは思わない。参照は常にメインフォームになります。 – HK1

6

このように、ポップアップフォームから初期フォームでテキストボックスを参照するようになり、通常の方法:それができないように

Forms!frmInitialForm!tripID 
Forms!frmInitialForm!OrgID 

はしかし、これはしっかりと、最初のフォームにポップアップフォームをバインドアプリケーション内の他の場所で使用されます。

より良いアプローチはOpenArgsを使用することです:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID 

これは、ポップアップフォームに渡された文字列の中に、あなたの2つの値を配置します。分割関数を使用して、OpenArgの2つの値を解析することができます。 http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

+0

ありがとう!リソースもありがとう! – Justin

関連する問題