概要
| この記事の結論 Accessのリストボックスは、候補を一覧表示し、その中から選択するコントロールです。フォームのデザインビューで配置し、[値集合ソース]に候補、[連結列]に使う値、[コントロールソース]に保存先を設定します。商品名を表示しながら商品IDを保存できます。複数選択では保存方法が異なるため、まず単一選択で作成します。 |
この記事でわかること
- 商品マスターと保存先を準備する
- リストボックスを作る手順と主要プロパティ
- 並べ替え 絞り込み 候補の再読み込み
- 複数選択の扱いと保存設計
この記事の主な内容
- リストボックスの役割とコンボボックスとの違い
- 商品マスターと保存先を準備する
- リストボックスを作る手順と主要プロパティ
- 並べ替え 絞り込み 候補の再読み込み
- 複数選択の扱いと保存設計
- 表示されない 保存できないときの対処
- よくある質問
想定読了時間:約15分~18分
リストボックスの役割とコンボボックスとの違い
リストボックスは、複数の候補を画面に並べ、その中から選ぶための部品です。候補が最初から見えるため、数件から数十件程度の一覧を確認しながら選ぶ場面に向いています。候補が多い場合は、絞り込み条件や検索欄を組み合わせて操作量を減らします。
表示領域と入力方法で選ぶ
コンボボックスは一覧を開閉でき、狭い画面にも配置しやすい部品です。一方、リストボックスは候補を見比べやすく、複数選択にも対応します。ただし、複数選択を有効にしただけで、選んだ値を1つのフィールドに自動保存できるわけではありません。
| 比較点 | リストボックス | コンボボックス |
|---|---|---|
| 候補の表示 | 一覧を常時表示する | 通常は選択値を表示し、候補を開く |
| 画面の広さ | 複数行分の領域が必要 | 縦方向を小さくできる |
| 自由入力 | 一覧から選択する | 設定に応じて入力できる |
| 複数選択 | 対応。ただし取得・保存処理が別途必要 | 通常は単一選択 |

フォームの部品とテーブルのルックアップを分ける
本記事では、フォーム上にリストボックスを配置する方法を扱います。テーブルのフィールドにルックアップ設定を入れる手順とは別です。見えている商品名だけで判断せず、実際に保存する値が数値IDか文字列かを確認してください。
入力用のリストボックスと、検索条件用のリストボックスも役割が違います。入力用はテーブルのフィールドへ連結し、検索用は通常、保存先を持たない非連結コントロールとして配置します。この区別が曖昧だと、検索のつもりで現在のレコードを書き換えてしまいます。
商品マスターと保存先を準備する
例として、商品名を選ぶと受注明細に商品IDを保存するフォームを作ります。候補の一覧を持つM_商品と、選択結果を記録するT_受注明細を分けます。商品名が変わっても同じ商品として扱えるよう、識別にはIDを使います。
| M_商品の項目 | データ型 | 設定・例 |
|---|---|---|
| 商品ID | オートナンバー型 | 主キー。例として101、102、103を想定 |
| 商品名 | 短いテキスト型 | コピー用紙、クリアファイル、封筒 |
| 表示順 | 数値型 長整数 | 1、2、3 |
| 使用中 | Yes/No型 | 新規選択で使用できる商品かを管理 |
T_受注明細には、明細ID(オートナンバー型の主キー)、商品ID(数値型・長整数)、数量(数値型)を用意します。商品IDはマスターのオートナンバーを参照するため、保存先をもう一つのオートナンバーにはしません。通常は数値型の長整数を使用します。
候補 表示 保存の対応を整理する
候補を取得するのは[値集合ソース]、候補のどの列を値にするかは[連結列]、どのフィールドへ保存するかは[コントロールソース]です。[列幅]を0にする設定は列を隠すだけで、保存する列を変える設定ではありません。

フォームのレコードソースをT_受注明細に設定してから作業します。すでに存在する入力フォームへ追加する場合は、レコードソースに商品IDが含まれるか、更新可能なクエリかを確認します。コピーしたファイルで試し、共有中の本番マスターを教材用に書き換えないでください。
リストボックスを作る手順と主要プロパティ

デザインビューで直接配置する
1. 対象フォームを右クリックし、[デザインビュー]で開きます。
2. [フォームデザイン]のコントロールから[リストボックス]を選び、詳細セクションに配置します。
3. ウィザードが起動した場合は、テーブルまたはクエリから値を取得する選択肢を指定します。
4. M_商品の商品IDと商品名を選び、保存先をT_受注明細の商品IDにします。
5. 完了後にプロパティシートを開き、下表の設定を確認します。ウィザードを使わず手動設定しても構いません。
手動設定の例
| プロパティ | 設定例 | 意味 |
|---|---|---|
| 名前 | lst商品 | VBAなどから参照する部品名 |
| 値集合タイプ | テーブル/クエリ | 候補をデータベースから取得する |
| 値集合ソース | Q_商品候補 | 次のSQLを保存した選択クエリ |
| 列数 | 2 | 商品IDと商品名の2列 |
| 連結列 | 1 | 1列目の商品IDを値として使用 |
| 列幅 | 0cm;6cm | IDを隠し、商品名を表示 |
| コントロールソース | 商品ID | 受注明細側の保存先 |
| 複数選択 | なし | 1商品だけを選択する |
SELECT [商品ID], [商品名]
FROM [M_商品]
ORDER BY [表示順], [商品名], [商品ID];
このSQLをQ_商品候補という名前で保存します。デザインビューで作る場合も、商品IDと商品名を出力し、表示順などで並べ替えて同じ目的のクエリを用意できます。テーブルは表示順を保証しないため、順番に意味があるならORDER BYで明示します。
表示名を選んでも保存されるのはID
コピー用紙を選ぶと画面には商品名が表示され、T_受注明細の商品IDには対応する数値が保存されます。保存後にテーブルを開いて値を確認してください。選択した行の順番ではなく、その商品のIDであることが大切です。
商品名の表示と保存が両方できれば基本設定は完了です。同じ商品名が複数あるなら、商品コードや規格の列も表示して区別できるようにします。IDを隠すこと自体が目的ではなく、利用者が誤選択しない一覧にすることが目的です。

並べ替え 絞り込み 候補の再読み込み
候補の順番や表示対象は、値集合ソースに使うクエリで整理します。よく使う順や業務で決めた表示順がある場合、名前順だけでなく表示順フィールドを持つ方法が有効です。同順位のときにも順番が安定するよう、最後にIDを指定します。
使用中の商品だけを選べるようにする
新規入力用の候補は、Q_商品候補にWHERE [使用中]=Trueを追加して絞れます。ただし、そのクエリを既存伝票の編集にも共通で使うと、廃止商品のIDを保存した過去明細で商品名が見えなくなる場合があります。
そのため、過去データを含む表示用の候補と新規選択用の候補を分けるか、現在のレコードに保存された商品は候補へ含める設計を検討します。廃止商品をマスターから削除すると履歴参照へ影響するため、使用中フラグで管理する方が扱いやすくなります。
マスター追加後はRequeryを行う
商品マスターを追加しても、開いたままのリストにすぐ反映されないことがあります。その場合は候補を再取得します。フォーム上の更新ボタンで実行する最小例は次のとおりです。商品を追加したレコードを保存してから操作します。
Private Sub cmd候補更新_Click()
Me.lst商品.Requery
End Sub
Requeryは候補の元データを再問い合わせする操作です。再描画だけを行うRepaintとは目的が違います。選択状態や現在値を維持する必要がある画面では、更新前後の値を確認し、廃止などで候補から消えた場合の表示も決めておきます。

非連結リストは自動保存されない
コントロールソースが空欄なら、選択してもレコードへ自動保存されません。検索条件、操作対象の選択、別フォームを開くための部品などに使います。一方、入力用にしたいのに空欄なら保存されない原因になります。
連続フォームで非連結コントロールを使う場合も注意が必要です。行ごとのフィールドに連結されていないため、各行へ独立した値を保持する仕組みにはなりません。明細ごとに商品を保存する用途なら連結先のフィールドが必要です。

複数選択の扱いと保存設計
複数選択は、選択候補をまとめて処理する機能です。単一選択の連結リストを複数選択に変更するだけで、複数のIDを同じフィールドへ保存できるようになるわけではありません。基本設定を完成させてから、別の機能として設計します。
選択した行はItemsSelectedで取得する
[複数選択]には、なし、標準、拡張などの選択肢があります。拡張ではCtrlやShiftを使う選択ができます。複数選択時はコントロールのValueだけで全件を受け取れないため、ItemsSelectedを巡回します。
Private Sub cmd選択確認_Click()
Dim item As Variant
For Each item In Me.lst商品.ItemsSelected
Debug.Print Me.lst商品.ItemData(item)
Next item
End Sub
これは選んだIDをイミディエイトウィンドウへ出力する確認例で、テーブルへ保存するコードではありません。ItemDataは連結列の値を取得します。Columnプロパティを使う場合、列番号は0から始まるため、1から指定する連結列と混同しないでください。
複数の商品は明細テーブルで持つ
たとえば1つの申請に複数商品を保存するなら、T_申請商品に申請IDと商品IDを1行ずつ保存する構成にします。2商品なら2行です。「101,102」のように1セルへ連結すると、結合・集計・重複防止が難しくなります。
保存処理では、追加だけなのか、既存選択と入れ替えるのか、重複を許すのかを決めます。複数行の更新途中でエラーが起きた場合に一部だけが残らないよう、トランザクションなどの制御も設計対象です。本記事では自動更新コードの実装範囲には踏み込みません。

リストボックスと入力画面の改善で困ったときは
まずは本記事の手順をコピーで試し、期待した結果との差を確認してください。作成者が不在の場合や、複数の画面・帳票・取込処理に影響する場合は、Accessの教科書へご相談ください。現在の構成、困っている操作、希望する結果を整理すると、調査すべき範囲を伝えやすくなります。
表示されない 保存できないときの対処
最初に、候補クエリ単体で商品が表示されるかを確認します。クエリに結果があるのにリストが空欄ならコントロール設定、候補は見えるのに保存できないなら保存先やフォームの更新可否、という順に分けると調査しやすくなります。
| 症状 | 確認する設定 | 対処 |
|---|---|---|
| 候補が出ない | 値集合タイプ・値集合ソース | クエリを単体実行し、条件・参照フォームを確認 |
| 数字しか表示されない | 列数・列幅 | 商品名列を含め、ID列の幅を0にする |
| 選択値が保存されない | コントロールソース | 保存先フィールドを指定。更新可能かも確認 |
| 型が一致しない | IDと保存先の型 | オートナンバーに対応する長整数などでそろえる |
| 過去の商品名が空欄 | 使用中条件・マスター欠落 | 現在値を候補へ含めるか表示方法を分ける |
| 新商品が出ない | 未保存・候補の読み直し | マスターを保存してRequeryする |
| 並び順が安定しない | ORDER BY | 明示的な並べ替えと同順位時のIDを設定 |
最終確認は保存先テーブルまで見る
新規選択、別商品への変更、未選択、同名商品、廃止商品、候補更新後を確認します。選択後に別レコードへ移動し、戻った際も正しい商品が表示されるかを試してください。画面で選べるだけでは保存確認にはなりません。

まとめ
リストボックスでは、候補を取得する設定、表示する列、値として使う列、保存先を分けて考えることが大切です。まず商品名を表示してIDを保存する単一選択を完成させ、並べ替えや更新、複数選択は用途に合わせて追加しましょう。
よくある質問
選択肢が固定の短い区分値であれば可能な場面もあります。商品マスターのように名称変更や同名がある場合はIDを保存し、名称を参照する方が整合性を保ちやすくなります。
表示されなくなるだけです。連結列に指定したIDは引き続きコントロールの値にできます。非表示のIDと利用者へ見せる商品名を分ける設定に利用します。
列の値ではなく行の位置を表すListIndexになります。並べ替えや候補追加で位置が変わるため、商品の識別に使うなら商品ID列を指定してください。
少数で固定の選択肢なら値集合タイプを値リストにする方法があります。部署や商品など継続的に増減する候補はマスターテーブルにした方が、複数画面で同じ一覧を共有できます。
通常の連結リストは値の入力を行う部品です。検索に使うなら非連結にし、選択値を条件としてフォームやクエリへ渡す処理を設定します。入力フォームの商品IDを誤って変更しないようにしてください。
リストボックスと入力画面の改善で困ったときは
まずは本記事の手順をコピーで試し、期待した結果との差を確認してください。作成者が不在の場合や、複数の画面・帳票・取込処理に影響する場合は、Accessの教科書へご相談ください。現在の構成、困っている操作、希望する結果を整理すると、調査すべき範囲を伝えやすくなります。
参考情報
ListBox
https://learn.microsoft.com/en-us/office/vba/api/access.listbox
連結列
https://support.microsoft.com/en-us/access/boundcolumn-property
値集合ソース
https://learn.microsoft.com/en-us/office/vba/api/access.listbox.rowsource
列幅
https://learn.microsoft.com/en-us/office/vba/api/access.listbox.columnwidths
複数選択
https://learn.microsoft.com/en-us/office/vba/api/access.listbox.multiselect
Requery
https://learn.microsoft.com/en-us/office/vba/api/access.listbox.requery
関連記事
Accessのコントロールソースとは?設定方法・レコードソースとの違いを初心者向けに解説