概要
| この記事の結論 Accessのプルダウンは、フォームにコンボボックスを配置して作ります。候補が少なく固定なら値リスト、増減するならテーブルやクエリを値集合ソースにします。登録用ではコントロールソースに保存先を設定し、表示する名前と保存するIDを区別します。 |
この記事でわかること
- 固定候補とマスターを使い分け
- 表示名と保存IDを区別
- 候補外禁止と未入力禁止は別
- 追加後は候補を再取得
この記事の主な内容
- プルダウンの種類と保存の仕組み
- 固定の値リストでプルダウンを作る
- 商品マスターから候補を表示する
- 名前を表示してIDを保存する
- 候補外入力と未選択を制御する
- 候補追加と絞り込みを運用する
- 表示されない保存されない場合の対処
- よくある質問
想定読了時間:約12分~16分
プルダウンの種類と保存の仕組み
Accessのプルダウンは、主にコンボボックスという入力欄で作ります。下向き矢印を押すと候補が開き、項目を選べます。候補を常に一覧表示するリストボックスとは見せ方が異なります。フォームでは、選択肢を示すことで入力の手間や表記ゆれを減らせます。
作成前に「候補をどこから取るか」「選んだ値をどこへ保存するか」を分けて決めましょう。候補が表示されても保存先が未設定なら、選択値はテーブルへ保存されません。検索条件用では、あえて保存先を持たない非連結のコンボボックスを使うこともあります。
| 設定すること | プロパティ | 例 |
|---|---|---|
| 候補の種類 | 値集合タイプ | 値リスト/テーブル・クエリ |
| 候補の内容・取得元 | 値集合ソース | 未着手;対応中;完了、またはSELECT文 |
| 保存先のフィールド | コントロールソース | 状態、商品ID |
| 候補のどの列を保存するか | 連結列 | 商品IDのある1列目 |
| 画面に見せる列 | 列数・列幅 | IDを隠し、商品名を表示 |
固定で少数の候補なら値リスト、追加や名称変更がある候補ならマスターテーブルが向いています。例えば状態の3択は値リストから始められます。一方、商品や顧客を各フォームへ直接書き込むと、追加のたびに複数画面の修正が必要になるため、マスターを参照する構成が扱いやすくなります。

固定の値リストでプルダウンを作る
まず「未着手・対応中・完了」の3択を作ります。保存先は短いテキスト型の状態フィールドです。練習用の連結フォームを用意し、レコードソースに状態フィールドが含まれていることを確認してください。既存画面を変更する場合はコピーで試します。
四つの手順で設定する
1. フォームをデザインビューで開き、[コンボボックス]を選んで配置します。ウィザードが始まる場合は、今回はプロパティを直接設定するためキャンセルして構いません。
2. コンボボックス本体を選び、F4でプロパティシートを開きます。名前をcbo状態、コントロールソースを状態にします。
3. 値集合タイプを[値リスト]にし、値集合ソースへ「未着手;対応中;完了」と入力します。区切りは半角のセミコロンです。
4. 列数を1、連結列を1にします。フォームを保存してフォームビューへ切り替え、候補を選びます。
プロパティシートに表示されるタブ位置や表記はバージョンにより異なります。項目が見つからない場合は[すべて]タブを使い、ラベルではなくコンボボックス本体が選択されているか確認してください。値集合ソースは候補、コントロールソースは保存先です。参考1
選択後に保存を確かめる
候補を選んだ後は別レコードへ移動し、元のレコードへ戻って値を確認します。さらに元テーブルで状態フィールドに値が入っているか確かめます。検索用の非連結コンボボックスなら、コントロールソースは空欄のままとし、検索条件として参照する処理を別に用意します。
候補だけの入力に制限する場合は、入力チェックを「はい」にします。ただし、この設定だけでは未選択を禁止できません。必須入力の設定は後述します。状態名を後から変更する場合も、既に保存した文字列が自動で新しい名前へ書き換わるわけではない点に注意します。

商品マスターから候補を表示する
商品が増減するなら、候補をM_商品で管理します。今回の例では、商品IDをオートナンバー型の主キー、商品名を短いテキスト型とします。練習用に「ノート」「ボールペン」など2件以上を登録し、商品IDが異なることを確認します。
保存先の型も先に用意する
選んだ商品は、受注明細テーブルT_受注明細の商品IDへ保存します。M_商品の通常の長整数オートナンバーを参照するなら、明細側の商品IDは数値型・長整数型です。明細側までオートナンバー型にすると、選んだ商品のIDを保存する役割と合わなくなります。
| テーブル | フィールド | 役割 |
|---|---|---|
| M_商品 | 商品ID | 商品を識別する主キー |
| M_商品 | 商品名 | 利用者に見せる名前 |
| T_受注明細 | 明細ID | 明細を識別する主キー |
| T_受注明細 | 商品ID | 選んだ商品のIDを保存する外部キー |
外部キーとは、別のテーブルのキーを参照する項目です。商品の名前そのものを明細に繰り返し保存する代わりに、IDで同じ商品を指します。既存マスターのキーが文字列や別の数値型なら、参照先の型とフィールドサイズに合わせて設計してください。
コンボボックスへ候補を設定する
T_受注明細をレコードソースにした練習用フォームへコンボボックスを置き、名前をcbo商品にします。値集合タイプを[テーブル/クエリ]にし、値集合ソースへ次のSQLを設定します。商品名順に並べ、同名の場合は商品ID順に並べる例です。参考2
SELECT [商品ID], [商品名]
FROM [M_商品]
ORDER BY [商品名], [商品ID];
値集合ソースのビルドボタンからクエリビルダーを開き、商品IDと商品名を選んでも構いません。どちらの方法でも、取得列の順番が後の連結列・列幅と対応していることが重要です。SQLだけを変更して列の順番が入れ替わると、保存する値まで変わる場合があります。

名前を表示してIDを保存する
利用者には商品名を見せ、テーブルには商品IDを保存する設定がよく使われます。例えば候補の1列目が商品ID、2列目が商品名なら、連結列を1にしたまま1列目の幅を0にします。IDを画面から隠しても、保存する列まで2列目に変える必要はありません。参考3
設定値を一覧で確認する
| プロパティ | 設定値 | 意味 |
|---|---|---|
| 名前 | cbo商品 | コード等で指定する入力欄名 |
| コントロールソース | 商品ID | 明細側の保存先 |
| 値集合タイプ | テーブル/クエリ | 商品マスターを取得 |
| 値集合ソース | 前節のSELECT文 | 商品ID・商品名の順 |
| 列数 | 2 | 二つの列を扱う |
| 連結列 | 1 | 1列目の商品IDを保存 |
| 列幅 | 0cm;5cm | IDを隠し、商品名を見せる例 |
| 入力チェック | はい | 候補の中から選ぶ |
列幅は画面に合わせて調整します。地域設定やAccessの表示によって単位が変換される場合がありますが、先頭列の幅を0にする考え方は同じです。リスト全体が狭い場合はリスト幅も確認し、商品名が途中で切れず選べるようにします。
連結列の番号は1から数えます。一方、VBAでColumnプロパティから列を取り出す場合は0から数えるため、2列目はColumn(1)です。設定表の連結列とVBAの列番号を混同しないようにしてください。今回の基本設定ではVBAは不要です。
本当にIDが保存されたか確かめる
商品名を選び、レコードを保存して元テーブルの商品IDを確認します。名前ではなく数値のIDが保存されていれば、この設計では正常です。ただしテーブル側にルックアップ表示を設定している場合、見た目では名前が表示されることがあります。表示だけで判断せず、フィールドの型と連結設定も確認します。
同名の商品がある業務では、商品名だけでは選び分けられません。商品コードや規格などの列を候補へ追加し、利用者が区別できる情報を見せます。名前を一意と決めつけず、IDによる識別と分かりやすい表示を両立させましょう。

Accessの教科書で選択式フォームの設定を相談する
ここまでの手順を試しても解決しない場合や、既存業務への影響を判断しにくい場合は、対象画面・現在の設定・再現手順を整理してご相談ください。Accessの教科書のお問い合わせ窓口から、状況に合う対応方法を相談できます。
候補外入力と未選択を制御する
「候補以外を入力できない」と「必ず選択する」は別の要件です。入力チェックを「はい」にすると候補外の値を制限できますが、未選択のNullまで必ず禁止するわけではありません。必須にする場合は、保存先テーブル側の入力要件も設定します。参考4
| 防ぎたいこと | 主な設定 | 確認する操作 |
|---|---|---|
| 候補にない商品を入力する | 入力チェックを「はい」 | 存在しない名前を入力する |
| 商品を選ばず保存する | 保存先商品IDを必須にする | 未選択でレコードを保存する |
| 空文字の状態を保存する | 短いテキストの空文字許可を見直す | 空欄や空文字を使った入力を試す |
| 存在しないIDを登録する | マスターとの参照整合性 | 存在しないIDの登録を検証環境で試す |
フォームだけにチェックを付けると、別のフォームや直接入力など別経路では条件を満たさない値が入る可能性があります。保存先の必須設定や参照整合性は、データそのものを守る役割です。画面での案内とテーブルでの制約を組み合わせると、修正すべき内容が利用者にも伝わりやすくなります。
自由入力とマスター追加を混同しない
入力チェックを「いいえ」にして文字を入力できるようにしても、その文字が自動で商品マスターへ登録されるわけではありません。また、数値IDを保存する入力欄に自由な商品名を入れる設計は、型や連結列の問題が起きます。新商品は専用の登録画面で追加する流れが分かりやすい方法です。
候補外入力をきっかけに登録を案内するNotInListイベントもありますが、重複、入力取消し、登録権限、追加後の再取得まで設計する必要があります。初心者は、まず「商品を追加」ボタンと専用フォームで運用を明確にしてから、自動化を検討すると原因を調べやすくなります。

候補追加と絞り込みを運用する
マスターへ商品を追加した後は、候補を再取得します。開いたままのコンボボックスには、追加前の候補が残っている場合があります。フォーム全体を作り直す必要はありません。追加した商品が保存済みであることを確認してから、対象のコンボボックスへRequeryを行います。参考5
再読込ボタンを付ける例
同じフォーム上の「候補を再読込」ボタンの名前をcmd候補再読込にし、クリック時のイベントへ次の処理を記述します。コンボボックスの名前はcbo商品です。Requeryは候補を取得し直す処理であり、商品マスターへ新しい商品を登録する処理ではありません。
Private Sub cmd候補再読込_Click()
Me!cbo商品.Requery
End Sub
別フォームで商品を追加する場合は、その登録を保存してから元画面へ戻ります。候補を開いて新商品が出るか、選択後に正しいIDが保存されるかまで確認します。候補クエリに絞り込み条件がある場合は、新商品がその条件を満たすかも調べてください。
連動するプルダウンを作る場合
都道府県を選ぶと市区町村を絞るなど、親の選択に応じて子の候補を変える構成も作れます。子の値集合ソースで親の選択値を参照し、親を変更した後に子を再クエリします。その際、以前選んだ子の値が新しい候補に含まれるかを確認する処理も必要です。
親が変わったのに古い子の値を残すと、組み合わせが不正になります。一方、既存レコードを表示しただけで無条件に子の値を消すと、保存済みデータを壊すおそれがあります。利用者による変更と、レコードを移動して表示する動作を分けて設計してください。
廃止商品と過去データの表示
使わなくなった商品は、安易にマスターから削除せず、利用中フラグなどで管理する方法があります。ただし、新規選択の候補を「利用中だけ」に絞ると、過去の受注明細に保存された廃止商品のIDに対応する表示名が出なくなることがあります。
新規選択用の候補と履歴表示の要件を分け、現在保存されている廃止商品も表示対象へ含める、または履歴画面では名称を別欄で表示するなどの設計を検討します。単票か一覧かでも適切な方法が変わります。候補を減らす前に、過去レコードを開くテストを行いましょう。

表示されない保存されない場合の対処
トラブルは、候補の取得、画面表示、選択値の保存の順に分けて調べます。候補が出ないときにコントロールソースだけを変えても解決しません。逆に、候補を選べるのに保存できないときは、値集合ソースより保存先とデータ型を確認します。
| 症状 | 確認する設定 | 対応の方向 |
|---|---|---|
| 候補が空 | 値集合タイプ、SQL、抽出条件 | 元クエリを単独で開いて件数を確認 |
| 数字しか見えない | 列数、列幅、取得列の順番 | ID列と表示列を対応させる |
| 選べるが保存されない | コントロールソース | 登録用なら保存先フィールドを指定 |
| 型が一致せず保存できない | 連結列と保存先の型 | IDの型をそろえる |
| 新商品が出ない | マスター保存、再クエリ、条件 | 保存後に候補を再取得 |
| 過去の商品名が空欄 | 廃止条件、マスター削除 | 履歴に必要な候補・名称を残す |
完成後は選ぶだけでなく開き直す
作成したコンボボックスで新規選択し、保存後にフォームを開き直します。商品名が表示され、テーブルには期待したIDが入っていれば、取得・表示・保存の三つを確認できます。候補外の文字と未選択も試し、禁止したい入力を本当に防げるか確かめます。
| 確認する操作 | 期待する結果 |
|---|---|
| 既存の商品を選択 | 商品名を表示し、商品IDを保存 |
| 同名の商品を選ぶ | コードや規格で区別できる |
| 商品を追加して再読込 | 保存した新商品が候補に出る |
| 未選択で保存 | 必須なら保存を止め、修正を案内 |
| 廃止商品を含む過去レコードを開く | 当時の商品を識別できる |
プルダウンは、候補を見せるだけでなく、正しい値を保存できて初めて入力支援になります。固定候補とマスターを使い分け、表示名とID、候補外禁止と必須入力を区別して設定しましょう。候補追加や廃止まで考えておくと、運用開始後の修正も少なくできます。

よくある質問
プルダウンは候補を開いて選ぶ見せ方を表す呼び名で、Accessでは主にコンボボックスというコントロールで作ります。リストボックスは候補を常に一覧で見せたい場合に使います。どちらを使うかは、候補数と画面の広さ、入力の目的で決めると分かりやすくなります。また、コンボボックスには登録用と検索条件用があります。配置しただけでは保存先が決まらないため、コントロールソースを持たせるかも確認してください。
コントロールソースが空欄の非連結コンボボックスになっていないか確認します。候補を取得する値集合ソースと、保存先を指定するコントロールソースは別です。登録用なら、フォームのレコードソースに含まれる保存先フィールドを指定してください。連結済みでも保存できない場合は、元クエリが更新可能か、フィールドの型や必須条件に合うかを調べます。選択直後の見た目だけで判断せず、保存後に開き直して値を確認します。
商品IDを保存する設計なら正常です。利用者には商品名を見せ、テーブルにはIDを保存することで、同名商品を区別しやすくなります。候補の1列目がID、2列目が商品名なら、連結列を1、列数を2、1列目の幅を0にする設定が基本です。数字が保存されることだけを理由に連結列を2へ変えると、保存先の数値型と商品名が合わなくなります。値集合ソースの列順、連結列、保存先の型を一組で確認してください。
コンボボックスの入力チェックを「はい」にすると、候補外の値を制限できます。ただし、候補にない文字を受け付けることと、新しいマスターを登録することは別です。新商品を追加できる運用なら、専用の登録フォームを用意し、追加を保存した後に候補を再取得する方法が分かりやすくなります。また、入力チェックだけでは未選択を禁止できないため、必須にしたい場合は保存先フィールドの設定も合わせて確認してください。
いいえ。入力チェックは候補外の値を制限する設定で、未選択のNullを必ず禁止するものではありません。商品を必ず選ばせたい場合は、保存先の商品IDフィールドを必須にするなど、データ側にも制約を設定します。短いテキストを保存する場合は、Nullと長さ0の文字列の違いにも注意し、空文字を許可するかを決めてください。完成後は、候補外の文字を入力するテストと、何も選ばず保存するテストを分けて行います。
まず商品マスターへの追加が保存されているか確認します。保存済みなら、開いたままのコンボボックスが古い候補を表示している可能性があるため、対象コントロールをRequeryして再取得します。それでも出ない場合は、値集合ソースのクエリを単独で開き、利用中フラグやカテゴリなどの条件に新商品が合っているか調べてください。Requery自体は商品を追加する処理ではありません。登録、保存、再取得、選択後の保存を順に確認します。
過去の受注などから参照されている商品は、安易に削除しない方がよいでしょう。参照整合性によって削除できない場合があり、削除すると履歴の商品名を表示できなくなるおそれもあります。利用中フラグなどで新規選択を制限する方法がありますが、候補から外すだけでも過去画面の表示に影響することがあります。新規入力と履歴表示を分けて設計し、廃止商品を含む過去レコードを開いて、識別できる情報が残ることを確認してください。
関連記事
Accessコンボボックスに複数列を表示する方法と保存値の設定
Accessの教科書で選択式フォームの設定を相談する
ここまでの手順を試しても解決しない場合や、既存業務への影響を判断しにくい場合は、対象画面・現在の設定・再現手順を整理してご相談ください。Accessの教科書のお問い合わせ窓口から、状況に合う対応方法を相談できます。
参考情報
参考1 Microsoft リストボックスとコンボボックス
https://support.microsoft.com/en-us/access/add-a-list-box-or-combo-box
参考2 Microsoft 値集合タイプ
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.rowsourcetype
参考3 Microsoft 連結列
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.boundcolumn
参考4 Microsoft 入力チェック
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.limittolist
参考5 Microsoft 再クエリ
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.requery