- ベストアンサー
accessでコンボボックスの内容を変える方法を教えて下さい。
accessのフォームにてデータ入力画面を作成しています。 フィールド入力にコンボボックスを用いてリスト選択にしたいのですが、リストの量が膨大になってしまう為、その前のフィールド値によってリスト用テーブルを切り換えて使いたいと思っています。簡単に出来る方法があれば教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
えっと、問題を具体的にするために、以下のような設定だと仮定して話を進めます。 ご自身の環境と置き換えてお読みください。 ・数千種類の商品の中から、任意の一つを選択したい。 ・「T商品」テーブルには、次のフィールドがある。 [商品ID],[商品名],[商品分類](テキスト型) ・フォーム上に、コンボボックス「コンボA」と「コンボB」がある。 ・「コンボA」にて商品分類を選択し、コンボBに表示される商品を絞り込む。 ・「コンボB」で商品IDを指定する。 ****** 1:コンボA と、コンボBをフォームに配置。 2:コンボA のプロパティ 名前:コンボA コントロールソース:空白(非連結) 値集合タイプ:テーブル/クエリ 値集合ソース:SELECT 商品分類 FROM T商品 Group By 商品分類; 3:コンボBのプロパティ 名前:コンボB コントロールソース:商品ID 値集合タイプ:テーブル/クエリ 値集合ソース:空白 入力チェック:いいえ 4:コーディング Private Sub コンボB_Enter() Dim strRowSource As String If Nz(Me.コンボA, "") = "" Then strRowSource = "SELECT 商品ID FROM T商品;" Else strRowSource = "SELECT 商品ID FROM T商品" _ & " WHERE 商品分類 ='" & Me.コンボA & "';" End If Me.コンボB.RowSource = strRowSource End Sub なんかあったら、補足してください。
その他の回答 (3)
- ARC
- ベストアンサー率46% (643/1383)
>申し訳ありませんが私ACCESS初心者の為、VBAではなくてクエリで実現する方法があれば教えていただきたいのですが。 クエリーでするなら、コンボBの値集合ソースの内容を、 SELECT 商品ID FROM T商品 WHERE 商品分類 = Forms![フォーム名]![コンボA] みたいな感じのクエリーにして下さい。 参考までに、手順を書いときます。 1:下記1-A,1-Bのいずれか一つを実行する 1-A:上記SQL(SELECT云々の部分のこと)のテーブル名等を、テキストエディタで変更した後、コンボBの[値集合ソース]プロパティに貼り付ける 1-B:テーブル名等を変更した後、クエリーを新規作成して、[表示]-[SQLビュー]を実行し、そこに貼り付ける。*1 クエリーを保存し、コンボBの[値集合ソース]に、そのクエリーを指定する。 *1貼り付けた後、[表示]-[デザインビュー]で普通のクエリーの表示に戻ります。編集も可能です。 2:マクロを新規作成 アクション:再クエリ コントロール名:コンボB 3:コンボBのプロパティの変更 フォーカス取得時:「2:」で作成したマクロの名前 以上。これで、絞り込み機能が実現できる筈です。 ついでに、VBAでする時の方法も。 ・フォームをデザインビューで開き、[表示]-[コード]を実行。 出てきた画面の最下行に、#3でのコードを貼り付ける。 フィールド名や、テーブル名は、適宜書き換える。 クエリーとVBAの動作の違いですが、クエリーを使った場合、コンボAが空白の時に、コンボBを展開しても何も表示されませんが、#3でのVBAの場合、コンボAが空白の時には、商品が全件表示されるようになっています。(このように、いろんな条件に応じて、様々な処理が出来るのが、VBAの強みです。)
お礼
補足回答ありがとうございます。 色々試してみたのですが、クエリだとタイミングの問題が発生しそうだったのでコンボBのプロパティのイベント/フォーカス獲得時に前回教えて頂いたプロシージャを組み込みました。 その結果みごと思ったような入力画面が出来ました。 色々とありがとうございました。
- katuya
- ベストアンサー率33% (38/115)
基本的なところはわかっているものとして回答します。 コンボボックスA「cmb_a」で大項目を選んだ後、 コンボボックスB「cmb_b」に反映させると仮定します。 コンボボックスBはq_tmpを参照しています。 もっとよいやり方があるかとは思いますが。 --------------------------------------------- Private Sub cmb_a_AfterUpdate() '一時的にクエリー[q_tmp]を作ってcmb_bに反映 Dim qdf As QueryDef Dim strSQL As String strSQL = "SELECT code, name FROM テーブル名 WHERE code = '" + cmb_a + "';" DoCmd.DeleteObject acQuery, "q_tmp" '前回作成したクエリーを削除 Set qdf = CurrentDb.CreateQueryDef("q_tmp", strSQL) '新しい条件でクエリーを作成 DoCmd.Requery "cmb_b" 'コンボボックスBを更新 End Sub --------------------------------------------- ※実行の前にダミーの[q_tmp]を作成しておいてください。 (内容はなんでもよい) わからなければ補足してください。
補足
回答ありがとうございます。 申し訳ありませんが私ACCESS初心者の為、VBAではなくてクエリで実現する方法があれば教えていただきたいのですが。 よろしくおねがいします。
- ponpon
- ベストアンサー率19% (67/345)
"その前のフィールド値"用のコンボボックスを作り、リスト用コンボボックスと連結させます。 プロパティで連結数を入力してください。 この場合、"その前のフィールド値"=0、リスト用コンボボックス=1となります。
補足
回答ありがとうございます。 私ACCESS初心者の為、もう少し詳しく教えていただきたいのですが。 出来ればクエリで実現する方法をお願いします。
補足
回答ありがとうございます。 申し訳ありませんが私ACCESS初心者の為、VBAではなくてクエリで実現する方法があれば教えていただきたいのですが。 でも、これを機会にVBAの勉強をしたいと思いました。 よろしくおねがいします。