Accessコンボボックスに複数列を表示する方法と保存値の設定

概要

この記事の結論
Accessのコンボボックスに複数列を表示するには、値集合ソースに必要な列を含め、列数と列幅を設定します。保存する列は連結列で別に指定します。例えば商品ID・商品コード・商品名の3列を取得し、IDだけを隠して、コードと名称を一覧に出せます。選択後の入力欄は原則として1列の表示なので、追加情報は別のテキストボックスへ表示します。見た目だけでなく、保存先に正しいIDが入ったかまで確認しましょう。

この記事でわかること

  • 候補の列と保存先を区別する
  • 3列の具体設定でプルダウンを作る
  • 選択後の補足表示と保存を分ける
  • 表示崩れや保存値の誤りを切り分ける

この記事の主な内容

  1. 複数列表示と保存する値の関係
  2. 練習用テーブルとフォームを準備する
  3. 列数と列幅を設定する手順
  4. 選択後にもコードと名称を表示する
  5. 表示されないときの確認と対処
  6. 業務で困らないマスターと履歴の設計
  7. 設定後の確認とまとめ
  8. よくある質問

想定読了時間:約12分~15分


複数列表示と保存する値の関係

コンボボックスのプルダウンは複数列にできますが、通常の連結コンボボックスで保存する値は指定した1列です。表示を増やす設定と、どの値をテーブルへ書き込むかの設定を分けて考えることが、誤登録を防ぐ第一歩になります。

例えば商品を選ぶとき、商品IDだけでは内容が分かりません。一方、商品名だけでは同名商品を区別できないことがあります。そこで一覧には商品コードと商品名を並べ、受注明細には重複しない商品IDを保存します。ここでいうIDとは、商品を一意に識別する値です。

3種類のデータ元を混同しない

フォームのレコードソースは、フォームが編集するデータ元です。コンボボックスの値集合ソースは、候補を並べるデータ元です。さらにコントロールソースは、選んだ値を保存するフィールドを指定します。似た名称ですが役割が違います。

設定この例で指定する値役割
フォームのレコードソースT_受注明細入力内容を保存する明細
コンボの値集合ソースM_商品を読むSELECT文選択候補を取り出す
コンボのコントロールソース商品ID選択した商品のIDを保存する
コンボの連結列1候補の1列目をコントロールの値にする

連結列を設定しても、コントロールソースが空欄ならテーブルへ自動保存されません。その状態は「非連結」と呼び、検索条件を一時的に入力させる用途には適しています。登録画面では、どのフィールドへ保存するのかを先に決めてください。[参考1][参考3]

候補に商品コードと商品名を表示し、受注明細には商品IDを保存する関係

練習用テーブルとフォームを準備する

まずは検証用のAccessファイルに、商品マスターと受注明細を用意します。マスターとは繰り返し参照する基本情報の一覧です。本記事の名称や商品は説明用の架空例であり、運用中のテーブルをそのまま変更する手順ではありません。

商品マスターの構造をそろえる

テーブルフィールドデータ型・設定例
M_商品商品IDオートナンバー型・主キー1
M_商品商品コード短いテキスト・重複なしP001
M_商品商品名短いテキストコピー用紙 A4
T_受注明細明細IDオートナンバー型・主キー1
T_受注明細商品ID数値型・長整数型1

商品IDをオートナンバー型にしたマスターを参照する場合、明細側の対応フィールドは通常、数値型の長整数型にします。明細側もオートナンバー型にすると、選択した商品のIDを格納する目的と合いません。既存システムが文字列のキーを使っている場合は、その設計に合わせます。

練習ではP001「コピー用紙 A4」、P002「コピー用紙 A3」、P003「コピー用紙 A4」を登録してみましょう。あえて同名商品を含めると、名称だけで選ぶ危険とコードを併記するメリットを確認できます。商品名の重複を許すかどうかは業務上のルールに従います。

フォームにコンボボックスを配置する

  1. T_受注明細を元に入力フォームを作り、デザインビューで開きます。
  2. コンボボックスを配置し、名前を「cbo商品」にします。
  3. プロパティシートでコントロールソースを「商品ID」にします。
  4. ウィザードを使った場合も、以下の設定表と最終的なプロパティを照合します。

同じフィールドに古い入力欄が残っている場合は、二重入力による混乱が起きない配置にします。まず検証用フォームで設定を確定させ、保存した商品IDをテーブル側でも確認できる状態にしておきましょう。

商品ID、商品コード、商品名をこの順に取得する値集合ソース

列数と列幅を設定する手順

複数列表示の中心は、値集合ソース・列数・列幅の3項目です。加えて、プルダウン全体のリスト幅を調整します。コンボボックス本体の横幅と、開いた候補一覧の横幅は別に設定できます。[参考1][参考2]

値集合ソースに3列を指定する

コンボボックスの値集合タイプを「テーブル/クエリ」にし、値集合ソースへ次のSQLを設定します。SQLとは、データを取り出す条件や処理を記述する言語です。プロパティ右側のビルダーボタンからクエリデザインを開いて同じ列を選んでも構いません。

SELECT [商品ID], [商品コード], [商品名]
FROM [M_商品]
ORDER BY [商品コード], [商品ID];

SELECTの後に書いた順序が、1列目、2列目、3列目の順になります。列の追加や並べ替えをすると、連結列やColumnで参照する位置も変わります。保守時に意図せず保存値を変えないよう、SELECT *で全列を取り出すより列名を明示する方が確認しやすくなります。

プロパティを具体的に設定する

プロパティ設定例確認する意味
名前cbo商品他の式から参照するコントロール名
コントロールソース商品IDT_受注明細の保存先
値集合タイプテーブル/クエリマスターから候補を取得
値集合ソース上記のSELECT文商品ID・コード・名称の3列
連結列1商品IDを値として使う
列数33列分を取り扱う
列幅0cm;3cm;6cmIDを隠し、コードと名称を表示
リスト幅9cm見える列の合計幅を目安にする
入力チェックはい一覧にない入力をそのまま確定しない

列幅0cmは「その列を表示しない」という設定です。列自体が削除されるわけではないため、非表示のID列を連結列として使えます。区切りや単位の表示は地域設定で異なる場合があるので、入力後にAccessが表示する値も確認してください。

幅はこの例の開始値です。長い商品名、フォントサイズ、表示倍率によって見え方が変わるため、実際のデータで調整します。列見出しを表示したい場合は「列見出し」を「はい」にし、取得元のフィールド名などが読みやすいか確認します。

値集合ソースから列数、列幅、リスト幅を順に設定する流れ

連結列とColumnは開始番号が違う

連結列の「1」は1列目を意味します。一方、後述のColumn(0)は1列目、Column(1)は2列目を参照します。この違いを見落とすと、商品名を出したつもりで商品コードが出るなどの誤りにつながります。[参考3][参考4]

なお、連結列を0にすると、通常の1列目の値ではなく一覧の行位置を値として扱います。商品IDを保存する本記事の例では使いません。「ID列を隠すために連結列を0にする」という設定は誤りで、非表示は列幅側で指定します。

連結列は1から、Columnの列番号は0から数える違い

選択後にもコードと名称を表示する

候補一覧を閉じると、コンボボックス本体には基本的に最初の表示列が出ます。本例では商品コードです。複数列の幅を広げても、選択後の入力欄に3列がそのまま横並びで残るわけではありません。

表示専用テキストボックスを追加する

隣にテキストボックス「txt商品名表示」を配置し、コントロールソースに次の式を設定します。名前には「商品名」そのものではなく、表示用だと分かる名前を付けると、フィールドとの混同を防げます。

=[cbo商品].Column(2)

この式は候補の3列目、つまり商品名を表示します。表示専用欄は編集ロックを「はい」にし、タブストップを「いいえ」にすると、入力の流れを妨げにくくなります。未選択の場合はNullになるため、空欄表示が自然かも確認します。[参考4]

この方法で商品名を見せても、その名称を明細へ保存したことにはなりません。現在のマスターを見せたいのか、受注時点の名称を履歴として保存したいのかを区別してください。表示式の利用と、履歴項目への値の確定は別の設計です。

連続フォームでは行ごとに確認する

複数レコードを縦に並べる連続フォームでは、補足欄が各行の商品と正しく対応するかを確認します。独立した非連結欄へVBAで1つの値だけ代入する設計では、意図した行別表示にならないことがあります。必要に応じてフォームのレコードソースを商品マスターと結合します。

その場合も、結合キーは商品IDにします。商品名だけで結ぶと同名商品の分だけ行が増えるおそれがあります。また、結合したクエリが更新可能か、新規明細で未選択の行が表示されるかを検証してください。結合により表示を解決しても、登録操作ができなければ入力フォームとしては完成していません。

コンボボックスの横に商品名を表示するテキストボックスを置く考え方

コンボボックスと入力画面の設計でお困りの方へ

検証用コピーでの確認が難しい場合や、複数の画面・外部連携へ影響する場合は、Accessの教科書のお問い合わせ窓口へご相談ください。現在の構成、困っている操作、変更したい内容を整理すると、確認すべき範囲を伝えやすくなります。


表示されないときの確認と対処

表示がおかしいときは、まず値集合ソースを単独で開いて候補データが正しいか確認します。候補そのものが誤っている問題と、候補は正しいのに画面設定で見えない問題を分けると、直す箇所を絞れます。

症状最初に確認する箇所対処の考え方
商品名の列がない値集合ソースと列数商品名がSELECTにあり、列数が3か確認
IDだけ見える列幅と列の順序ID列を0cm、表示したい列を正の幅にする
右側が切れるリスト幅・列幅・表示倍率一覧全体を広げ、実データで確認
保存すると別の商品になる連結列・保存先・型ID列を値にし、対応フィールドへ保存
追加した商品が出ない候補の再取得・絞り込み条件必要なタイミングでRequeryし条件を確認
選択するとエラーになる保存先の必須・参照整合性マスターの存在とフィールド定義を確認
商品名が複数出るマスターの重複・結合条件名称でなく一意のキーを使う

マスター更新後に候補を取り直す場合は、例えばフォーム内で「Me!cbo商品.Requery」を使います。ただし入力途中で頻繁に再取得すると選択操作を妨げるため、商品登録フォームを閉じた後など、必要な場面に絞ります。RefreshとRequeryを同じものとして扱わないことも大切です。

廃止商品を値集合ソースの条件で完全に除外すると、過去の明細に保存された商品IDに対応する表示が失われる場合があります。新規選択では有効商品を中心にし、過去レコードの表示では廃止商品も識別できるようにするなど、登録と履歴参照を分けて検討します。

列数不足、幅ゼロ、リスト幅不足、保存先不一致を確認する図

業務で困らないマスターと履歴の設計

複数列表示は選び間違いを減らすための仕組みです。列を増やすほど使いやすくなるわけではありません。同名商品を区別するために必要なコード・規格などに絞り、価格や備考の全情報は別の確認欄へ分けると、一覧を読み取りやすくなります。

単価は表示と確定時点を分ける

現在の単価をマスターから表示するだけでは、受注当時の価格を保存できません。過去の受注金額を保持する必要がある場合は、受注明細へ受注単価を保存し、商品選択時の初期値と、その後の変更可否を決めます。マスター更新が過去帳票へ波及しない設計が必要です。

また、入力チェックを「はい」にしても、業務上正しい商品かをすべて判断できるわけではありません。取扱終了、担当部署、得意先別契約などの条件がある場合は、候補の絞り込みと保存前チェックを組み合わせます。件数が非常に多い場合は、検索語や分類で候補を減らす画面も検討できます。


設定後の確認とまとめ

完成確認では、見た目と保存結果の両方を確認します。商品を選んで画面がきれいに表示されただけでは、連結列や保存先の誤りを見逃します。保存後にフォームを開き直し、明細のIDとマスターのIDが一致するかを調べましょう。

確認ケース期待する結果
同名商品を選ぶコードで識別でき、正しいIDが保存される
未選択のまま保存する必須の場合は分かるメッセージで止まる
別の明細へ移動して戻るその行の商品が再表示される
長い商品名を選ぶ一覧と補足欄で内容が確認できる
廃止商品を含む過去伝票を開く履歴表示が欠けない
マスター単価を変更する過去の受注単価を意図せず書き換えない

複数列表示では、値集合ソースの列順、列数、列幅を合わせ、連結列とコントロールソースで保存値を確定します。選択後の追加表示は別欄で補い、履歴として残す値は保存項目を別に設計することが重要です。

同名商品、未選択、保存後の再表示、マスター変更を確認する項目

よくある質問

できます。値集合ソースに2列を含めて列数を2にし、両方の列幅を0より大きく設定します。ただし、内部IDを保存しながらコードと商品名の2列を見せたい場合、取得する列はIDを含む3列です。その場合は列数を3、IDの列幅を0cmにします。取得する列の数と、利用者に見える列の数は一致しない場合があります。設定後はプルダウンの表示だけでなく、保存先にどの値が入るかも確認してください。

できます。商品IDを1列目、商品名を2列目にした値集合ソースで、連結列を1、列幅を「0cm;6cm」などに設定します。IDは隠れ、最初の表示列となる商品名が画面に出ます。さらに、コントロールソースを明細の商品IDフィールドへ設定してください。連結列だけを指定し、コントロールソースを空欄にした状態では、選択した値はテーブルへ自動保存されません。IDのデータ型も保存先と合わせます。

コンボボックスの隣へ表示専用のテキストボックスを置く方法が分かりやすいです。本記事の3列構成なら、商品名を出す式は「=[cbo商品].Column(2)」です。Columnは0から数えるため、2が3列目を指します。この欄は表示用であり、名称を明細へ保存する機能ではありません。過去伝票へ受注時の名称を残したい場合は、履歴項目を設ける必要があります。連続フォームでは各行の表示も必ず確認しましょう。

値集合ソースに商品名が含まれているか、列数が不足していないか、対象列の幅が0になっていないかを順番に確認します。列数が2のままなら、SQLで3列を取得していても3列目は表示対象になりません。また、リスト幅が狭いと右側が見切れます。まず値集合ソースのクエリを単独で開いてデータを確かめ、その後で列数と幅を調整すると原因を絞れます。列幅を広げる前に列の順序も確認してください。

目的によって異なります。常に現在の商品名を表示できればよい場合は、商品IDからマスターを参照する構成が基本です。一方、受注時点の名称や規格を伝票の履歴として残す必要がある場合は、その時点の値を明細へ保存する設計が考えられます。同じ名称を無目的に重複保存すると、どちらを正とするか分からなくなります。最新情報の参照と過去時点の記録を分け、修正できる人や更新するタイミングまで決めてください。

基本的な複数列表示はVBAなしで作れます。コンボボックスのウィザードやプロパティシートで値集合ソース、列数、列幅、連結列を設定すれば対応できます。商品名を別欄へ出す場合も、テキストボックスのコントロールソースにColumnの式を入れる方法があります。候補を条件で動的に変える、商品登録後に候補を再取得する、受注単価を確定するなど、業務処理を追加する段階でVBAやマクロの利用を検討しましょう。

コンボボックスと入力画面の設計でお困りの方へ

検証用コピーでの確認が難しい場合や、複数の画面・外部連携へ影響する場合は、Accessの教科書のお問い合わせ窓口へご相談ください。現在の構成、困っている操作、変更したい内容を整理すると、確認すべき範囲を伝えやすくなります。

関連記事

Accessのフォームとは

プロパティシートの使い方

コントロールソースの使い方

リストボックスの作り方


参考情報

参考1 Microsoft Learn|ColumnCount
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.columncount

参考2 Microsoft Learn|ColumnWidths
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.columnwidths

参考3 Microsoft Learn|BoundColumn
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.boundcolumn

参考4 Microsoft Learn|Column
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.column

TOP