牛、豚、鶏、どれか一つ食べられなくなるとしたら?

度々すみません。

Access初心者です。よろしくお願いします。

例えば「基本情報フォーム」から、「付帯データ入力フォーム」を起動する作りになっていたとします。

この場合、基本情報フォームは閲覧専用で、付帯データ入力フォームは入力用フォームになると思います。

しかし、コマンドボタンの追加ウィザードで両方のフォームで取り扱う「ID」で絞り込んで入力フォームを開こうとすると、うまく行きません。
単純に、入力フォーム単体で立ち上げると、入力できます。

やりたいことは単純で、閲覧フォーム上のIDを、入力用フォームのIDフィールドに表示させたいだけなのですが。。。

解決策をご存知の方がいらっしゃいましたら、ご教授お願いいたします。

A 回答 (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"
と設定すれば、表示は切り替わります。
    • good
    • 0
この回答へのお礼

補足情報、ありがとうございました。

ちょっとチャレンジしたのですが、分岐先の2つのフォームに微妙な差異があり、うまく制御できませんでした。

どうもすみません。

もうすこしAccessになれたら、この情報を有効活用させていただきます。

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

お礼日時:2010/03/02 14:50

「基本情報フォーム」、「付帯データ入力フォーム」の両方に、テキストボックス名「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 部分)
    • good
    • 0
この回答へのお礼

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

Activeなフォーム(元フォーム)のフィールドの値を先フォームで規定値として引っ張る、ということですね。
すごくわかりやすくて、参考になりました。

また、「蛇足」のほうですが、入力用フォームのほうにはある「区分」が用意されており、区分コードをコンボボックスで選択する作りになっています。

その場合でも、1つのフォームでできるのでしょうか?
「表示フォーム」は区分コードに紐づいている「区分名」が表示されるようにしてあります。

お礼日時:2010/03/01 11:53

基本情報フォーム: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テキスト
ボックスの数値が表示される。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

元フォームが開かれているか確認し、開かれていれば「ID」の値を開く先のフォームで引っ張ってきてコピーする、ということですね。

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

お礼日時:2010/03/01 11:35

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

関連するカテゴリからQ&Aを探す