• 締切済み

Accessで、入力内容に応じたリスト参照をしたい

いつも大変お世話になっております。m(_ _)m 質問させてください。 Accessで、入力内容に応じてあるフィールドで参照するリストを変更させたいのですが、難しい設定や記述が必要でしょうか? マスタテーブルに以下の情報を入れておきます 品名/値段 A・・・100円 A・・・200円 B・・・300円 B・・・400円 次に、別のテーブルを作成します そのテーブルには、「品名」「値段」を入力するわけですが 「値段」のフィールドには、リストボックス(またはコンボボックス)を設定しておき、「品名」を「A」と入れたら、「値段」のフィールドでリストボックスに表示される選択肢を「100円と200円」 品名を「B」と入力したら、リストボックスの選択肢は「300円と400円」というように、入力する値によって瞬間的に参照する値を変更したいのですが、可能でしょうか? できるだけ具体的に回答をお願いします。 お手数おかけします。よろしくお願いします。

みんなの回答

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>「このフォームまたはレポートで指定されているレコードソース・・・・は存在しません」というメッセージが出てうまくいきません。 テストデータを作って確認しましたが、こちらでは正常でした。 (コンボボックスと、リストボックスの両方でテスト、Access2000) 原因が分からないので、とりあえず、 Private Sub 品名_AfterUpdate()  debug.print "SELECT 値段 FROM マスタテーブル WHERE 品名='" & [品名] & "'" End Sub などで、SQL文の内容を出力して、正常か確認してみてください。 (もしよろしければ、この部分のソースと、出力されるSQL文を補足してください。) また、そのSQL文を元にクエリを作ってみて、 レコードが選択できているか、確認してみてください。 SQL文からクエリを作るのは、 クエリを新規作成し、テーブルは追加せず、 [表示]→[SQLビュー]にして、SQL文を直接記述します。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

#1さんとほぼ同じですが・・・ 値段コンボボックスの「値集合タイプ」を「テーブル/クエリ」にすれば、 SQL文を直接入れることが出来ます。 Private Sub Form_Current()   If Not Me.NewRecord Then     Me.値段.RowSource = "SELECT 値段 FROM マスタテーブル WHERE 品名='" & [品名] & "'"   End If End Sub Private Sub 品名_AfterUpdate()   Me.値段.RowSource = "SELECT 値段 FROM マスタテーブル WHERE 品名='" & [品名] & "'"   If DCount("*", "マスタテーブル", "品名='" & [品名] & "' AND '' & 値段='" & Me.値段 & "'") = 0 Then     Me.値段.Value = Me.値段.ItemData(0)   End If End Sub 注:DCount関数は、#1の回答にある、DBCount関数ではありません。 名前も機能も似てますが、こちらは標準の関数です。

xchoxcho
質問者

お礼

お返事が遅くなってすみません。 上記の方法を試してみましたがうまくいきません。 テーブルの「値集合タイプ」を「テーブル/クエリ」にし、「値集合ソース」に上記の記述をし、該当するテーブル名・フィールド名等に変更したのですが、品名を入力し、コンボボックスを参照しようとすると、 「このフォームまたはレポートで指定されているレコードソース・・・・は存在しません」というメッセージが出てうまくいきません。 方法がまずかったのでしょうか? お手数おかけします。再度教えていただけると助かります。

noname#140971
noname#140971
回答No.2

さて、僅か7行程度で目的を実現するプログラムコードを書くには、諸手続きを関数化することです。 次は、そういう目的を持って作成した DBSelect関数とDBCount関数です。 Public Function DBSelect(ByVal strQuerySQL As String) As String On Error GoTo Err_DBSelect   Dim I   As Integer   Dim J   As Integer   Dim R   As Integer   Dim C   As Integer   Dim M   As Integer   Dim N   As Integer   Dim rst  As ADODB.Recordset   Dim fld  As ADODB.Field   Dim Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       ' --------------       ' 配列を再宣言       ' --------------       M = .RecordCount - 1       N = .Fields.Count - 1       ' ------------------------------------       ' 列情報を For-Next で配列に代入する       ' ------------------------------------       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C) & ";"         Next C         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DBSelect = Datas   Exit Function Err_DBSelect:   M = 0   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function Public Function DBCount(ByVal strField As String, _             ByVal strTable As String, _             Optional ByVal strWhere As String = "") As Variant On Error GoTo Err_DBCount    Dim N    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = Nz(.Fields(0), 0)      End If    End With Exit_DBCount: On Error Resume Next    rst.Close    Set rst = Nothing    DBCount = N    Exit Function Err_DBCount:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBCount End Function

xchoxcho
質問者

お礼

お返事が遅くなりまして申し訳ありませんでした。 懇切丁寧な回答、本当にありがとうございました。 まだ成功したわけではありませんが・・・ 挑戦してみます。

noname#140971
noname#140971
回答No.1

丸投げの質問はルール違反です。 多少、丸投げ臭いですよ。 さて、ここでは、コンボボックスを利用する例を示します。 <価格リスト> ID_____品名___値段 1______A________\100 2______A________\200 3______B________\300 4______B________\400 ところで、DBSelect関数をイミディエイトウィンドウでテストしてみましょう。 [イミディエイト] ? DBSelect("SELECT 値段 FROM 価格リスト WHERE 品名='A'") 100;200; ? DBSelect("SELECT 値段 FROM 価格リスト WHERE 品名='B'") 300;400; DBSelect関数は、正に、コンボボックスのリスト列を戻す関数として作成されていることが判ります。 <注文履歴> ID___受注日_________品名____値段 1_____007/05/10___A_________\100 この注文履歴テーブルを基に単票入力フォームを作成し[値段]をコンボボックスで選択するとします。 この場合、(1)既入力レコード対策、(2)[品名]更新後処理に関わるコードを書く必要があります。 (2)では、更に、候補と入力されている値段との矛盾チェックも必要となります。 Option Compare Database Option Explicit Private Sub Form_Current()   If Not Me.NewRecord Then     Me.値段.RowSource = DBSelect("SELECT 値段 FROM 価格リスト WHERE 品名='" & [品名] & "'")   End If End Sub Private Sub 品名_AfterUpdate()   Me.値段.RowSource = DBSelect("SELECT 値段 FROM 価格リスト WHERE 品名='" & [品名] & "'")   If DBCount("*", "価格リスト", "品名='" & [品名] & "' AND 値段=" & Me.値段) = 0 Then     Me.値段.Value = Me.値段.ItemData(0)   End If End Sub さて、そういう訳で、7行程のプログラムコードを書けば目的を実現できるでしょう。 ※DBSelect関数、DBCount関数を用意しなければならないことは言うまでもありません。 ※長くなりますので、この関数は別途補足します。

xchoxcho
質問者

お礼

「丸投げ」すみません。(^^;) 自分の中では丸投げのつもりはなかったのですが、素人なものでスミマセン。 回答ありがとうございました。挑戦してみます。 やってみて不明点がありましたら、補足させていただくと思います。 よろしくお願いします。

関連するQ&A

  • アクセスVBA テキストボックス入力値からの参照

    マイクロソフトアクセス初心者です。 現在、アクセスでデータベースを作成しています。 2つのフォーム(フォーム(1)、フォーム(2))、2つのテーブル(入力情報、マスタ)、2つのテーブルをもとにした1つのレポートを作成しています。 『フォーム(1)』のテキストボックスAに入力された値を、Dlookup関数で『フォーム(2)』のテキストボックスBに数値を参照しています。 『フォーム(2)』のテキストボックスに表示された値を、『フォーム(2)』に設置されたコマンドボタンをクリックすると、VBAで『テーブル入力情報』のフィールドAに入力されるようにしています。フィールドAについてのマスタとなるテーブルが『テーブルマスタ』です。 リレーションシップを設定せず、ただ単に値を入力することは出来るのですが、レポートを作成するにあたって、『テーブル入力情報』と『テーブルマスタ』のフィールドAに1(テーブルマスタ)対多(テーブル入力情報)のリレーションシップを設定したいと思っています。 リレーションシップを設定し、テキストボックスBに表示された数値を『テーブル入力情報』に入力する際、『テーブルマスタ』から該当するデータを選択して『テーブル入力情報』に入力されるようにしたいと思うのですが、現状では、リレーションシップを設定すると、入力値が真っ白になってしまい、レポートにも入力したデータが反映されません。 ちなみに、入力する際はフィールドA=Me.テキストボックスBのようにしています。 何か良い解決策がありましたら、是非教えていただけませんでしょうか? 分かり難い文章かと思いますが、どうぞ宜しくお願い申し上げます。

  • Access2007でルックアップのリストに数字が出る

    Access2007でルックアップの設定を行うと、リストに数字が出てきてしまいます。↓のような場合どのようにしたら、文字列のリストを作れますか? テーブル1: 主キー フィールドA 01   収入 02   支出 テーブル2: 主キー フィールドA(テーブル1のルックアップ) フィールドB 01   収入                 給与 02   収入                 その他 03   支出                 光熱費 04   支出                 食費 テーブル3: 年月日   フィールドB(テーブル2のルックアップ) H21/05/01 『ここのルックアップ列をテーブル2のフィールドAとフィールドBを選択するとフィールドAの値が01、02・・・と表示されてしまう。』 両方のフィールドのルックアップを文字列で表示するにはどうしたらいいですか? ※上記解決方法が困難な場合はテーブル3に於いて、テーブル1のルックアップの値を指定してから、その値に対応するテーブル2のレコードを選択する方法でもいいです。 できれは両方知りたいです。 宜しくお願い致します。

  • ドロップダウンリストからフィールドの選択

    アクセスを使用してデータベースを作っています。 一例としてですが、テーブル内のフィールドに種類、品名があり、各々についてルックアップウィザードを使用して、種類のフィールドからは、野菜、果物、惣菜・・・などをドロップダウンリストに、品名のフィールドからは、キャベツ、白菜、人参、桃、みかん、バナナ、肉じゃが、カレー、ハンバーグ・・・などをドロップダウンリストに表示できるようになっています。 ところが、品名のドロップダウンリストがあまりに長くなってしまうため、品名の参照元のテーブルにフィールドを3種類(例:品名1野菜・品名2果物・品名3惣菜)作成し、種類のレコード゛の値によって、参照元のテーブルのフィールドを選択しドロップダウンリストの表示が切り替わる(例えば種類のドロップダウンリストに果物を選択すると品名のドロップダウンリストには、桃・みかん・バナナのみが表示される。)ようにしたいのですが、可能でしょうか?

  • ACCESS2013リストから選択してデータの入力

    ACCESS2013で下記のような名前の3つのテーブルがあります。 T会社名、T摘要名テーブルには既にデータが入力されており、 この入力された値を元にT支払にデータを入力することを考えています。 T支払で会社名をA社と入力したら、摘要名はT摘要名テーブルを参照して、A社の摘要名の中からだけリスト選択を行いたいのですが、どのような手順を踏めばよいでしょうか? T会社名(フィールド値に会社名を持つ) T摘要名(フィールド値に会社名と摘要名を持つ) T支払(フィールド値に会社名と摘要名を持つ) 選択クエリを使って、抽出条件を使えばできると聞いたことがありますが、いまいち理解できませんでした。どのテーブルで、あるいはクエリ、フォームを新たに作って、どのような操作を行うのか具体的に教えていただきたいです。よろしくお願いします。

  • Accessのコンボボックスでリストが選択できない

    いつもお世話になっております、ありがとうございます。 コンボボックス1で部署名を選択し、 コンボボックス2でその部署の社員の名前を選択するようなフォームがあります。 コンボボックス1の値集合ソースで社員テーブルの一覧を参照し、 部署名のフィールドでグループ化して選択できるようになっています。 このとき、なぜかコンボボックス2では最上段にリスト化された社員名しか 選択できなくなります。 画面上では全員がリストとして見えているのに、 リストの2番目以降をクリックしても、一番上の社員しか入力されません。 プロパティで何か変な制約がかかっているのでしょうか? どなたかお分かりになる方がいらっしゃいましたら教えてください。 どうぞよろしくお願いします。

  • アクセスのデータ入力

    アクセスでフォームよりデータを入力するのを作りました。 直接入力していますが、何種類か決まった値しか入力しないので、リストボックスみたいな方法はないでしょうか? テーブルのデザイン変更-入力規則で決まった値しか 入力させないようにはできますが、 選択させる方法がわかりません。。。 宜しくお願いします。

  • accessで2つのテーブルから参照する方法

    access2007を使っています。 例えば、 テーブルA ID   品名   価格 A1   鉛筆    100円 テーブルB ID   品名   価格 B1  消しゴム  50円 というレコードが2つあった場合 テーブルAとテーブルBのどちらからも参照して ID  品名   価格 A1  鉛筆   100円 B1  消しゴム  50円 というふうにクエリにデータを反映させるのにはどうすれば良いのでしょうか?  

  • access2003初心者です。データの入力について

    access2003初心者です。 受注明細を作成しています。 商品ごとに商品の発送方法が決まっています。 テーブルまたはフォームで商品情報を入力をするときに、 最初のフィールドまたはコントロールで、リストから商品を選択して、 次のフィールドまたはコントロールで、リストから発送方法を選択します。 そこで発送方法をa~hの8種類から選択するのですが 商品Aの発送方法はa,bの2種類、 商品Bだとb,c,dの3種類の中のいづれかの発送となるので それ以外はリストになくてよいのです。 つまり、先に入力した値によって、 次に入力できる値に制限を加えたいのですが、 どうすればよいのかわかりません。 この一連の動作の名前すらわからないほどの初心者です。 よろしくお願いします。

  • ACCESS2003:ルックアップで表示に対応する別項目を入力したい

    リストボックスから選択できるのは 「りんご/バナナ/みかん」といった品名だが 実際に入力される値は「1/2/3」といった対応する 数値が入力されるようにしたいと思います。 テーブル:T売上 ------------- num: オートナンバー(主キー) item: 整数 ------------- テーブル:T品目 ------------- num: オートナンバー(主キー) name: 商品名 ------------- クエリ:Q売上 ------------- num: T売上.num item: T売上.item(ルックアップ設定) ------------- 上記クエリを作り、ルックアップには下記のようにしました。 ------------- 表示:リストボックス 値集合タイプ:テーブル/クエリ 値集合ソース:T品目 値連結:1 列数:2 ------------- リストボックスから選択入力することはできましたが、 表示も入力値も「T品目.num」になってしまいます。 表示は「T品目.item」、入力値は「T品目.num」のように したいのですが、そのようなことは可能でしょうか? 入力値を数値(num)にしたいのは、品名(item)が 変更になる可能性があるからです。

  • Accessのリストボックスを使って抽出

    抽出用のフォームを作成しているのですが、その中にリストボックスがあり、何も選択しなかった場合は、すべての項目が表示される様にしたいと思っております。自分なりに色々と調べたのですが、どうしても希望の動作になりません。どの様にすれば良いのか教えて頂けないでしょうか? Access2003を使用しております。 Form-A(メインフォーム名)←テーブルAを元に作成(項目名同じ) 番号(主キー)、氏名、性別、A1、A2・・・ A1、A2は、する・しないのどちらかを入力。 Form-B(サブフォーム名)←テーブルBを元に作成(項目名同じ) ID(主キー)、番号、担当、訪問日、次回訪問日、期間 担当は、値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあ(フィールドは担当のみ)5名程の名前を登録しし、リストボックスにて選択できる様にしています。 現在、下記の様な抽出用のフォームがあります。 Form-抽出(抽出用フォーム名) A1(チェックボックス) A2(チェックボックス) 担当(リストボックス:値集合タイプ:テーブル/クエリ、値集合ソース:テーブルあを設定) [OK]ボタンを押すと抽出(クエリQにて条件を設定)する様にしています。 クエリQ(テーブルA、テーブルBを元に作成) 番号(主キー)、氏名、性別、A1、A2、ID(主キー)、番号、担当、訪問日、次回訪問日、期間 現在設定しているのは、 A1の抽出条件:IIf([forms]![Form-抽出]![A1]=True,True,False) A2の抽出条件:IIf([forms]![Form-抽出]![A2]=True,True,False) 担当の抽出条件:[Forms]![Form-抽出]![担当リストボックス] 訪問日の抽出条件(複数情報がある為、最近の訪問日のデータのみ対象となる様にしています。):DMax("訪問日","テーブルB","[テーブルB]![番号] ='" & [テーブルB]![番号] & "' And 訪問日 <Date()") 今の設定ですと、担当を選択しなかった場合、何も抽出されてきません。 これを、すべて表示出来る様にしたいのが希望です。 Access初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますので、どうぞよろしくお願い致します。

専門家に質問してみよう