Accessコンボボックス・リストボックスで入力を効率化する|データソース設定・連動選択・値リスト定義の実践手順とMOS試験対策

「フォームのフィールドにドロップダウンで選択肢を出したい」「コンボボックスとリストボックスはどう違うの?」という疑問はAccessフォーム設計で必ず直面します。コンボボックスとリストボックスは、決まった値の中から選ばせる入力コントロールで、直接入力ミスをゼロに近づける最重要パーツです。

テーブルの値リスト・別テーブルのデータ・クエリ結果などさまざまなデータソースを接続でき、連動コンボボックス(親の選択で子の選択肢を絞り込む)のような高度な実装も可能です。MOS Access試験でも「コントロールウィザード」「RowSource設定」「ControlSource設定」が出題されます。

本記事では、コンボボックス・リストボックスの基本的な仕組みから、フォームへの追加手順・データソースの種類・連動コンボボックスの実装・よくあるトラブル対処・MOS試験の頻出ポイントまで体系的に解説します。

目次

コンボボックスとリストボックスの違い

2つのコントロールは「選択肢を一覧から選ぶ」という点では共通しますが、動作と用途が異なります。

項目コンボボックスリストボックス
表示形態クリックするとリストが展開する(折りたたみ式)常に選択肢が一覧表示される(展開なし)
直接入力可能(プロパティで制限も可)不可(リストから選ぶのみ)
複数選択不可(1件のみ)可能(MultiSelectプロパティで設定)
フォーム上の占有面積小さい(展開前は1行分)大きい(複数行分を常時確保)
典型的な用途性別・都道府県・担当者名など1件選択趣味・スキルなど複数選択が必要な項目

判断基準:選択肢が多い・フォームのスペースを節約したい・1件のみ選択ならコンボボックス。複数選択が必要・常時一覧を見せたいならリストボックスを選びます。実務のフォームはコンボボックスが圧倒的多数です。

コンボボックスをフォームに追加する基本手順

フォームのデザインビューを開いた状態で以下の手順で追加します。

  1. フォームをデザインビューで開く
  2. リボン「フォームデザイン」→「コントロール」グループでコントロールウィザードのアイコン(魔法の杖)がオンになっていることを確認する
  3. 「コンボボックス」ボタンをクリックし、フォーム上でドラッグして配置する
  4. コンボボックスウィザードが起動する(ウィザードオフの場合は手動設定が必要)
  5. ウィザードでデータソースの種類を選択する(詳細は次節)
  6. 連結するフィールド・表示する列・ラベルのテキストを設定して完了する

ウィザードを使うと設定の見落としが大幅に減ります。MOS試験でもウィザードを使って設定する問題が出題されます。ウィザードが起動しない場合は、リボンの「コントロールウィザード」ボタンの有効化を確認してください。

データソースの種類と選び方

コンボボックスウィザードでは、選択肢(行)のデータをどこから取得するかを最初に選びます。

データソースの種類内容使いどころ
テーブルまたはクエリ既存のテーブルやクエリから行を自動取得するマスタテーブル(担当者・商品・都道府県)など
自分で値を入力する(値リスト)ウィザードで直接選択肢を列挙する性別(男性・女性)・ステータス(対応中・完了)など固定かつ少数の選択肢
別のフォームでレコードを検索するコンボボックスで検索を行う特殊タイプ「レコード検索コンボボックス」として使用

実務のルール:選択肢が変動する(新しいスタッフが増える等)場合は「テーブルまたはクエリ」を選びます。選択肢が固定で5個以下の場合に限り「値リスト」を使います。値リストは選択肢を追加するたびにフォームのプロパティを手動で修正する必要があるため、運用コストが高いです。

テーブルをデータソースにする実践手順

「担当者テーブル」のデータをコンボボックスで選ばせる例で手順を確認します。

ウィザードを使う場合

  1. ウィザードの最初の画面で「テーブルまたはクエリの値を使う」を選択し「次へ」
  2. データ取得元のテーブル(例:担当者テーブル)を選択し「次へ」
  3. コンボボックスに表示する列(例:担当者ID・担当者名)を「選択したフィールド」に移動し「次へ」
  4. 並べ替え列(例:担当者名の昇順)を設定し「次へ」
  5. 「隠しキー列を使う」にチェックが入っていることを確認し、表示幅を調整して「次へ」(担当者IDを隠して担当者名だけ表示する一般的な設定)
  6. 連結するフィールド(ControlSource)に「担当者ID」フィールドを指定し「次へ」
  7. ラベルのテキストを入力して「完了」

プロパティシートで直接設定する場合

ウィザードを使わずプロパティシートで設定する場合の主要プロパティを確認します。

プロパティ設定値の例意味
RowSourceType(行ソースの種類)テーブル/クエリデータの種類を指定する
RowSource(行ソース)担当者テーブル(またはSELECT文)データ取得元のテーブル名またはSQL文を指定する
BoundColumn(連結列)1実際にフィールドに保存する列番号(担当者IDが1列目なら1)
ColumnCount(列数)2コンボボックスで表示する列の数
ColumnWidths(列の幅)0cm;4cm幅0=非表示。担当者IDを隠して担当者名だけ見せる
ControlSource(コントロールソース)担当者ID選択結果を書き込む連結フィールド名
LimitToList(リスト入力の制限)はいリスト外の値を入力できないようにする

BoundColumnとColumnWidthsの組み合わせが最もわかりにくい設定です。「担当者IDで保存したいが画面には担当者名を表示したい」というケースは、BoundColumn=1(ID列が1列目)、ColumnWidths=「0cm;4cm」(ID列を幅0=非表示)で実現します。列を非表示にしてもBoundColumnで指定した列の値は保存されます。

値リストでコンボボックスを設定する

選択肢が固定で少数の場合は値リストが最もシンプルです。

ウィザードを使う場合

  1. ウィザードの最初の画面で「自分で値を入力する」を選択し「次へ」
  2. 表示される入力欄に選択肢を1行ずつ入力する(例:対応中・完了・保留)
  3. 「次へ」→連結フィールドを選択→ラベルを入力して「完了」

プロパティシートで直接設定する場合

RowSourceTypeを「値リスト」、RowSourceにセミコロン区切りの値を入力します。

RowSourceType: 値リスト
RowSource: 対応中;完了;保留

値リストで複数列を持たせる場合(表示値と保存値を分ける)は、セミコロン区切りで交互に入力し、ColumnCountを2に設定します(例:"0001";"対応中";"0002";"完了")。ColumnCountとBoundColumnを適切に設定する点はテーブルをデータソースにする場合と同じです。

連動コンボボックスの実装手順

「都道府県」を選ぶと「市区町村」の選択肢が絞り込まれるような連動コンボボックスは、フォームで最もよく使われる高度な機能の1つです。

準備:テーブル設計

都道府県マスタテーブル(都道府県ID・都道府県名)と市区町村マスタテーブル(市区町村ID・都道府県ID・市区町村名)の2テーブルを用意します。市区町村テーブルに「都道府県ID」の外部キーを持たせることが連動の前提です。

実装手順

  1. 親コンボボックス(cbo都道府県)を作成し、都道府県マスタテーブルに接続する
  2. 子コンボボックス(cbo市区町村)を作成し、RowSourceTypeを「テーブル/クエリ」にした上で、RowSourceに以下のSQL文を設定する
SELECT 市区町村ID, 市区町村名 FROM 市区町村マスタ WHERE 都道府県ID = Forms![フォーム名]![cbo都道府県]
  1. 親コンボボックス(cbo都道府県)の「更新後処理」イベントに次のマクロアクション(またはVBAコード)を設定する
Me.cbo市区町村.Requery    ' VBAの場合
' マクロの場合:「クエリの再クエリ」アクションでコントロール名にcbo市区町村を指定
  1. 子コンボボックスのRequeryを実行すると、WHERE句のForms![フォーム名]![cbo都道府県]が現在選択中の都道府県IDで評価され、該当する市区町村だけが表示される

注意点:SQL文の中でフォームコントロールを参照する式は、フォームが開かれた状態でのみ有効です。フォームを閉じた状態でRowSourceを確認すると#Nameエラーが表示されることがありますが、フォームを開いて操作する分には正常に動作します。

コンボボックスでレコードを検索する

コンボボックスは入力だけでなく、フォーム上のレコードをすばやく検索するためにも使います。

ウィザードを使ったレコード検索コンボボックスの作成

  1. コンボボックスウィザードの最初の画面で「別のフォームでレコードを検索する」を選択する
  2. 表示する列(例:顧客IDと顧客名)を選択する
  3. ウィザードが完了すると、コンボボックスの「更新後処理」に自動生成されたVBAコードが設定される

自動生成されるVBAコードの骨格は次の通りです。

Private Sub cbo検索_AfterUpdate()
    Dim rs As Object
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[顧客ID] = " & Str(Nz(Me![cbo検索], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

コンボボックスで顧客名を選ぶと、フォームがその顧客のレコードに移動します。MOS試験では「ウィザードを使ってレコード検索用コンボボックスを追加する」操作が出題されます。

リストボックスで複数選択を実装する

リストボックスのMultiSelectプロパティを設定すると、複数の項目を同時に選択できます。

MultiSelect設定値動作
なし(0)1件のみ選択可能(既定)
シンプル(1)クリックするたびに選択・解除を切り替える
拡張(2)ShiftキーやCtrlキーと組み合わせてまとめて選択できる(Windowsエクスプローラーと同じ感覚)

複数選択した値をVBAで取得するにはItemsSelectedコレクションを使います。

Dim varItem As Variant
For Each varItem In Me.lst選択.ItemsSelected
    Debug.Print Me.lst選択.ItemData(varItem)
Next varItem

複数選択の結果をテーブルに保存する場合は、選択した件数分のレコードを追加クエリで書き込む処理が必要です。MultiSelectが「なし」以外の場合、ControlSourceへの直接連結はできない点に注意します。

よくあるトラブルと対処法

症状主な原因対処法
コンボボックスに何も表示されないRowSourceが正しく設定されていない・テーブルが空プロパティシートでRowSourceを確認し、SQLビューでデータを返すか確認する
選択しても連結フィールドに値が入らないControlSourceが未設定またはフィールド名のスペルミスControlSourceのプロパティをフィールド名と照合して修正する
担当者名ではなくIDが表示されるColumnWidthsでID列を非表示にしていないColumnWidthsを「0cm;4cm」のようにID列を0幅に設定する
リスト外の値が入力できてしまうLimitToListが「いいえ」になっているLimitToListを「はい」に変更する
連動コンボボックスが更新されない親コンボボックスの更新後処理にRequeryが設定されていない親コンボボックスの「更新後処理」にRequeryマクロまたはVBAコードを追加する
#Nameエラーが行ソースに表示されるSQL文内のフォーム参照が解決できない(フォームを閉じた状態で確認している)フォームを開いた状態で動作を確認する(フォームを閉じた状態での#Nameは正常)

MOS Access試験でのコンボボックス出題ポイント

MOS Access 365&2019では、フォームコントロールの設定が「フォームの作成と変更」スキル項目で出題されます。コンボボックス・リストボックス関連の頻出ポイントは以下の通りです。

  • コントロールウィザードを使ってコンボボックスを追加する操作:ウィザードを起動してデータソースを選択し、連結フィールドを設定する一連の操作を正確に実行できること
  • データソースの選択:「テーブルまたはクエリ」と「値リスト」の使い分けを問題文の条件から正確に判断する
  • レコード検索コンボボックスの追加:「別のフォームでレコードを検索する」オプションを選択してウィザードで作成する操作
  • プロパティの変更:ColumnWidths・LimitToList・RowSourceなどを問題指示に従ってプロパティシートで変更する操作
  • コンボボックスの列設定:ColumnCountと列幅を設定して不要な列を非表示にする操作

MOS試験 コンボボックス関連チェックリスト

確認ポイント操作内容難易度
コントロールウィザード経由でコンボボックスを追加ウィザードを起動→データソース選択→連結フィールド設定まで完了できる★★☆
値リストの設定RowSourceTypeを「値リスト」に変更し、セミコロン区切りで選択肢を入力できる★★☆
テーブルをデータソースに設定RowSourceにテーブル名またはSELECT文を設定しColumnCountを調整できる★★☆
ID列の非表示設定ColumnWidthsで最初の列を0cmに設定して非表示にできる★★★
LimitToListの設定リスト外の値を入力不可にするためLimitToListを「はい」に変更できる★☆☆
レコード検索コンボボックスの作成ウィザードで「別のフォームでレコードを検索する」を選択して設定できる★★★

まとめ:コンボボックス・リストボックスでフォームの品質を高める

本記事のポイントをまとめます。

  • コンボボックスとリストボックスの使い分け:1件選択・スペース節約ならコンボボックス。複数選択が必要ならリストボックス
  • データソースはテーブルを優先:選択肢が変動する場合はテーブルに接続する。固定かつ少数の場合のみ値リストを使う
  • BoundColumnとColumnWidthsの組み合わせ:IDで保存して名前を表示するには、BoundColumnをID列番号に設定し、ColumnWidthsでID列を0幅にする
  • LimitToListは原則「はい」:不正な値の入力を防ぐため、連結フィールドのコンボボックスでは常にオンにする
  • 連動コンボボックス:子のRowSourceのWHERE句で親の値を参照し、親の更新後処理でRequeryを実行する
  • MOS試験対策:ウィザードの操作手順・プロパティ名・レコード検索コンボボックスの作成を中心に反復練習する

コンボボックス・リストボックスを使いこなせると、Accessフォームの入力品質とユーザービリティが大幅に向上します。ウィザードでの素早い設定とプロパティシートでの細かい調整、両方の操作を習得してMOS試験合格と実務活用の両方を目指しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次