• ベストアンサー

Access2002 閲覧フォームから入力フォームへのレコードの受け渡し

度々すみません。 Access初心者です。よろしくお願いします。 例えば「基本情報フォーム」から、「付帯データ入力フォーム」を起動する作りになっていたとします。 この場合、基本情報フォームは閲覧専用で、付帯データ入力フォームは入力用フォームになると思います。 しかし、コマンドボタンの追加ウィザードで両方のフォームで取り扱う「ID」で絞り込んで入力フォームを開こうとすると、うまく行きません。 単純に、入力フォーム単体で立ち上げると、入力できます。 やりたいことは単純で、閲覧フォーム上のIDを、入力用フォームのIDフィールドに表示させたいだけなのですが。。。 解決策をご存知の方がいらっしゃいましたら、ご教授お願いいたします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です > 入力用フォームのほうにはある「区分」が用意されており、区分コードをコンボボックスで選択する作りになっています。 > その場合でも、1つのフォームでできるのでしょうか? > 「表示フォーム」は区分コードに紐づいている「区分名」が表示されるようにしてあります。 コンボボックスの内容(連結列)が同じであれば、同様に既定値を設定できます。 コンボボックス名が「cbx01」だったとします。 表示の元となる区分テーブル「T区分」が以下だったとします。 区分コード 区分名 1      区分A 2      区分B 3      区分C 4      区分D 5      区分E コンボボックスの値集合ソースが SELECT 区分コード, 区分名 FROM T区分; 連結列:1 列数:2 表示フォームでの列幅: 0cm;2cm (1列目を表示しない:区分名だけ表示) 入力フォームでの列幅: 2cm;0cm (2列目を表示しない:区分コードだけ表示) この設定で、コンボボックスに表示されるものは変わりますが、連結されているものは「区分コード」になっているので、 Me.cbx01.DefaultValue = Screen.ActiveForm.cbx01 で既定値を設定することができます。 (起動元に同様のコンボボックスがあったとして) 表示用/入力用ともコントロールソースには「区分コード」に対応するフィールドを指定していると思いますので、問題なさそうな気がします。 なお、起動元に「区分名」しかない時とかは、その時のテキストボックス名を「txt1」とすると、 Me.cbx01.DefaultValue = _   DLookup("区分コード", "T区分", "区分名 = '" & Screen.ActiveForm.txt1 & "'") とすれば既定値として設定できます。 列幅(表示)の切り替えは、ColumnWidths で変更します。 列幅が上記例であるとすれば、 レコードがあったら、Me.cbx01.ColumnWidths = "0cm;2cm" 入力用なら、Me.cbx01.ColumnWidths = "2cm;0cm" と設定すれば、表示は切り替わります。

camo-tech
質問者

お礼

補足情報、ありがとうございました。 ちょっとチャレンジしたのですが、分岐先の2つのフォームに微妙な差異があり、うまく制御できませんでした。 どうもすみません。 もうすこしAccessになれたら、この情報を有効活用させていただきます。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

「基本情報フォーム」、「付帯データ入力フォーム」の両方に、テキストボックス名「ID」があったとします。 「付帯データ入力フォーム」の開く時イベントに以下を記述します。 Private Sub Form_Open(Cancel As Integer)   On Error Resume Next   Me.ID.DefaultValue = Screen.ActiveForm.ID End Sub 起動したフォームにある「ID」を、起動された方の「ID」の既定値として設定します。 「基本情報フォーム」からの起動に限定せず、「基本情報フォーム」に似通ったものからの起動でも動作します。 (但し「ID」には、同じ意味を持たせておく必要がありますが) 蛇足) 「付帯データ入力フォーム」の他に、表示項目が一緒の「付帯データ表示フォーム」があったとした場合、 開く時イベントに処理を追加すると、1つのフォームでできるようになります。 フォーム名を「付帯データ」と仮定した時、 起動する時の例) 表示対象のIDを条件指定します Private Sub ボタン_Click()   DoCmd.OpenForm "付帯データ", , , "ID=" & Me.ID End Sub 起動された側の開く時イベント例) IDの既定値に起動したフォームのIDを設定後、 表示対象がなかったらフォームを入力用に切り替え。 あったら追加を許可しないように。 Private Sub Form_Open(Cancel As Integer)   On Error Resume Next   Me.ID.DefaultValue = Screen.ActiveForm.ID   If (Me.Recordset.RecordCount = 0) Then     Me.AllowAdditions = True     Me.DataEntry = True   Else     Me.AllowAdditions = False   End If End Sub ※フォーム「付帯データ」は、全件表示できるようにしておく必要がありますが。  (「ID」が数値型の時の例となります:起動する時の "ID=" & Me.ID 部分)

camo-tech
質問者

お礼

ご回答ありがとうございました。 Activeなフォーム(元フォーム)のフィールドの値を先フォームで規定値として引っ張る、ということですね。 すごくわかりやすくて、参考になりました。 また、「蛇足」のほうですが、入力用フォームのほうにはある「区分」が用意されており、区分コードをコンボボックスで選択する作りになっています。 その場合でも、1つのフォームでできるのでしょうか? 「表示フォーム」は区分コードに紐づいている「区分名」が表示されるようにしてあります。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

基本情報フォーム:frm1 テキストボックス:frm1_txID 付帯データ入力フォーム:frm2 テキストボックス:frm2_txID とする。 基本情報フォームfrm1に単純に 付帯データ入力フォームfrm2を 開くボタンを設置。 付帯データ入力フォームfrm2に以下を貼り付け保存。 Private Sub Form_Open(Cancel As Integer) If IsLoaded("frm1") Then If Not IsNull(Forms![frm1]![frm1_txID]) Then Forms![frm2]![frm2_txID] = Forms![frm1]![frm1_txID] End If End If End Sub 'フォームが開かれているか確認する関数 '標準モジュールに置いてもよい Function IsLoaded(strFormName As String) As Boolean Const FORMCLOSED = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> FORMCLOSED Then IsLoaded = True Else IsLoaded = False End If End Function これで、frm1のテキストボックスに数値を 入れてfrm2を開くボタンを押すと開かれた frm2のテキストボックスにfrm1テキスト ボックスの数値が表示される。

camo-tech
質問者

お礼

ご回答ありがとうございます。 元フォームが開かれているか確認し、開かれていれば「ID」の値を開く先のフォームで引っ張ってきてコピーする、ということですね。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A