Accessでテーブルを元にコンボボックスを作る方法

概要

この記事の結論
テーブルを元にしたコンボボックスは、値集合タイプを「テーブル/クエリ」にし、値集合ソースへ候補のテーブルやクエリを指定して作ります。名称を表示してIDを保存する設計なら、名称が変わっても同じ対象を識別できます。

この記事でわかること

  • マスターと保存先のデータ型を揃える
  • 候補を表示するコンボボックスを設定する
  • 表示する名称と保存するIDを確認する
  • 候補の追加と過去データの表示を扱う

この記事の主な内容

  1. 候補の取得元と保存先を分ける
  2. マスターと保存先のデータ型を揃える
  3. 候補を表示するコンボボックスを設定する
  4. 表示する名称と保存するIDを確認する
  5. 候補の追加と過去データの表示を扱う
  6. 未選択と入力制限を確認する
  7. よくある質問

想定読了時間:約8分


1 候補の取得元と保存先を分ける

テーブルを元にしたコンボボックスは、値集合タイプを「テーブル/クエリ」にし、値集合ソースへ候補のテーブルやクエリを指定して作ります。名称を表示してIDを保存する設計なら、名称が変わっても同じ対象を識別できます。

値集合ソースは候補を取得する場所、コントロールソースは選択した値を保存するフィールドです。
同じ「ソース」でも役割が違うため、最初に分けて整理しましょう。

2種類のソースの役割について、マスター、コンボ、明細の関係を示す図。

2 マスターと保存先のデータ型を揃える

M_商品に商品IDと商品名、T_受注明細に商品IDを用意します。
マスターの商品IDが通常のオートナンバーなら、明細側は数値型の長整数にします。
子側までオートナンバーにすると、親のIDを保存する目的と合いません。

商品名を主キー代わりに使うと、同名商品や名称変更に弱くなります。
表示名とは独立したIDを使い、親側のキーが一意になるように設計します。

設定例と確認点

場所フィールド型
M_商品商品IDオートナンバー
M_商品商品名短いテキスト
T_受注明細商品ID数値・長整数
親と子のIDの型について、親側、子側の関係を示す図。

3 候補を表示するコンボボックスを設定する

受注明細フォームをデザインビューで開き、商品IDに連結するコンボボックスを配置します。
候補のSQLはIDを1列目、名称を2列目にします。並び順は保存順に頼らず、商品名とIDで明示します。

候補取得の設定について、列1、列2、並び順の関係を示す図。

操作手順

1. 値集合タイプをテーブル/クエリに設定します。

2. 値集合ソースへ下記SQLを指定します。

3. 連結列を1、列数を2、列幅を0cm;5cmにします。

4. コントロールソースを商品IDにします。

サンプルコードと式

SELECT [商品ID], [商品名]

FROM [M_商品]

ORDER BY [商品名], [商品ID];

表示値と保存値について、画面、保存先の関係を示す図。

4 表示する名称と保存するIDを確認する

列幅で1列目を0にしても、連結列1の値は保存されます。
例えば商品ID 12、商品名ノートを選ぶと、画面にはノート、明細テーブルには12が入ります。
画面だけでなく保存先の実値まで確かめてください。

連結列は1から数えますが、VBAのColumnは0から数えます。
2列目の名称を読む式は Me!cbo商品.Column(1) です。
表示列の値を取り出しただけでは、別フィールドへ自動保存されるわけではありません。

列番号の違いについて、連結列、Columnの関係を示す図。

5 候補の追加と過去データの表示を扱う

マスターに候補を追加した後はコンボボックスをRequeryすると、値集合ソースを読み直せます。
編集中のレコードがある場合は保存・取消の扱いを決めてから行い、画面更新だけでデータ保存されたと思い込まないようにします。

非使用の商品を候補から完全に除くと、過去の明細で名称が表示できなくなる場合があります。
過去レコードの表示用と、新規選択できる候補を分けるなど、利用場面に合わせて設計します。

サンプルコードと式

Me!cbo商品.Requery

候補を再取得する流れについて、追加、再取得、確認の関係を示す図。

既存Accessへの影響を判断できない場合

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。
対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


6 未選択と入力制限を確認する

入力チェックの「リスト入力のみ」を有効にすると、候補外の値を制限できます。
ただしNullを禁止する設定とは別です。選択必須ならテーブルの値要求やフォームの保存前チェックも検討してください。

候補の絞り込みに使う非連結コンボボックスと、IDを保存する連結コンボボックスも別物です。
値が保存されない場合は、フォームのレコードソースとコントロールソースを順に確認します。

運用前に確認することについて、未選択、廃止商品、保存先の関係を示す図。

7 よくある質問(FAQ)

はい。ID列を連結列にし、列幅0で非表示にします。

追加データの保存と値集合ソースの条件を確認し、Requeryします。

非連結になっていないか、コントロールソースとフォームの更新可能性を確認します。

まとめ

候補の絞り込みに使う非連結コンボボックスと、IDを保存する連結コンボボックスも別物です。
値が保存されない場合は、フォームのレコードソースとコントロールソースを順に確認します。

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


参考情報

Microsoft:RowSource
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.rowsource

Microsoft:BoundColumn
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.boundcolumn

Microsoft:Column
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.column

Microsoft:Requery
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.requery

TOP