「フォーム上の1つのコンボボックスで『部』を選ぶと、もう1つのコンボボックスでその部に属する『課』を選べるようになる」といったように、2つのコンボボックスを連携させる例です。
注意点
絞り込みは便利ですし挙動がなかなかカッコいいので、Accessのフォームを学習する際にまずこれを覚えたい、という方も多いと思います。しかしこれはさまざまな設定を積み重ねた応用であって、メニュー一発で実現するような「特別な機能」ではありません。また「テーブルへのデータ入力に用いるのか、検索対象の絞り込みに用いるのか」あるいは「コード(ID)を名称と一緒に表示するのか、隠すのか」といった使い方により設定が違ってきます。
以下の手順もあくまで一例に過ぎず、実際に応用するためには連結コントロールと非連結コントロールの区別や、連結列、列数、列幅等の各種プロパティ、さらには最低限のVBAやマクロの知識が必要となります。
手順
ここではフォームのヘッダに2つのコンボボックスを置いて連動させてみます。その後に検索対象の絞り込みに用いるようなイメージです(ただし、長くなりますのでここではそこまでやりません)。
説明の都合上、設定の順番が行ったり来たりになるところもありますがご容赦願います。
元データとなるテーブルの設定
まずコンボボックスの元になるテーブルの確認です。
こちらが部テーブルです。コードと名称の2つの列を持っています。
そしてこちらが課テーブルです。
課のコードと名称だけでなく、「親」である部のコードが記録されていることに注意してください。
このような値のつながりがないと連動は実現できません。
コンボボックスの設置
フォームのデザインビューです。
2つのコンボボックスをフォームヘッダに置きます。ウイザードが起動しますが、キャンセルします。
この時点でこれらのコンボボックスはコントロースソースを持たない「非連結」のコンボボックスです。これらのコンボボックスは検索用であり、テーブルのデータを直接編集するためのものではありませんので、コントロールソースは設定しません。
区別のため2つのコンボボックスの「名前」プロパティを変更します。
ここでは、所属部のコンボボックスの名前は「cmb所属部」とし、所属課のコンボボックスは「cmb所属課」としてみます。
ついでに2つのラベルの文字列も「所属部」「所属課」に変更します。
上位コンボボックス(所属部)の設定
この段階ではまだコンボボックスをクリックしても何も表示されません。
そこでまず、所属部のコンボボックスに表示させる値を設定します。
所属部のコンボボックスの「値集合ソース」プロパティ欄の、右端にある「…」の部分をクリックします。
クエリのようなデザインビュー画面になりますので、ここでは「部テーブル」を選択(ダブルクリック)してデザイン画面上に置きOKとします。
そしてデザイングリッド上で画像のように設定します。
コンボボックスの選択肢としてこれらの2つの列の値を読み込むための設定ですが、実際に表示させるにはもう少し準備が必要です。
保存するとこのようなメッセージが出ますので「はい」を選択して閉じます。
値集合ソースプロパティに「SELECT 部テーブル.部コード……」という値が設定されているのがわかります。
さて、実際にこのコンボボックスを操作しても「1,2,3」という数字、つまり部コードの値しか表示されません。
そこで「列数」プロパティを「2」、「列幅」プロパティを「0cm;3cm」とします。
「0cm」というのは1列目の列である部コードの幅(ただしコンボボックス選択中の幅)を表し、「3cm」というのは2列目の幅である部名の幅を表しています。
「1cm;3cm」などとして1列目も一緒に表示させた方が見やすいかもしれませんが、選択終了後にはやはり部コードのみの表示となってしまいます;-o-)よってここでは部名のみ表示させるようにしています。
ただし、このコンボボックスに実際に記録されるのは1列目の部コードの値です(重要)。
これで部名のみが表示されるようになりました。
下位コンボボックス(所属課)の設定
次に所属課のコンボボックスです。
「値集合ソース」プロパティの右端の「…」をクリックします。
上記の例と同様に課テーブルに置き、デザイングリッド上で画像のように設定します。
重要なのは部コードの抽出条件欄に次のように入力することです。
[forms]![社員フォーム]![cmb所属部]
これにより所属部のコンボボックスの値(部名ではなく部コードの値であることに注意してください)に応じ、対応する課コードと課名が読み込まれます。
ただし部コードはコンボボックス上に表示する必要はなく、後で参照することもありませんので表示欄をオフにします。
「列数」プロパティを「2」、「列幅」プロパティを「0cm;3cm」とします。
これにより課名のみが表示されるようになります。実際に記録されるのは1列目の課コードの値です。
さて、なかなかいいところまで来ましたので実際に動かしてみます。
所属部のコンボボックスで「総務部」を選択してから所属課のコンボボックスをクリックすると、総務部に属する3つの課名が表示されました。
一見完成に見えますが……
その後に所属部のコンボボックスで「情報管理部」に選び直してから、所属課のコンボボックスをクリックしたところです。
所属部を選び直したときに所属課のコンボボックスのリストが更新されないため、惜しくも連動がうまくいきません。
VBAの設定
そこで最後の設定です。マクロでやる方法もありますが、ここではVBAで設定します。
所属部のコンボボックスを右クリックし「イベントのビルド」を選択します。
ダイアログがでますので「コード ビルダー」を選択します。
VBAのコード編集画面が現れます。
見慣れないと慌てるかもしれませんが、ここでは画像のリストから「AfterUpdate」を選択します。
そして次のように入力します(最初から記されていた「Private Sub cmb所属部_Click()」と「End Sub」は残してもいいですが削除します)。
実際に手入力するのは「Me.cmb所属課.Requery」だけですし、インデント(行頭下げ)も必須ではありません。
Option Compare Database Private Sub cmb所属部_AfterUpdate() Me.cmb所属課.Requery End Sub
これにより、所属部のコンボボックスの値が更新されるたびに、所属課のコンボボックスの選択肢となる課コードと課名が改めて読み込まれるようになります。
以上で設定は完了です。
所属部を選び直したときにも、所属課のコンボボックスのリストがきちんと更新されます。
また、所属部のコンボボックスの値を削除したときには所属課のコンボボックスのリストは空になります。