Page.2/3
【単票形式のフォームの場合】
■下のように、単票形式のフォームで、大分類、小分類の各コンボボックスでリストから値を選択後「名称」がボックス内に表示されるようにしたいとします。(右図のクエリはフォームのレコードソースで、売上明細テーブルを基にしています。)
[F_売上明細1]フォーム [Q_売上明細1]クエリ
■まず大分類コンボボックスですが、こちらは特に問題はありません。以下のような設定で簡単にできます。
※ 右図は 値集合ソース の詳細です ※
ここでは、コンボボックスの表示列を [大分類][大分類ID] という順番にしていますが、これは、コンボボックスでは値が選択されたとき一番左の列が表示されるという仕様になっているので、大分類の名前の方を表示させるためにこういう順番にしています。
この場合、列数、連結列ともに 2 としておくことで、リストを選択後は大分類の名前が表示されますが、テーブルには[大分類ID]フィールドの値が保存されます。
別なやり方として、コンボボックスの表示列を [大分類ID][大分類] という順番にして、列数を 2 、連結列を 1 とし、列幅の設定値は1列目を 0cm にすれば上記と同様の結果が得られます。ただしコンボボックスのリストの中には[大分類ID]は表示されなくなります。
■次は小分類コンボボックスです。
基本的な作り方は大分類コンボボックスのときとだいたい同じです。でも、まったく同じやり方ではすべてのデータが表示されるだけですよね。大分類コンボボックスで選択した値によって小分類コンボボックスの内容を限定するためには、ちょっとしたテクニックが必要になります。
ここで右図をご覧ください。これは 値集合ソース の詳細です。フィールドの1列目、2列目の並び方は大分類コンボボックスのときと同じようになっていますが、3列目には[大分類ID]が入っています。が、この列は表示チェックボックスはオフになっているため表示されません。そして抽出条件欄には [Forms]![F_売上明細1]![大分類] と入力されています。ここでフォームにある大分類コンボボックスの値を条件として指定することで、小分類コンボボックスの内容が限定されることになります。ここがポイントです。
式の中でフォームのコントロールを参照するときは必ず [フォームの名前]![コントロールの名前] という書き方になります。参照するコントロールがサブフォームの中にある場合は [メインフォームの名前]![サブフォームの名前]![コントロールの名前] という書き方になります。具体的な式の書き方の事例がヘルプに載っていますので、詳しくはそちらをご覧ください。
※この条件式は直接手入力しなくても以下の方法で入力できるようになっています。

抽出条件欄で 右クリックをして[ビルド]を選ぶと 式ビルダ が起動します。
ビルダの下側は3つのボックスに分かれています。
左側のボックスにはフォルダの一覧が表示され、テーブル、クエリ、フォーム、レポートなどのデータベース オブジェクト、組み込み関数、ユーザー定義関数、定数、演算子、および一般的な式が表示されます。

ここで、[フォーム]→[読み込まれたフォーム]、と、順番にダブルクリックしていくと、[読み込まれたフォーム]のすぐ下に参照したいコントロールのあるフォームの名前が表示されるので、それをクリックします。
すると中央のボックスにフォームに含まれるコントロールのリストが表示されるので、その中から目的のコントロールを探してダブルクリックします。これで参照式が完成となります。
今回のケースでは
[F_売上明細1]フォームの [大分類]コントロール
を参照するので、条件式は
Forms![F_売上明細1]![大分類]
となります。
※ 式を入力したあとは、最終的に[OK]ボタンをクリックすることを忘れないでください。
【注】サブフォームのコントロールを参照する際、
Forms![メインフォームの名前]![サブフォームの名前].フォーム![コントロールの名前]
と、なぜか全角カタカナの フォーム という文字が表示されることがあります。(バグのようです(^^ゞ)
これは本来
Forms![メインフォームの名前]![サブフォームの名前].Form![コントロールの名前]
が正解ですが、 .Form は省略して
Forms![メインフォームの名前]![サブフォームの名前]![コントロールの名前]
という書き方でも構いません。
※ ! を書き忘れないように注意しましょう。
■値集合ソースの設定は終わりましたが、残念ながらそれだけではまだ不完全です。コンボボックスの内容を連動させるためには、小分類コンボボックスの「フォーカス取得時」イベントプロシージャで小分類コンボボックスの再クエリを行わなければいけません。(コンボボックスを連動させるにはコンボボックスの再クエリ処理が必要ということを覚えておいてください。)
が、実はこれでもまだ完璧ではないのです。というのも、上の方法で、大分類コンボボックスの値によって小分類コンボボックスのリストの内容は変わるようにはなるのですが、既存のレコードのページを表示させるときに、右図のように、小分類コンボボックスが空欄のままのページができてしまうのです。
それを防ぐためにはさらにもう一工夫必要です。今度はフォームの「レコード移動時」イベントプロシージャでも小分類コンボボックスの再クエリを行います。こうすることで既存のレコードのページを表示させても、小分類コンボボックスの値はきちんと表示されるようになります。
右図のようになればOKです。