「フォームのフィールドにドロップダウンで選択肢を出したい」「コンボボックスとリストボックスはどう違うの?」という疑問はAccessフォーム設計で必ず直面します。コンボボックスとリストボックスは、決まった値の中から選ばせる入力コントロールで、直接入力ミスをゼロに近づける最重要パーツです。
テーブルの値リスト・別テーブルのデータ・クエリ結果などさまざまなデータソースを接続でき、連動コンボボックス(親の選択で子の選択肢を絞り込む)のような高度な実装も可能です。MOS Access試験でも「コントロールウィザード」「RowSource設定」「ControlSource設定」が出題されます。
本記事では、コンボボックス・リストボックスの基本的な仕組みから、フォームへの追加手順・データソースの種類・連動コンボボックスの実装・よくあるトラブル対処・MOS試験の頻出ポイントまで体系的に解説します。
コンボボックスとリストボックスの違い
2つのコントロールは「選択肢を一覧から選ぶ」という点では共通しますが、動作と用途が異なります。
| 項目 | コンボボックス | リストボックス |
|---|---|---|
| 表示形態 | クリックするとリストが展開する(折りたたみ式) | 常に選択肢が一覧表示される(展開なし) |
| 直接入力 | 可能(プロパティで制限も可) | 不可(リストから選ぶのみ) |
| 複数選択 | 不可(1件のみ) | 可能(MultiSelectプロパティで設定) |
| フォーム上の占有面積 | 小さい(展開前は1行分) | 大きい(複数行分を常時確保) |
| 典型的な用途 | 性別・都道府県・担当者名など1件選択 | 趣味・スキルなど複数選択が必要な項目 |
判断基準:選択肢が多い・フォームのスペースを節約したい・1件のみ選択ならコンボボックス。複数選択が必要・常時一覧を見せたいならリストボックスを選びます。実務のフォームはコンボボックスが圧倒的多数です。
コンボボックスをフォームに追加する基本手順
フォームのデザインビューを開いた状態で以下の手順で追加します。
- フォームをデザインビューで開く
- リボン「フォームデザイン」→「コントロール」グループでコントロールウィザードのアイコン(魔法の杖)がオンになっていることを確認する
- 「コンボボックス」ボタンをクリックし、フォーム上でドラッグして配置する
- コンボボックスウィザードが起動する(ウィザードオフの場合は手動設定が必要)
- ウィザードでデータソースの種類を選択する(詳細は次節)
- 連結するフィールド・表示する列・ラベルのテキストを設定して完了する
ウィザードを使うと設定の見落としが大幅に減ります。MOS試験でもウィザードを使って設定する問題が出題されます。ウィザードが起動しない場合は、リボンの「コントロールウィザード」ボタンの有効化を確認してください。
データソースの種類と選び方
コンボボックスウィザードでは、選択肢(行)のデータをどこから取得するかを最初に選びます。
| データソースの種類 | 内容 | 使いどころ |
|---|---|---|
| テーブルまたはクエリ | 既存のテーブルやクエリから行を自動取得する | マスタテーブル(担当者・商品・都道府県)など |
| 自分で値を入力する(値リスト) | ウィザードで直接選択肢を列挙する | 性別(男性・女性)・ステータス(対応中・完了)など固定かつ少数の選択肢 |
| 別のフォームでレコードを検索する | コンボボックスで検索を行う特殊タイプ | 「レコード検索コンボボックス」として使用 |
実務のルール:選択肢が変動する(新しいスタッフが増える等)場合は「テーブルまたはクエリ」を選びます。選択肢が固定で5個以下の場合に限り「値リスト」を使います。値リストは選択肢を追加するたびにフォームのプロパティを手動で修正する必要があるため、運用コストが高いです。
テーブルをデータソースにする実践手順
「担当者テーブル」のデータをコンボボックスで選ばせる例で手順を確認します。
ウィザードを使う場合
- ウィザードの最初の画面で「テーブルまたはクエリの値を使う」を選択し「次へ」
- データ取得元のテーブル(例:担当者テーブル)を選択し「次へ」
- コンボボックスに表示する列(例:担当者ID・担当者名)を「選択したフィールド」に移動し「次へ」
- 並べ替え列(例:担当者名の昇順)を設定し「次へ」
- 「隠しキー列を使う」にチェックが入っていることを確認し、表示幅を調整して「次へ」(担当者IDを隠して担当者名だけ表示する一般的な設定)
- 連結するフィールド(ControlSource)に「担当者ID」フィールドを指定し「次へ」
- ラベルのテキストを入力して「完了」
プロパティシートで直接設定する場合
ウィザードを使わずプロパティシートで設定する場合の主要プロパティを確認します。
| プロパティ | 設定値の例 | 意味 |
|---|---|---|
| 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行ずつ入力する(例:対応中・完了・保留)
- 「次へ」→連結フィールドを選択→ラベルを入力して「完了」
プロパティシートで直接設定する場合
RowSourceTypeを「値リスト」、RowSourceにセミコロン区切りの値を入力します。
RowSourceType: 値リスト
RowSource: 対応中;完了;保留
値リストで複数列を持たせる場合(表示値と保存値を分ける)は、セミコロン区切りで交互に入力し、ColumnCountを2に設定します(例:"0001";"対応中";"0002";"完了")。ColumnCountとBoundColumnを適切に設定する点はテーブルをデータソースにする場合と同じです。
連動コンボボックスの実装手順
「都道府県」を選ぶと「市区町村」の選択肢が絞り込まれるような連動コンボボックスは、フォームで最もよく使われる高度な機能の1つです。
準備:テーブル設計
都道府県マスタテーブル(都道府県ID・都道府県名)と市区町村マスタテーブル(市区町村ID・都道府県ID・市区町村名)の2テーブルを用意します。市区町村テーブルに「都道府県ID」の外部キーを持たせることが連動の前提です。
実装手順
- 親コンボボックス(cbo都道府県)を作成し、都道府県マスタテーブルに接続する
- 子コンボボックス(cbo市区町村)を作成し、RowSourceTypeを「テーブル/クエリ」にした上で、RowSourceに以下のSQL文を設定する
SELECT 市区町村ID, 市区町村名 FROM 市区町村マスタ WHERE 都道府県ID = Forms![フォーム名]![cbo都道府県]
- 親コンボボックス(cbo都道府県)の「更新後処理」イベントに次のマクロアクション(またはVBAコード)を設定する
Me.cbo市区町村.Requery ' VBAの場合
' マクロの場合:「クエリの再クエリ」アクションでコントロール名にcbo市区町村を指定
- 子コンボボックスのRequeryを実行すると、WHERE句の
Forms![フォーム名]![cbo都道府県]が現在選択中の都道府県IDで評価され、該当する市区町村だけが表示される
注意点:SQL文の中でフォームコントロールを参照する式は、フォームが開かれた状態でのみ有効です。フォームを閉じた状態でRowSourceを確認すると#Nameエラーが表示されることがありますが、フォームを開いて操作する分には正常に動作します。
コンボボックスでレコードを検索する
コンボボックスは入力だけでなく、フォーム上のレコードをすばやく検索するためにも使います。
ウィザードを使ったレコード検索コンボボックスの作成
- コンボボックスウィザードの最初の画面で「別のフォームでレコードを検索する」を選択する
- 表示する列(例:顧客IDと顧客名)を選択する
- ウィザードが完了すると、コンボボックスの「更新後処理」に自動生成された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試験合格と実務活用の両方を目指しましょう。
