- ベストアンサー
コンボボックスの連動による選択肢の表示方法
- コンボボックスを使用して選択した内容に応じて関連するコンボボックスの選択肢を表示する方法について質問です。
- 例えば、コンボボックスAの選択肢を変更すると、コンボボックスBに表示される選択肢も変更されるようにしたいです。
- 具体的な例として、コンボボックスAで書類1を選択すると、コンボボックスBには提出先1と提出先2が表示されるようにしたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
できました。 1.まず、「Q_提出先」を次のように変更してください。 T_提出先とT_書類を分類でリレーションします。 グリッドの1番目に提出先を2番目に書類(非表示)を設定します。 書類の抽出条件に[Forms]![フォーム名]![コンボボックスA]と入れます。(これは以前と同じ構文です) 2.コンボボックスAのプロパティを次のように変更します。 値集合ソース:T_書類(これは以前のまま) 列数:1 列幅:セミコロンで区切られていくつかあれば、1つ分のみの設定にします。 連結列:1 更新後処理:マクロは以前のまま 3.コンボボックスB 値集合ソース:Q_提出先(これも以前のまま) 列数:1 連結列:1 これで、t-tomoさんの思ったとおりになると思います。
その他の回答 (4)
- tutty2
- ベストアンサー率53% (7/13)
これは、ACCESSとかVBとかの問題ではなく、DBの作り方の問題なんです。 二つのコンボボックスを連結させる場合、大分類を選択し、次に小分類を選択することになりますよね。 今回の例の場合、大分類が「分類」で、「書類」と「提出先」は、それぞれ「分類」の小分類になっているわけです。 つまり、並列の小分類同士を関連付けようとしているところに無理があるということなので、データベースの構造を見直さないとならないと思います。 苦肉の策として、書類と提出先を分類でリレーションしたクエリーを作り、それをコンボボックスBの値集合ソースに設定し、コンボボックスAで分類を選択するとコンボボックスBに書類と提出先を組み合わせた一覧を表示させ、該当する組み合わせを選択することは可能です。 しかし、この場合でも、保存できる値は書類か提出先の1つになってしまいます。 いずれにせよ、コンボボックスの絞込みは最初の回答のとおりですから、あとは大分類、小分類という関係のDBをどう作るかという話ですね。
- tutty2
- ベストアンサー率53% (7/13)
現象がわかりました。 これは、コンボボックスAの検索キーが分類フィールドとなっており、分類aが重複しているためです。 このテーブルを見たときに気になったのが、検索キーに重複データがある点でしたが、やはりそれがネックのようです。 普通、この場合は検索キーはユニーク(一意)なものにするので、分類テーブルを作り(構造は分類IDと分類)、「T_提出先」の「分類」フィールドの変わりに「分類ID」フィールドとし、この「分類ID」をキーに検索(コンボボックスBの絞込み)を行います。 つまり、コンボボックスAの値集合ソースは「T_分類」に変更するということです。 ユニークであれば「T_分類」に分類IDを設けなくても「分類」1列大丈夫だと思います。この方がT_提出先を修正する必要がないですね。 ただ、こうすると書類が関係なくなってしまいますけど問題ありますか?
補足
そういう事なのですか… 書類と提出先は必須項目なので関係なくなってしまっては困るので、ちょっと担当者と話し合ってみる事にします。 初心者ではありますが、少しだけならばVBAは分かりますが、VBAでは無理なのでしょうか? やっかいな質問に長い間、お付き合い頂いて本当に申し訳ありません。
- tutty2
- ベストアンサー率53% (7/13)
コンボボックスAで書類2を選択してもコンボボックスAが書類2と表示されずに書類1のまま変わらないということでしょうか? コンボボックスAの更新処理後プロパティに設定したマクロの再クエリーはコンボボックスBを指定してありますよね? コンボボックスAは、単にテーブルの値を表示しているだけなので選択した値が表示されるはずなんですが。 別のコンボボックスを作って、連結は無しで値集合ソースを「T_書類」とした場合はどうでしょうか?ちゃんと書類2が選択できますか?それができれば、それと同じことなんですけどね。 蛇足ですが、コンボボックスAのプロパティ「列幅」の2列目の値を0cmにすると、分類の項目は表示されなくなります。
補足
書類1 分類a 書類2 分類a 書類3 分類b 書類4 分類b 書類5 分類c 書類1を選択すると書類1 書類2を選択しても書類1 書類3を選択すると書類3 書類4を選択しても書類3 というように、分類されている中で先頭のものしか表示されていないようなのですが… もしかして書類テーブルには書類番号というのも存在していますが、連結は分類にしてあります。 これは関係ないのでしょうか? 非連結のコンボボックスを作成しましたが、同じ事になりました。
- tutty2
- ベストアンサー率53% (7/13)
アクセス97を使っていますが、2000でも同じだと思うので回答します。 アクセス97を使っていますが、2000でも同じだと思うので回答します。 コンボボックスAに表示する元になるテーブルを「T_書類」、Bを「T_提出先」とします。 1.まず、コンボボックスAのプロパティの値集合ソースに「T_書類」を指定します。 さらにプロパティの列数に「2」、連結列に「2」を入力します。 列数の「2」は、書類と分類の両方をコンボボックスに表示させるためです。T_書類の作りからこうしないと使いづらいです。 連結列の「2」は、「T_書類」の「分類」フィールドを指定していることになります。「書類」が1で「分類」が2ということです。 2.次にBの値集合ソースに使うクエリーを例えば「Q_提出先」とし、元になるテーブルは「T_提出先」で表示させるフィールドは「提出先」、さらに、非表示フィールドで「分類」を作成し、その抽出条件として[Forms]![フォーム名]![コンボボックスA]とします。 このクエリーは、コンボボックスの値集合ソースでクエリービルダーを起動しても作成できますが、クエリーとして作成したものを指定する方が何故かうまく行くようです。 3.そして、コンボボックスBの値集合ソースに、2で作成した「Q_提出先を」指定します。 4.最後に次のマクロを作成します。 マクロ名を「再表示」とし、アクションに「再クエリー」、コントロール名に「コンボボックスB」と入力します。そして、このマクロをコンボボックスAのプロパティ「更新後処理」で選択します。 こんな感じでできます。
補足
回答ありがとうございました。 早速、tutty2さんに教えていただいた通り作成しているのですが、提出先のコンボボックスは書類のコンボボックスから絞り込む事は出来きましたのですが、 書類1 分類a 書類2 分類a 書類3 分類b 書類4 分類c で、書類2を選択しても書類1が表示されてしまいます。 いろいろと考えているのですが解決出来ません。 たびたびの質問で申し訳ありませんがよろしくお願いします。
お礼
出来ました!! 半分あきらめかけていたのでとっても感激しています。 朝から夜までほぼ一日この質問にお付き合い頂いて感謝しています。 どうもありがとうございました。