MS Access Tips/Sample and VBA and Blog customize etc...

入力順に依存しないリスト制限される複数コンボボックス

帳票フォームのヘッダーに複数のコンボボックスがあり、選択した値でフォームのレコードを絞り込みます。また、コンボボックスのリストも他のコンボボックスの値で絞り込ます。どのコンボボックスから入力しても、その順に依存されずにリストの絞り込みが出来るようにしたい。

前回の記事 どちらから入力してもリスト制限される2つのコンボボックス と同内容ですが、前回はコンボボックスは2つですが、今回はそれ以上ある場合です。この質問は、Mougで前後して投稿されました。

前回と同じ方法でもできるのですが、抽出対象フィールドが増えるとクエリが複雑になり、重くなります。そこで、VBAで動的にFilterやリストのSQLを生成することにします。

FrmMultiComboBoxFilterVBA.png

難易度:

仕様

下記のようなテーブルをレコードソースとする帳票フォームを作成します。

Table1
IDFld1Fld2Fld3
1aA
2aB
3aC
4bD
5bA
6bC
7cB
8cB
9dE
10eE
11eC

フォームヘッダーにはコンボボックスを3つ配置して、"cb"+対象フィールド名 というフォーマットで名前付けします(cbFld1, cbFld2, cbFld3)。

コマンドボタンを配置して、名前を cbClear、標題を 抽出解除 とします。

サンプルコード1

掲示板で回答したコードです。

フォームモジュール

MakeFilter関数は、引数で対象フィールド名を空白区切りで指定すると、Filter条件式を生成します。

各コンボボックスのフォーカス取得時で自分自身の連結フィールドを除く抽出条件のSQL文を生成して値集合ソースとします。

また、更新後処理 で全対象フィールドのFilter条件式を生成してフォームのFilterプロパティに設定します。

サンプルコード2

各コンボボックスのイベントプロシージャが同等のものになるので共通関数化して、定数宣言で対象フィールドを指定するようにしました。

対象フィールドが増えたり変更になっても、定数宣言のみ変更するだけで対応できます。

フォームモジュール

サンプルMDB が下記からダウンロードできます。
FrmMultiComboBoxFilterVBA_07.zip (Access 2007 形式 - 33kb)
FrmMultiComboBoxFilterVBA.zip (Access 2002-2003 形式 - 33kb)
FrmMultiComboBoxFilterVBA_2k.zip (Access 2000 形式 - 20kb)


拍手する

8 Comments

ゆき says..."度々お邪魔しています"

管理人様、はじめてコメントさせて頂きます。
度々勉強がてら覗いています。

すでに作られているアクセスのファイルがありまして、フィールド名も「大分類」「分類」「氏名」となっています。そういった場合はこの方法では無理でしょうか?全部同じフィールド名にしなくちゃできないのでしょうか?試してみたところエラーの嵐なのです・・・
お忙しいとは思いますが宜しかったらお返事下さいませ。

2010.05.13 19:24 | URL | #- [edit]
hatena says..."可能ですよ"

サンプルコード2 の3行目を

Const conFlds = "大分類 分類 氏名" 'ここで抽出対象フィールド名を指定

と変更して、Table1 の部分を実際のテーブル名にして、
コンボボックスの名前を、それぞれ、

cb大分類 cb分類 cb氏名

とすれば出来るはずです。

2010.05.13 19:39 | URL | #5uE6dEgY [edit]
ゆき says...""

できました~
3行目以外にもFldをすべて書き換えてしまってました^^;
こんなに少ない箇所を書き換えるだけとは。。

お忙しいところレス頂きありがとうございました☆
センスの良いACCESSで素晴らしいものばかりでいつも見とれています。
これからも頑張ってください♪

2010.05.14 11:49 | URL | #- [edit]
toto says..."はじめまして。"

はじめまして。
いつも参考にさせて頂いているのですが、投稿は初めてです。
とても丁寧に解説頂いているので、ほとんど困ることなく作業ができ、とても感謝しております。

「入力順に依存しない~」に「複数条件の抽出フォーム」を合体させたような抽出方法をとりたいと思い、思考錯誤しているのですが、行き詰ってしまったので、投稿させていただきました。

やりたいことは、
コンボボックスとテキストボックスの複合抽出です。
コンボボックスが3つ、テキストボックスが1つです。
テーブルも3つ参照しています。

今は、集合ソースにSQLを書いて動作させているのですが、抽出に10~20秒ほどかかってしまいます。

抽象的な相談内容で申し訳ないのですが、何かアドバイスがありましたら、ご教授願いたいと思います。

2011.10.11 13:36 | URL | #DZaU3eqc [edit]
hatena says..."re:抽出に時間がかかる by totoさん"

抽出に時間がかかるとのことですが、重くなる原因に関しては、テーブル設計やSQL設計などさまざまな要因があり、現在の情報だけではアドバイスは難しいです。
掲示板を設置してますので、よろしければそちらで、テーブルの設計やSQLについての情報をそえて再質問してください。
文章だけで難しい場合は、ファイルもアップロードすることも出来ます。

2011.10.12 09:07 | URL | #5uE6dEgY [edit]
toto says..."掲示板でお願い致します"

ご連絡ありがとうございます。
お言葉に甘えまして掲示板で質問させていただきます。
よろしくお願い致します。

2011.10.12 10:01 | URL | #DZaU3eqc [edit]
ジジ says..."はじめまして"

はじめまして。
色々参考にさせていただきながら、ACCESSを勉強中しております。

複数のコンボボックスでの抽出についてうまく動作することはできたのですが、
膨大なデータを扱っておりまして、抽出された結果に重複内容が発生して
しまいます。
これにどのような処理を追加することで抽出結果に重複内容が表示されない
ようにできますでしょうか。

申し訳ございませんが、アドバイス等いただけますと幸いです。
よろしくお願いいたします。

2014.07.08 17:09 | URL | #- [edit]
hatena says..."re:はじめまして"

> 複数のコンボボックスでの抽出についてうまく動作することはできたのですが、
> 膨大なデータを扱っておりまして、抽出された結果に重複内容が発生して
> しまいます。
> これにどのような処理を追加することで抽出結果に重複内容が表示されない
> ようにできますでしょうか。

もともとのデータに重複があるということですよね。
抽出したことによって、存在なかった重複が発生することはありえないですから。
抽出された結果、存在していた重複がはっきり現れことうことですよね。


さて、
仕様上、重複するデータの存在は許されるものなのか、許されないものなのか、どちらですか。
許されないものならば、テーブル設計時に、インデックスの設定で重複を許可しないようにできます。

許されるものなら、集計クエリにするか、重複を排除する条件を設定するかですね
具体的には、どのような重複があって、その重複からどれを残すのか次第ですので、テーブルのフィールド構成、重複のデータ例、重複を排除した後の出力例を出してもらう必要があります。


2014.07.08 21:56 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/258-db6c9fd8
該当の記事は見つかりませんでした。