概要
| この記事の結論 テーブルを元にしたコンボボックスは、値集合タイプを「テーブル/クエリ」にし、値集合ソースへ候補のテーブルやクエリを指定して作ります。名称を表示してIDを保存する設計なら、名称が変わっても同じ対象を識別できます。 |
この記事でわかること
- マスターと保存先のデータ型を揃える
- 候補を表示するコンボボックスを設定する
- 表示する名称と保存するIDを確認する
- 候補の追加と過去データの表示を扱う
この記事の主な内容
- 候補の取得元と保存先を分ける
- マスターと保存先のデータ型を揃える
- 候補を表示するコンボボックスを設定する
- 表示する名称と保存するIDを確認する
- 候補の追加と過去データの表示を扱う
- 未選択と入力制限を確認する
- よくある質問
想定読了時間:約8分
1 候補の取得元と保存先を分ける
テーブルを元にしたコンボボックスは、値集合タイプを「テーブル/クエリ」にし、値集合ソースへ候補のテーブルやクエリを指定して作ります。名称を表示してIDを保存する設計なら、名称が変わっても同じ対象を識別できます。
値集合ソースは候補を取得する場所、コントロールソースは選択した値を保存するフィールドです。
同じ「ソース」でも役割が違うため、最初に分けて整理しましょう。

2 マスターと保存先のデータ型を揃える
M_商品に商品IDと商品名、T_受注明細に商品IDを用意します。
マスターの商品IDが通常のオートナンバーなら、明細側は数値型の長整数にします。
子側までオートナンバーにすると、親のIDを保存する目的と合いません。
商品名を主キー代わりに使うと、同名商品や名称変更に弱くなります。
表示名とは独立したIDを使い、親側のキーが一意になるように設計します。
設定例と確認点
| 場所 | フィールド | 型 |
|---|---|---|
| M_商品 | 商品ID | オートナンバー |
| M_商品 | 商品名 | 短いテキスト |
| T_受注明細 | 商品ID | 数値・長整数 |

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

操作手順
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) です。
表示列の値を取り出しただけでは、別フィールドへ自動保存されるわけではありません。

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