Accessチェックボックスの作成方法 保存と検索の使い分け

概要

この記事の結論
Accessでチェック状態を保存するには、テーブルにYes/No型のフィールドを作り、フォームのチェックボックスをそのフィールドに連結します。検索条件や一時的な指定には、保存先を持たない非連結のチェックボックスを使います。既定値をFalseにしても、過去のデータが一括変更されるわけではありません。保存されない、全行が同時に変わる、灰色になるといった症状は、連結先や三状態の設定から確認できます。
チェックボックスとは、オンとオフの選択を四角いチェックで入力・表示するコントロールです。

この記事でわかること

  • テーブルにYes/No型の項目を作成する
  • フォームにチェックボックスを配置する
  • チェックの値をクエリとVBAで扱う
  • 保存されない場合と全行が変わる場合の対処

この記事の主な内容

  1. 保存するチェックと検索用のチェックを分ける
  2. テーブルにYes/No型の項目を作成する
  3. フォームにチェックボックスを配置する
  4. チェックの値をクエリとVBAで扱う
  5. 保存されない場合と全行が変わる場合の対処
  6. 複数人で使う画面の確認と運用
  7. よくある質問

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


保存するチェックと検索用のチェックを分ける

チェック状態を次回も残したい場合は、テーブルのフィールドに連結したチェックボックスを作ります。検索の絞り込みなど、その画面で一時的に使うだけなら非連結にします。見た目は同じでも保存先の有無が違うため、配置する前に「何の状態を表すのか」を決めてください。

連結と非連結の違い

連結とは、フォームのコントロールとデータの項目を結び付けることです。例えば商品の[販売中]を保存するなら、T_商品テーブルに[販売中]というYes/No型の項目を設けます。[販売中のみ表示]という検索条件なら、商品の情報を更新せず、非連結のチェックで指定します。

種類使う例コントロールソース保存される内容
連結商品が販売中かどうか販売中各商品のYes/No値
非連結販売中だけ検索するか空欄標準ではテーブルに保存しない
計算結果の表示金額が基準以上か=式計算結果を表示するだけ
テーブルへ保存する連結チェックと一時条件を持つ非連結チェックの比較

業務フラグは、意味を肯定形で付けると判断しやすくなります。[販売中]ならチェックありは販売中、チェックなしは販売していない状態です。[販売しない]のような否定形にすると、検索条件やVBAのIf文で意味を取り違えやすくなります。画面のラベルも、保存する意味とそろえます。


テーブルにYes/No型の項目を作成する

Yes/No型は、はい・いいえの2択を保存するデータ型です。通常のAccessテーブルで販売状態を管理する例では、[販売中]をこの型にします。チェックボックスという表示部品を先に置くだけでは、レコードごとの保存項目は作成されません。

練習用のテーブルを準備する

検証用のファイルでT_商品を作成し、商品ID、商品名、販売中を用意します。商品IDはオートナンバー型の主キー、商品名は短いテキスト型、販売中はYes/No型とします。デザインビューで販売中の[既定値]をFalseまたはNoに設定し、保存します。

項目データ型設定の意味
商品IDオートナンバー型・主キー商品を一意に識別する
商品名短いテキスト型画面に表示する名前
販売中Yes/No型チェック状態を保存する
販売中の既定値FalseまたはNo新規登録時に未チェックから始める
商品IDと販売中のフィールド、Yes/No型、既定値を設定する流れ

既定値は新規登録時の初期値

既定値は、新しいレコードを入力するときの初期状態です。既存レコードの値を一括して変更する機能ではありません。すでに登録されている販売中の値を変更したい場合は、対象の確認と別の更新処理が必要です。初期値を変えた後は、新しい商品を1件作って挙動を確認します。

業務によってはTrueを既定値にした方が自然な場合もあります。例えば登録する商品は原則すべて販売中という運用です。ただし、初期チェックを確認済みや承認済みの証拠として使ってはいけません。利用者が何を確認し、いつ状態を変更するのかを、業務の意味から判断してください。


フォームにチェックボックスを配置する

保存用のチェックボックスは、フォームのレコードソースと、チェックボックスのコントロールソースをそろえると作れます。レコードソースはフォーム全体が使うテーブルやクエリ、コントロールソースは個別部品が使う項目です。名前が似ていますが設定する場所が違います。

既存フィールドから追加する方法

1. T_商品を元にしたフォームを開き、デザインビューに切り替えます。

2. フォーム全体を選択し、プロパティシートで[レコードソース]がT_商品であることを確認します。

3. [既存のフィールドを追加]から販売中をフォームの詳細セクションへ配置します。

4. チェックボックスを選び、[コントロールソース]が販売中であることを確認します。

5. [名前]をchk販売中、隣のラベルを[販売中]など、識別しやすい名前にします。

フォームのレコードソースとチェックボックスのコントロールソースの関係

UIのタブ名や配置はAccessの版で異なる場合があります。重要なのは、ラベルではなくチェックボックス本体を選ぶことです。ラベル側を選択しても、保存先を指定するコントロールソースは設定できません。プロパティシート上部の選択対象も確認してください。

コントロールから手動で置く場合

[チェックボックス]コントロールを選び、詳細セクションに配置してから、コントロールソースに販売中を指定します。名前欄に販売中と書くだけでは連結されません。また、コントロールソースを=式にすると計算表示になり、通常の保存用入力欄とは役割が変わります。

保存確認は画面を開き直して行う

フォームビューで1件だけチェックを変更し、別レコードへ移動するなどして保存します。その後、フォームを閉じて開き直し、同じ商品にチェックが残るか確認します。テーブルでも商品IDを照合すると、どのレコードへ保存されたかが分かります。画面上で印が付いたことだけを保存成功の根拠にしないでください。


チェックの値をクエリとVBAで扱う

AccessのYes/No値は、TrueとFalseで判定できます。VBAで数値へ変換するとTrueは-1、Falseは0です。単純に1と比較すると、想定どおりに判定されない場合があります。読みやすさのため、条件にはTrue、Falseを使うと意図が伝わりやすくなります。

チェック済みの商品だけ抽出する

クエリデザインで販売中列を追加し、抽出条件にTrueと入力します。SQLなら次の形です。Trueの行だけを対象とし、Falseの行は含みません。リンク先が別のデータベースの場合は、相手側の型とAccessでの見え方も確認します。

SELECT [商品ID], [商品名], [販売中]
FROM [T_商品]
WHERE [販売中] = True;

NullをFalseと混同しない

Nullは、値がない、または未確定である状態です。標準的なローカルAccessテーブルのYes/No型は2値の管理を基本としますが、非連結コントロールや外部結合の結果、リンクデータではNullへの配慮が必要です。[三状態]を[はい]にしたコントロールは、Yes・No・Nullを扱い、Nullが灰色表示になることがあります。

[三状態]が[いいえ]の場合、NullがNoと同じように表示されることがあります。見た目が未チェックだからといって、必ず保存値がFalseとは限りません。未確認・合格・不合格の3段階を永続管理したいなら、状態コードなどの別フィールドを設け、選択肢の意味を明示する方が扱いやすくなります。

オン・オフ・未確定の意味とAccessのTrue=-1、False=0を整理した図

VBAでチェック状態を読み取る

Nullを未チェックとして扱ってよい業務なら、NzでFalseへ置き換えてからBoolean型へ変換します。NzはNullを指定値に置き換える関数です。NullとFalseの区別が必要な場合は、この置換をせず、IsNullで別に判定してください。値を変数に読んだだけでデータが保存されるわけではありません。

Dim isChecked As Boolean
isChecked = CBool(Nz(Me!chk販売中.Value, False))
If isChecked Then
    MsgBox “販売中の商品です。”
End If

検索用チェックから一覧を更新する

F_商品検索に非連結のchk販売中のみを置き、既定値をFalseにします。商品一覧用クエリには次の条件を設定します。チェックがオフなら全商品、オンなら販売中の商品だけを表示する例です。この検索フォームはクエリを実行するときに開いている必要があります。

SELECT [商品ID], [商品名], [販売中]
FROM [T_商品]
WHERE Nz([Forms]![F_商品検索]![chk販売中のみ],False)=False
   OR [販売中]=True;

結果をサブフォームコントロールsub商品一覧に表示している場合、チェックの[更新後処理]イベントから再クエリします。sub商品一覧は中に入れたフォームの名前ではなく、外側のサブフォームコントロール名です。名前が違う場合は実際のものへ置き換えます。

Private Sub chk販売中のみ_AfterUpdate()
    Me!sub商品一覧.Form.Requery
End Sub

非連結チェックを検索条件にし、結果を再クエリする流れ

フォームのチェック・保存設計を整理したい方へ

検証用データで手順を確かめても解決しない場合や、複数の画面・テーブル・利用者への影響を整理する必要がある場合は、Accessの教科書へご相談ください。現在の構成、起きている症状、期待する結果をまとめると、確認すべき範囲を伝えやすくなります。


保存されない場合と全行が変わる場合の対処

保存されない場合は、まず連結先を確認します。コントロールソースが空欄なら、そのチェックは非連結です。販売中が指定されていても、フォームのレコードソースに販売中が含まれていなければ、正しく参照できません。フィールドの名前とコントロールの名前を区別して確認します。

連続フォームの非連結チェックに注意する

連続フォームは、同じ部品の配置を複数レコードに繰り返して表示するフォームです。非連結チェックはレコードごとの保存値を持たないため、1行で変えると他の行も同じ状態に見えます。個々の商品ごとに状態を持たせたいなら、行ごとのフィールドに連結する必要があります。

連続フォームの非連結コントロールと行ごとの連結データを比較する図

ただし、印刷対象の一時選択だけのために、共有の商品テーブルへ選択済みフラグを追加する設計には注意が必要です。利用者Aが選んだ状態を利用者Bも書き換えられるためです。恒久的な商品状態と、その操作での一時選択は分けて考えます。

チェックできないときの確認表

症状確認する設定や状態確認の目的
クリックできない使用可能が[いいえ]操作自体が無効になっていないか
値を変更できない編集ロックが[はい]閲覧専用にしていないか
すべての項目が編集できないフォームの更新の許可・レコードセットフォーム全体が読取専用でないか
集計画面で保存できない集計・DISTINCT・結合などの元クエリ更新できる結果かどうか
保存時にエラー入力規則・権限・他利用者のロック保存を妨げる条件がないか
チェックが灰色三状態・Null・使用可能表示だけで値を判断しないため
使用可能、編集ロック、フォーム編集許可、更新可能な元データの4点

イベントのVBAが値を上書きしている場合もあります。[更新前処理]や[更新後処理]、[レコード移動時]などに処理がある場合は、どのタイミングで状態が変わるか記録します。既定値を変更しても、保存時の処理が値を戻していれば問題は解決しません。


複数人で使う画面の確認と運用

販売中のような業務データは全員で共有してよい状態ですが、印刷対象や一括処理対象の選択は、利用者ごとに分ける場合があります。利用者ID、操作を識別するID、対象の商品IDなどを持つ一時選択テーブルなら、同じ商品を別の人が選んでも状態を分離できます。

共有の業務フラグと利用者・操作単位の一時選択を分ける構成

一時選択には、処理後の削除、途中終了時の後片付け、同じ人が複数画面を開く場合の区別も必要です。また、処理対象を確定した後に販売状態が変わる可能性もあります。チェック表示を信じてそのまま削除・更新せず、実行直前にも対象と権限を確認する設計にしてください。

公開前に試す操作

1. 新規商品で初期値を確認し、オンとオフを切り替えて保存します。

2. 別商品へ移動し、閉じて開き直しても個別の状態が残るか確認します。

3. 検索用チェックの切り替えで、保存値が変わらず一覧だけ変わるか確認します。

4. 連続フォームと2人の同時利用で、選択が混ざらないか確認します。

保存用はフィールドへ連結し、検索用は非連結にするという区別ができれば、基本のチェックボックスは作成できます。さらに、Nullの意味と同時利用時の範囲まで決めることで、見た目だけでは分からない保存や選択のトラブルを減らせます。


よくある質問

連結されていれば、同じレコードのYes/No値を別の画面で表示しています。テーブルはデータを保存する場所で、フォームのチェックボックスはその値を操作する部品です。ただし、フォームに置いただけでは連結されません。フォームのレコードソースに対象フィールドが含まれ、チェックのコントロールソースにその名前が設定されていることが必要です。非連結や計算用のチェックの場合は、見た目が同じでも保存先と役割が違います。

コントロールソースが空欄で非連結になっている可能性があります。まずチェック本体の設定を開き、保存したいフィールド名が指定されているか確認してください。次にフォームのレコードソース、更新の許可、元クエリの更新可否を調べます。入力規則やイベント処理が保存を取り消している場合もあります。別レコードへ移動した後に元の行へ戻り、テーブルでも主キーを照合すると、表示だけの変化か保存済みの変化かを判断できます。

AccessのVBAでは、Boolean型のTrueを数値へ変換すると-1、Falseは0になります。チェック済みを必ず1と考えて比較すると、条件に合わなくなることがあります。読みやすい条件を書くには、TrueまたはFalseを使って判定してください。外部システムへ1と0で渡す必要がある場合は、出力時にIIf([販売中],1,0)などで明示的に変換します。外部結合やリンク先由来のNullがあり得る場合は、未確定をどう出力するかも先に決めます。

同じとは限りません。三状態のチェックではNullが灰色で表示されることがあり、Falseと区別して扱う必要があります。また、使用不可などの表示設定で灰色になる場合もあります。まずValue、三状態、使用可能の設定を確認してください。Nullを未チェックとしてよい検索条件ならNzでFalseに置き換えられますが、未確認を意味する値まで置換すると情報が失われます。合格・不合格・未確認を保存したい場合は、状態コードの項目を設ける方法も検討します。

非連結のチェックボックスを配置している可能性があります。連続フォームは同じ部品を行ごとに繰り返し表示するため、非連結の値はレコード別の状態になりません。商品ごとの販売状態なら、各行のYes/Noフィールドに連結してください。一方、印刷対象などの一時選択なら、共有テーブルのフラグを安易に使うと他利用者と競合します。利用者と操作単位で選択状態を分ける設計にすると、複数人が同時に作業しても混ざりにくくなります。

クエリのデザインビューで対象のYes/Noフィールドを追加し、抽出条件にTrueを入力します。SQLならWHERE [販売中]=Trueのように書きます。検索フォームのチェックで切り替えたい場合は、業務用の販売中とは別に非連結の検索用チェックを用意してください。切り替えた後に一覧を再クエリすれば、保存値を変更せず表示範囲を変えられます。フォーム参照を含むクエリでは、参照先のフォームが開いていることと、コントロール名の一致も必要です。

独立したチェックボックスなら、複数を同時にオンにできます。例えばメール連絡可と郵送可を別々のYes/Noフィールドに連結すれば、それぞれを保存できます。一方、オプショングループの中ではグループとして1つの値を選ぶため、同じ考え方では使えません。項目が増え続ける資格や商品分類を管理する場合は、チェックの列を増やし続けるより、対象と選択肢を結ぶ別テーブルを用意する方が集計や変更に対応しやすい場合があります。

既定値は新規レコードの入力時に使われる初期値であり、既存の値を一括変更する設定ではありません。Falseへ変更しても、すでにTrueで保存された商品はそのままです。設定後は新規レコードを作って確認してください。既存値を直す場合は、どの行を変更するか確認したうえで別途更新します。また、フォームとテーブルの両方に初期値がある場合や、VBAで初期化している場合は、入力経路によって結果が変わらないかも確認する必要があります。

Accessの教科書へのご相談

フォームのチェック・保存設計を整理したい方へ

検証用データで手順を確かめても解決しない場合や、複数の画面・テーブル・利用者への影響を整理する必要がある場合は、Accessの教科書へご相談ください。現在の構成、起きている症状、期待する結果をまとめると、確認すべき範囲を伝えやすくなります。

関連記事

Accessフォームの作成方法

Accessフォームのテキストボックスと連結

Accessのフォームフィルターの使い方


参考情報

Microsoft Learn CheckBox
https://learn.microsoft.com/en-us/office/vba/api/Access.CheckBox

Microsoft Learn ControlSource
https://learn.microsoft.com/en-us/office/vba/api/access.checkbox.controlsource

Microsoft Learn TripleState
https://learn.microsoft.com/en-us/office/vba/api/access.checkbox.triplestate

Microsoft Learn Nz
https://learn.microsoft.com/en-us/office/vba/api/access.application.nz

Microsoft Learn Booleanデータ型
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/boolean-data-type

Microsoft Support フォームの概要
https://support.microsoft.com/en-us/access/introduction-to-forms

TOP