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

帳票フォームの複数コンボボックスで絞り込み

階層構造のグループを持つデータを帳票フォームで入力するときに、コンボボックスで段階的に絞り込んで入力したい。

このような希望はよくあると思います。例えば、「支社名」→「部署名」→「社員名」とか、「地方名」→「県名」→「ユーザー名」とか。

FrmGroupCombobox.gif

今回はこのような帳票フォームを紹介します。

難易度:

仕様

テーブル

M_Area
(主キー AreaID)
AreaIDAreaName
4中部地方
5近畿地方

M_Area_Sub
(主キー AreaID, AreaSubID)
AreaIDAreaSubIDPrefectureName
40静岡県
41岐阜県
42愛知県
43三重県
50滋賀県
51京都府
52兵庫県
53大阪府
54奈良県
55和歌山県

M_Area_Judge
(主キー UserID)
UserIDAreaIDAreaSubIDUserName
140太田
240山田
341鈴木
442佐藤
540田中
650小坂
751佐々木
852池田
953後藤
1054香坂
1150石山

このテーブルよりクエリ「Q_User_Area」を作成します。

FrmGroupComboboxQuery.gif

SQL

このクエリをレコードソースとする帳票フォームを作成して、下記のコントロールを配置します。

地方名選択コンボボックス

プロパティ
名前 cbAreaID
コントロールソース AreaID
連結列 1
値集合タイプ テーブル/クエリ
値集合ソース M_Area
列数 2
列幅 0cm;2cm

県名選択コンボボックス

プロパティ
名前 cbAreaSubID
コントロールソース AreaSubID
連結列 1
値集合タイプ テーブル/クエリ
値集合ソース SELECT AreaSubID, PrefectureName, AreaID FROM M_Area_Sub WHERE
M_Area_Sub.AreaID=[cbAreaID] Or [cbAreaID] Is Null;
列数 3
列幅 0cm;2cm;0cm
列数 2

県名表示用テキストボックス

プロパティ
名前 PrefectureName
コントロールソース PrefectureName
タブストップ いいえ

このテキストボックスを県名選択コンボボックスの上に重ねて配置します。サイズは、コンボボックスのドロップダウンボタンを除いたボックス部分をちょうど隠すように調整します。

あとは UserName を表示するテキストボックスを配置します。

フォームモジュールは下記のようになります。イベントプロシージャは各コントロールに関連付けるようにしてください。

追記 2012.11.05: バグがあったのでコードを修正しました。

解説

コンボボックスの段階絞り込みは、単票フォームではWEBで探せば多数見つかります。Access Clubにもあったのですが現在アクセス不能状態なので、MS技術情報のものを挙げておきます。

コンボボックスの内容を制限する方法

帳票フォームの場合は、コンボボックスのリストを絞り込むと他のレコードのルックアップ項目が表示されないという問題点がでるので、それを解決するには、ちょっとした技が必要です。下記がその一例です。絞り込みするコンボボックスと絞り込みしないコンボボックスを重ねるというのが種です。

コンボボックスの一覧を入力時のみ制限する方法~帳票形式編~

さて、今回の用件は、問題点が2つあります。

まず、M_Area_Subテーブルの主キーが複数フィールド主キーになっており、通常のルックアップフィールドの設定では県名が特定できないという点。

これは、M_Area_Sub と M_Area_Judge を、クエリで2本の結合線でリンクさせて別フィールドで県名を表示させるようにします。

次に、他レコードのルックアップ項目が表示されないという問題点は、県名選択コンボボックスの上に、県名フィールドと連結したテキストボックスを重ねることで解決しています。

データシート表示の場合、このような技が使えないので、実現するのは難しいです。できたとしても実用性の乏しいものになると思われますので、コンボボックスでのルックアップ表示はあきらめて、コンボボックスでIDを選択、テキストボックスに県名を表示という形式にするのがベターだと思います。これもサンプルに入れましたので、参照ください。

サンプルファイルが下記からダウンロードできます。
FrmGroupCombobox_07.zip (Access 2007-2010 形式 - 32kb)
FrmGroupCombobox.zip (Access 2002-2003 形式 - 28kb)
FrmGroupCombobox_2k.zip (Access 2000 形式 - 24kb)


拍手する

6 Comments

魚武 says...""

素晴らしい! とても参考になります。

・・・ところで
If Nz(Me.AreaID) <> "" Then Me.AreaID = Me.cbAreaSubID.Column(2)

の「Me.AreaID」は「M_Area_Judge」のAreaIDのことなのでしょうか?

「Me.AreaID」を「Me.cbAreaID」にすると不具合が起こるのでしょうか?

2009.04.28 19:54 | URL | #AgTHYIYo [edit]
hatena says...""

魚武さん、こんばんは。

> の「Me.AreaID」は「M_Area_Judge」のAreaIDのことなのでしょうか?

はい、レコードソースのクエリで M_Area_Judge の AreaID を表示させてますからそうなります。

> 「Me.AreaID」を「Me.cbAreaID」にすると不具合が起こるのでしょうか?

問題ないと思います。

2009.04.28 21:21 | URL | #5uE6dEgY [edit]
ishii says..."もう一段階層を増やす方法を教えていただきたい。"

「帳票フォームの複数コンボボックスで絞り込み」は大変参考になります。
もう少し下層を増やそうとおもい挑戦しましたがにっちもさっちもいきません。
具体的にどうしたらよいのか教えていただけないでしょうか
サンプルがあると助かるのですが

2012.11.03 10:03 | URL | #- [edit]
hatena says..."re: もう一段階層を増やす方法を教えていただきたい。"

3層(地方-県-市)のサンプルを下記に置いておきます。
Access2003形式のMDBファイルです。

http://hatena.minibird.jp/samplefile/FrmGroupCombobox2.zip

不明な点があれば質問してください。

2012.11.05 14:47 | URL | #5uE6dEgY [edit]
ishii says..."3層のコンボボックスでお世話になりました。"

おかげさまで何とか使えるようになりました。ありがとうございました。
「レコードがない場合も用紙の最後まで罫線を出力する」にも挑戦していますが、私には難しすぎるかも。グループ化する・・・?で止まってしまいどうしたらいいのか
申し訳有りませんが、サンプルファイルをお願いしたいのですが。

2012.11.07 17:31 | URL | #- [edit]
hatena says..."re: 3層のコンボボックスでお世話になりました。"

> 申し訳有りませんが、サンプルファイルをお願いしたいのですが。

「レコードがない場合も用紙の最後まで罫線を出力する」のサンプルですか。
そのページの下の方に置いてありますが。

2012.11.07 17:46 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

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