プロが教えるわが家の防犯対策術!

初めての質問を投稿させていただきます。l
ACCESSのVBAにて分からないことがあるので、
質問を投稿させていただきました。

以下のようなテーブルがあります。
名称:番号:管理番号:価格
cake|NO.1|C1|200
cake|NO.2|C2|200
chocolate|NO.1|C3|300
chocolate|NO.2|C4|300
chocolate|NO.3|C5|300
cookie|(空白)|C6|100
フォーム上に、コンボボックスが二つ設置されており
最初のコンボボックスでは、cake、chocolate、cookieを選択することができます。
また、二つ目のコンボボックスでは最初のコンボボックスで選択した名称に対する番号を選ぶことが出来ます。
------------------以下が疑問点です-------------------------
このフォームにはそれ以外にテキストボックスが設定されています。
名称と番号を設定した後に管理番号(重複なし)をテキストボックスに表示。
その後、管理番号を元に価格もテキストボックスに表示したいと考えておりますが、どのようなプログラムを組めばよろしいでしょうか?

A 回答 (4件)

3つ目のコンボボックスを用意して、それが前の2つのコンボボックスの情報を条件に取ったらどうでしょうか?


1,2つ目のコンボボックスを更新するたびに3つ目のコンボボックスをRequeryするようにすればいいのではないかと思います。
3つ目のコンボボックスでは前の条件を受けて管理番号と価格だけの一覧が表示されます。
    • good
    • 0

> なぜ、連結列列を2としたか、考えてみてください。



大事なところは2度言いましたよ。。。 は冗談ですが


> (ご質問から想定される私の中での考える動きは確認したつもりでおりますが、意図と違っていましたらごめんなさい)

何か日本語になっていないですね


(ご質問から、・・・私の中で想定した動きは確認したつもりでおりますが、意図と違っていましたらごめんなさい)

まだ日本語化になってないですかね。
    • good
    • 0

> cookie|(空白)|C6|100が、対処できないように思えるのですが



引っかかる処だと思います。

> 連結列:2 (一応、管理番号を連結させておきます)


なぜ、連結列列を2としたか、考えてみてください。

連結列:1であれば、
>  If (Not IsNull(Me.cbx02)) Then

は、NULL 状態であり、判別すらできませんが、Me.cbx02 自体が Nulll にならない連結列を指定することで回避できていると思うのですが。
ただ、この方法では登録されているものを参照するしかない・・・に限定されます。

一度、実際に設定され動きを見てみてはいかがでしょうか。
(ご質問から想定される私の中での考える動きは確認したつもりでおりますが、意図と違っていましたらごめんなさい)
    • good
    • 0
この回答へのお礼

SQLでは、ありませんが意見を参考に実現することが出来ました。
何回もフォローしていただきありがとうございます。

今後もACCESS頑張りたいと思います。

お礼日時:2009/01/06 20:51

2つのコンボボックスから、抽出条件を組み立てて DLookup 関数で求めることもできると思いますが、2つ目のコンボボックスを作る際に必要となる値を取り込んでおく方法もあると思います。



以下は後者の方法での参考例となります。

前提)
・テーブル名を「T_TBL」とします。
・1つ目コンボボックス(名前:cbx01)
 値集合ソース:
  SELECT 名称 FROM T_TBL GROUP BY 名称 ORDER BY 名称;
・2つ目コンボボックス(名前:cbx02)
 列数:3
 列幅:2cm;0cm;0cm (1列目だけを表示します)
 連結列:2 (一応、管理番号を連結させておきます)
 値集合ソース:空欄のまま(1つ目コンボボックスが選択された時に作ります)
 (1つ目コンボボックスの名称を条件に、番号,管理番号,価格 の順で抽出します)
・管理番号表示用テキストボックス(名前:txt01)
・価格表示用テキストボックス(名前:txt02)


以下VBA記述例)

' 管理番号,価格 表示用
Private Sub txt_Set()
  If (Not IsNull(Me.cbx02)) Then
    Me.txt01 = Me.cbx02.Column(1)
    Me.txt02 = Me.cbx02.Column(2)
  Else
    Me.txt01 = ""
    Me.txt02 = ""
  End If
End Sub

Private Sub Form_Load()
  Me.cbx01 = Null
  Me.cbx02.RowSource = ""
  Me.cbx02 = Null
  Call txt_Set
End Sub

' 1つ目コンボボックスクリック時処理
'  (2つ目コンボボックスの設定)
Private Sub cbx01_Click()
  Const sqlTop = "SELECT 番号, 管理番号, 価格 FROM T_TBL WHERE ([名称] = '"
  Const sqlEnd = "') ORDER BY 番号;"

  If (Not IsNull(Me.cbx01)) Then
    Me.cbx02.RowSource = sqlTop & Me.cbx01 & sqlEnd
  Else
    Me.cbx02.RowSource = ""
  End If
  Me.cbx02 = Null
  Me.cbx02.Requery
  Call txt_Set
End Sub

' 2つ目コンボボックスクリック時処理
Private Sub cbx02_Click()
  Call txt_Set
End Sub

この回答への補足

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

回答された方法だとコンボボックスの二つ目が空欄でなければ、
テキストボックスに該当する情報を表示させるといった内容だと把握しました。

しかし、この方法では、tableの一番最後にある
cookie|(空白)|C6|100

が、対処できないように思えるのですが、いかがでしょうか?

補足日時:2009/01/04 19:12
    • good
    • 0

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