概要
| この記事の結論 Accessで複数の選択肢から1つを選ばせるには、オプショングループの中にオプションボタンを配置します。各ボタンへ異なる数値の[オプション値]を割り当て、グループ枠の[コントロールソース]を保存先フィールドへ設定します。保存されるのは表示文字ではなく数値です。未選択や既存データの値も確認しましょう。 |
この記事でわかること
- 単一選択は1つのグループに入れる
- 表示文字と保存値を区別する
- 保存先はグループ枠へ設定する
- 未選択と過去のコードを確認する
この記事の主な内容
- オプションボタンとオプショングループの違い
- 保存する値とテーブルを先に設計する
- オプショングループを作成してフィールドへ連結する
- VBAで選択値を取得して条件分岐する
- 選べない保存されないときの原因と対処
- 選択肢の変更と長期運用の確認ポイント
- まとめ
- よくある質問
想定読了時間:約15分~20分
オプションボタンとオプショングループの違い
複数の候補から1つを選ばせたい場合は、オプショングループを使います。その中へオプションボタンを配置すると、同じグループ内では1つだけを選択できるようになります。ボタンをただ横に並べるだけでは、1つの選択肢群として動くとは限りません。
例えば「連絡方法」を電話、メール、郵送のいずれかに決める入力に向いています。選択した結果を保存したいなら、グループを保存先フィールドへ連結します。選択状態の見た目だけで完成とせず、テーブルへどんな値が入るかまで確認しましょう。
単独のオプションボタンは役割が異なる
グループに入っていないオプションボタンは、選択されているかどうかというTrue/Falseの値を扱います。一方、グループ内のボタンは、各ボタンに割り当てた数値をグループへ渡します。同じ形の丸いボタンでも、保存値の仕組みが異なります。
| 入力したい内容 | 選ぶ部品の例 | 設計のポイント |
|---|---|---|
| 複数の候補から1つ | オプショングループ | 候補と数値コードの対応を決める |
| はい・いいえの1項目 | チェックボックスなど | Yes/Noの意味を明確にする |
| 少数の独立した複数選択 | 独立したチェックボックスなど | 項目ごとの意味と保存先を決める |
| 候補が多い1項目 | コンボボックス | マスターから候補を表示する |

オプショングループが向く条件を見極める
候補が少なく、すべてを同時に見せると判断しやすい項目に向いています。候補の文章が長い、件数が増え続ける、条件によって候補が変わる場合は、コンボボックスなどのほうが画面を保守しやすいことがあります。
複数の連絡方法を登録したいのに、単一選択のグループへ押し込むと情報が失われます。「第1希望を1つ選ぶ」のか、「利用可能な方法をすべて記録する」のかを先に確認してください。複数選択を保存する設計は、別のテーブルへ行として持つ方法も含めて検討します。
保存する値とテーブルを先に設計する
フォームを作る前に、表示する文字と保存する数値の対応を決めます。オプショングループが扱う値は数値で、ボタンのラベル文字列がそのまま保存されるわけではありません。
連絡方法のコード表を用意する
説明用に、電話を1、メールを2、郵送を3とします。これは本記事の例であり、一般的に決まっているコードではありません。既存システムに区分コードがある場合は、その意味を優先して合わせます。
| 画面のラベル | オプション値 | テーブルに保存する意味 |
|---|---|---|
| 電話 | 1 | 電話での連絡を希望 |
| メール | 2 | メールでの連絡を希望 |
| 郵送 | 3 | 郵送での連絡を希望 |

数字が同じでも、別のテーブルやシステムでは意味が違う場合があります。CSV連携や帳票で使うなら、コード表を共有し、「2がメールを表す」という関係を固定します。見た目の並び替えに合わせて、保存値まで付け替えないようにします。
保存先のフィールドと必須条件を決める
ここではT_顧客テーブルに、連絡方法コードという数値型フィールドを用意します。数値のサイズは、将来のコード範囲も考慮して決めます。説明例では長整数型を使い、入力規則を In (1,2,3) とする設計が考えられます。
値を必須にするなら[値要求]を[はい]にします。未選択を許すなら、[値要求]を[いいえ]とし、入力規則にも In (1,2,3) Or Is Null のように未入力を認める条件を明示します。新しいグループの値と、テーブル側の制約が矛盾しないようにしてください。
未回答と「連絡しない」は別の意味です。後者を業務上の選択肢にするなら、別のコードを定義します。Nullを安易に0へ置き換えて、未回答なのか特定の選択肢なのか分からなくなる設計は避けましょう。
オプショングループを作成してフィールドへ連結する
作成は、フォームのデザインビューから行います。ウィザードを使う場合も、最後にグループ枠の名前とコントロールソースを確認することが重要です。ウィザードを完了しただけでは、目的の保存先へ連結されていない場合があります。
ウィザードで選択肢を作成する
1. T_顧客をレコードソースとするF_顧客フォームを、デザインビューで開きます。
2. [フォームデザイン]のコントロール一覧で、コントロールウィザードを使用する設定を確認します。
3. [オプショングループ]を選び、フォーム上に枠を配置します。
4. ウィザードが表示されたら、ラベルに電話、メール、郵送を登録します。
5. 既定の選択を設けるか決めます。本記事では、本人に確認するため、既定値なしで進めます。
6. 各選択肢の値を、電話1、メール2、郵送3へ設定します。
7. 保存先フィールドを選ぶ項目が表示されたら、連絡方法コードを指定します。表示されない場合も、後からプロパティで設定できます。
8. 表示形式と標題を選んで完了し、グループ枠のプロパティを確認します。
ウィザードが始まらないときは、コントロールウィザードの使用設定を確認します。既存のフォームへボタンを追加する場合は、正しいグループに所属しているかも確認してください。枠の上に重なって見えることと、グループの一員であることは同じではありません。

保存先はグループ枠へ設定する
グループ枠を選び、F4キーでプロパティシートを表示します。名前をfra連絡方法、コントロールソースを連絡方法コードにします。個々のボタンには、電話1、メール2、郵送3というオプション値を設定します。
| 対象 | プロパティ | 設定例 |
|---|---|---|
| フォーム | レコードソース | T_顧客 |
| グループ枠 | 名前 | fra連絡方法 |
| グループ枠 | コントロールソース | 連絡方法コード |
| グループ枠 | 既定値 | 空欄 |
| 電話ボタン | オプション値 | 1 |
| メールボタン | オプション値 | 2 |
| 郵送ボタン | オプション値 | 3 |

「連絡方法」という標題は画面上の見出しです。VBAで参照する名前とは分けて考えます。標題を変更しても、コードが参照するグループ名まで自動で同じになると考えないようにしてください。
未選択と既定値の意味を確認する
確認が必要な項目は、最初から特定の選択肢にチェックを入れないほうが、未回答を発見しやすくなります。一方、毎回同じ通常値を使う項目なら、既定値で入力負担を減らす方法があります。値を自動で補うことが業務上妥当かで判断します。
未選択で始めたい場合は、グループ枠だけでなく、保存先フィールドの既定値も確認します。グループの既定値を空にしても、テーブル側が1を補っていれば、電話が選ばれたように見える可能性があります。

テーブルの値を開き直して確認する
フォームビューへ切り替え、メールを選択し、レコードを保存します。テーブルで連絡方法コードが2になっていることを確認し、同じ顧客をフォームで開き直してメールが選択されるか確認します。
さらに、電話と郵送でも試します。表示と保存値の両方が一致して初めて、連結を確認できたことになります。既存データがある場合は、Nullや候補外の値が残っているレコードも開いて、どのように見えるかを確かめましょう。
VBAで選択値を取得して条件分岐する
VBAでは、グループ枠のValueを読み取ります。まずNullかどうかを調べ、その後に数値で分岐します。選択されていない状態を想定せず、いきなり数値変数へ代入すると、エラーや誤判定につながることがあります。
選択値を表示するサンプル
F_顧客にcmd選択確認というボタンを配置し、[クリック時]を[イベント プロシージャ]へ設定します。次のコードはfra連絡方法の値を読み、選択結果を表示する例です。名前は実際のフォームに合わせてください。
Private Sub cmd選択確認_Click()
Dim v As Variant
Dim strLabel As String
v = Me!fra連絡方法.Value
If IsNull(v) Then
MsgBox “連絡方法を選択してください。”, vbExclamation
Exit Sub
End If
Select Case v
Case 1
strLabel = “電話”
Case 2
strLabel = “メール”
Case 3
strLabel = “郵送”
Case Else
MsgBox “未定義の連絡方法コードです。”, vbExclamation
Exit Sub
End Select
MsgBox “選択した連絡方法は「” & strLabel & “」です。”
End Sub
Case Elseは、将来追加されたコードや、既存データの想定外の値を見落とさないために用意しています。「1でなければメール」のような2択の書き方では、未定義の値まで正しい選択として扱ってしまいます。
このボタンは選択結果を確認するもので、保存を強制するコードではありません。連結フォームではレコードの保存タイミングが別にあるため、表示されたメッセージだけで保存完了と判断しないでください。

必須選択は保存前にも確認する
レコードを保存するときに未選択を知らせる場合は、フォームの更新前処理を使います。以下は追加の案内例です。テーブル側の値要求や入力規則も併せて設計し、別の入力経路で未選択が入らないか確認してください。
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!fra連絡方法.Value) Then
Cancel = True
MsgBox “連絡方法を1つ選択してください。”, vbExclamation
Me!fra連絡方法.SetFocus
End If
End Sub
同じフォームにすでにForm_BeforeUpdateがある場合は、新しく同名の処理を作らず、既存の処理へ統合します。Nullの判定は = Null ではなくIsNullを使います。未選択を0に変換してから判定すると、0を正規のコードにした場合に意味が混ざるため注意します。
選択直後の処理と画面表示時の処理を分ける
メールを選んだときだけメールアドレス欄を目立たせたい、といった操作には、グループの更新後処理が候補です。ただし、既存レコードを表示した際にも同じ表示状態が必要なら、レコード移動時の処理も考えます。
同じ表示制御を複数のイベントへコピーし続けると、片方だけ修正される原因になります。処理を共通化し、どのイベントから呼ぶかを整理する方針が保守しやすくなります。選択しただけで外部送信などを実行する設計は、誤操作時の影響も確認しましょう。
選べない保存されないときの原因と対処
問題は、選択できない、複数選べてしまう、保存されない、開き直すと違う項目になる、というように分けて調べます。同じ「動かない」でも、グループの構成と保存先では確認する場所が違います。
| 症状 | 主な確認点 | 対処の方向 |
|---|---|---|
| 複数の丸が同時に選択される | ボタンのグループ所属 | 同じグループ内へ正しく配置する |
| 選ぶと別の項目に見える | オプション値の重複、コード表 | 各ボタンに異なる値を割り当てる |
| テーブルへ値が入らない | グループ枠のコントロールソース | 保存用ならフィールドへ連結する |
| 入力するとエラーになる | 保存先の型、入力規則 | 数値コードと許容値を合わせる |
| ボタンを選べない | 使用可能、編集ロック、フォームの更新可否 | 読み取り専用の意図を確認する |
| 開き直すと未選択に見える | 保存値が候補に存在するか | 値の一覧とグループの定義を照合する |
| VBAで名前を認識しない | 標題とグループ名の取り違え | プロパティの名前を確認する |

非連結であることが正しい場合もある
検索条件や帳票の出力形式を選ぶだけなら、グループを非連結にする設計もあります。この場合、選択値がテーブルへ保存されないことは不具合ではありません。処理の実行時に値を読み取って使います。
反対に、顧客の連絡希望を残す画面なのに非連結だと、画面を閉じた後に選択結果を再現できません。グループの用途が「一時的な条件」なのか「記録する属性」なのかを、画面の設計書にも明記しておきましょう。
フィールドを文字列に変える前に確認する
テーブルにメールという文字を保存したいからといって、既存の数値フィールドをすぐに短いテキストへ変更しないでください。クエリや帳票が数値コードを前提にしていると、影響が広がります。
通常は数値コードを保存し、表示時に対応する名称を出す設計を検討します。名称の変更が多いなら、コードと名称をマスターテーブルに分けると、画面以外の帳票や集計でも同じ意味を共有しやすくなります。
選択フォームと保存データの改善を相談する
設定を見直しても解消しない場合や、複数のフォーム・保存先への影響が分からない場合は、対象画面と再現手順を整理してご相談ください。
選択肢の変更と長期運用の確認ポイント
選択肢を変更するときは、既存コードの意味を守ることが最優先です。画面にある文字を変更する作業でも、過去のデータが違う意味に見えるようになる場合があります。表示だけの変更なのか、業務上の意味の変更なのかを分けて判断します。
コードを別の意味へ使い回さない
例えば、2をメールからSMSへ付け替えると、過去に2が保存された顧客もSMSを希望したように見えてしまいます。新しい意味には新しいコードを割り当て、従来の2はメールとして残す方針が基本です。
廃止した選択肢は、新規入力では選べなくしても、過去の履歴では名称が分かるようにします。旧コードの移行が必要なら、変換前後の対応表、対象件数、元へ戻す方法を決めてからデータを更新します。

動作確認は新規と既存を分ける
以下は、本記事の連絡方法の例を検証するときの項目です。実施済みの結果ではありません。必須か任意か、候補が固定か可変かによって、期待する結果を決めてから試してください。
| 確認対象 | 期待する結果 |
|---|---|
| 電話、メール、郵送を順に選ぶ | 同じグループで1つだけ選択できる |
| 各選択後に保存する | 対応する1、2、3が保存される |
| 保存済みレコードを開き直す | 保存値と同じ項目が選択される |
| 必須項目を未選択で保存する | 保存を拒否し、修正方法を案内する |
| 候補外の古いコードを含むレコードを開く | 誤ったラベルへ読み替えない |
| キーボードでグループを操作する | 選択状態を確認でき、次の欄へ進める |
| 選択肢を追加する | 既存値と新しい値の両方が正しく扱われる |
キーボードで使う人のために、グループへTabで移動した後の選択と、次の項目への移動も確認します。丸いボタンの見た目だけでなく、ラベルの意味、文字の読みやすさ、誤って選んだ場合の直しやすさも見直してください。
最後に、区分コードを使うクエリ、帳票、CSV、外部連携を確認します。フォーム1枚の変更が、集計や送信対象の選別へ影響する場合があります。コード表と利用箇所を残しておくと、次の改修時に調査しやすくなります。
まとめ
Accessのオプショングループでは、複数の候補から1つを選び、対応する数値を扱います。各ボタンに異なるオプション値を設定し、保存する場合はグループ枠をフィールドへ連結します。
未選択と既定値の意味を決め、VBAではNullと未知のコードも確認します。選択肢を変更する際は過去のコードの意味を守り、画面、テーブル、帳票を通して確認することが、誤登録の少ない入力画面につながります。
選択フォームと保存データの改善を相談する
Accessの教科書では、既存Accessの調査・改修・保守をご相談いただけます。フォーム名、症状、発生する操作、変更した設定が分かると、確認すべき範囲を整理しやすくなります。
よくある質問
オプショングループの値は数値です。表示文字との対応を決めて保存します。文字表示はラベルやマスターとの対応で行う方法を検討します。
同じオプショングループ内では1つです。複数選択が必要なら、独立したチェックボックスや関連テーブルなど、別の入力と保存の設計を使います。
グループの既定値を空欄にし、保存先フィールドの既定値も確認します。保存時に必須とする場合は、テーブルの制約と案内を用意します。
既定値を変えるだけで、保存済みのコードを一括更新する処理にはなりません。過去のデータを変更する必要がある場合は、別の移行作業として扱います。
非連結、保存先の取り違え、フォームが更新不可、保存時の規則違反などを確認します。グループ枠のコントロールソースと、実際の保存値を見ると切り分けやすくなります。
追加できますが、新しいコードを決め、テーブルの入力規則、VBAの分岐、帳票、外部連携も確認します。既存コードを別の意味に使い回さないようにしてください。
参考情報
[1] OptionGroup object 参照内容:単一選択と数値の保存
https://learn.microsoft.com/en-us/office/vba/api/access.optiongroup
[2] OptionButton.OptionValue 参照内容:オプション値と単独ボタン
https://learn.microsoft.com/en-us/office/vba/api/access.optionbutton.optionvalue
[3] Form.BeforeUpdate event 参照内容:未選択時の保存停止
https://learn.microsoft.com/en-us/office/vba/api/access.form.beforeupdate-event
[4] ControlSource Property 参照内容:フィールドとの連結
https://support.microsoft.com/en-us/access/controlsource-property
[5] Require a value in a field 参照内容:テーブル側の必須指定
https://support.microsoft.com/en-us/access/require-a-value-in-a-field