Accessフォームのチェックボックスをテーブルに保存する方法と反映されない原因

概要

この記事の結論
フォームのチェック状態をテーブルへ保存するには、フォームのレコードソースに保存先を含め、チェックボックスのコントロールソースをYes/No型のフィールド名に設定します。そのうえでレコードを保存し、同じ主キーの行で反映を確認します。チェックが付いた見た目だけでは保存完了とは限りません。連結先、更新可能性、保存時のエラー、確認しているデータの場所を順番に調べましょう。
連結チェックボックスとは、テーブルの特定フィールドに結び付け、レコードごとのオン・オフを表示・更新する入力部品です。

この記事でわかること

  • 保存先のテーブルと対象レコードを特定する
  • フォームとチェックボックスを正しく連結する
  • 保存を確定し同じ主キーで反映を確認する
  • 症状別に更新できない原因を切り分ける

この記事の主な内容

  1. 反映されないときは保存までの経路を確認する
  2. 保存先のテーブルと対象レコードを特定する
  3. フォームとチェックボックスを正しく連結する
  4. 保存を確定し同じ主キーで反映を確認する
  5. 症状別に更新できない原因を切り分ける
  6. 複数人利用と監査を考えた運用に整える
  7. まとめとよくある質問

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


反映されないときは保存までの経路を確認する

チェックが付くことと、テーブルに保存されることは別です。既存フォームを直す場合は、最初に「どのデータを表示しているか」「どの項目へ書き込むか」「保存が完了したか」の3点を確かめます。画面を作り直す前に、この経路を追うと変更箇所を絞れます。

保存先を持つチェックかを見分ける

業務データを更新するチェックは、テーブルのフィールドと結び付いた「連結コントロール」にします。一方、「未確認だけ表示する」という検索条件は、保存先を持たない非連結でも構いません。検索用のチェックを業務フラグに結び付けると、検索のつもりでデータを変更する危険があります。

用途コントロールソース結果
受注を確認済みにする確認済対象レコードの値を更新する
確認済みだけを検索する空欄画面上の条件として使う
条件に合うかを表示する=比較式計算結果を表示し、直接保存しない

ここでいうコントロールソースは、入力部品の「保存先または表示する式」です。フォーム全体のレコードソースは「画面の元になるテーブルやクエリ」です。名前が似ていますが、片方だけの設定では正しく保存できません。

フォームのデータ元とチェックの保存先とレコード保存の関係

まず変更前の状態を記録する

業務用ファイルのコピーを用意し、フォーム名、チェックボックス名、レコードソース、コントロールソースを控えます。外部DBにリンクしている場合、フロントのコピーだけではデータは分離されません。検証用データへ接続するか、影響を限定できるテストレコードで確認してください。


保存先のテーブルと対象レコードを特定する

保存確認には、名前や画面上の行番号ではなく主キーを使います。主キーとは、1件のデータを一意に識別する項目です。受注番号が重複する設計なら、内部の受注IDなど確実に1件を特定できる値を選びます。

練習用の構成

本記事では、架空のT_受注をF_受注確認で編集する例を使います。既存システムでは項目名をそのまま変更せず、現在の構造と次の役割を照らし合わせてください。チェックのラベルは「確認済」、部品の名前はchk確認済として区別します。

対象設定例確認する意味
テーブルT_受注実際に値を保存する場所
主キー受注ID/オートナンバー変更する1件を識別する
表示項目件名/短いテキスト利用者が内容を確認する
保存項目確認済/Yes/No型確認したかどうかを保持する
フォームF_受注確認対象レコードを表示する画面

Yes/No型の値は、AccessではTrueが-1、Falseが0として扱われます。外部システムへ出力するときに1と-1を混同しないよう注意します。ただし、今回の連結設定では数値を手入力する必要はなく、フィールド名を指定します。

見ているファイルと接続先をそろえる

画面が受注ID「101」を表示しているなら、テーブルでも101を探します。さらに、ファイル名が同じでも保存フォルダーが違うコピーでないかを確認します。リンクテーブルの場合は、そのリンクが本番DBとテストDBのどちらへ向いているかまで調べます。

受注IDをそろえてフォームとテーブルのチェック状態を確認する方法

既定値Falseは、新規入力の初期値です。既存の確認済データをまとめてFalseへ戻すための設定ではありません。既定値だけ変更して「過去のチェックが消えない」と判断しないようにしましょう。


フォームとチェックボックスを正しく連結する

フォーム全体の設定を確認してから、チェックボックスの設定へ進みます。コントロールソースに入れるのは、通常「確認済」というフィールド名です。「chk確認済」という部品名や「T_受注.確認済」といった推測した文字列を入力する前に、選択リストに対象項目が出るかを確認します。

手順1 フォームのレコードソースを確認する

1. ナビゲーションウィンドウでF_受注確認を右クリックし、[デザインビュー]で開きます。

2. F4でプロパティシートを表示し、上部の選択対象を[フォーム]にします。

3. [データ]タブの[レコードソース]を確認します。例ではT_受注を指定します。

4. クエリが指定されている場合は、その出力列に受注IDと確認済が含まれているか確認します。

5. クエリ自体を開いて、確認済フィールドが更新可能かをテスト用レコードで確かめます。

集計や重複を除く処理を含むクエリは、その結果を直接更新できない場合があります。フィールドが表示されることだけでは更新可能とは限りません。保存用のフォームは更新可能なレコードソースを使い、集計結果は別の一覧やレポートで見せると役割を分けられます。

手順2 チェックボックスを選ぶ

1. 四角いチェックボックス本体をクリックします。横のラベルを選ばないようにします。

2. プロパティシートの選択対象がチェックボックスであることを確認します。

3. [データ]の[コントロールソース]で確認済を選択します。

4. [使用可能]を[はい]、入力させる場合は[編集ロック]を[いいえ]にします。

5. フォームの設計を保存し、フォームビューへ切り替えます。

コントロールソースの設定による保存先の有無の違い

オプショングループ内のチェックボックスは例外です。独立したYes/Noのチェックとは保存の仕組みが異なり、グループ側の値と連結先を使います。複数の状態を1つ選ぶ目的なら、オプショングループまたはコンボボックスとして設計してください。

フォームとチェックボックスに設定するプロパティの対応

保存を確定し同じ主キーで反映を確認する

設定後は、既存レコード1件を使ってオンとオフの両方を確認します。レコードを移動すると通常は保存が行われますが、必須項目や入力規則に違反すると保存できません。エラーが出た場合は、そのまま閉じて成功と判断せず、メッセージの項目名を確認します。

コードを使わない確認手順

1. テスト用の受注IDを控え、現在の確認済の値を確認します。

2. フォームでチェックを変更します。

3. [ホーム]のレコード保存操作を実行するか、別レコードへ移動します。

4. 保存時のエラーがないことを確認し、フォームを閉じて開き直します。

5. 同じ受注IDに戻り、チェック状態を確認します。

6. テーブルを開き直すか最新表示にし、同じ主キーの値と比較します。

フォームの設計を保存する操作と、編集中のレコードを確定する操作は目的が異なります。Ctrl+Sだけを成功判定にせず、再表示した値とテーブルの値で確認してください。主キーによる確認用の選択クエリを用意すると、行を探し間違えるのを防げます。

SELECT [受注ID], [確認済]
FROM [T_受注]
WHERE [受注ID] = 101;

101は説明用の値です。実際に存在するテスト用IDへ置き換えます。このSELECTは閲覧のための例で、データを変更しません。

保存ボタンを付ける場合

明示的な保存ボタンが必要なら、F_受注確認にcmd保存を配置し、その[クリック時]イベントに次のコードを設定します。Dirtyは、表示中のレコードに未保存の変更があるかを表すプロパティです。Falseを設定して保存を試み、失敗した場合は成功メッセージを出さない構成にします。[2]

Private Sub cmd保存_Click()
    On Error GoTo ErrHandler
    If Me.Dirty Then Me.Dirty = False
    MsgBox “レコードに未保存の変更はありません。”, vbInformation
    Exit Sub
ErrHandler:
    MsgBox “保存を完了できません。” & vbCrLf & _
          Err.Number & “:” & Err.Description, vbExclamation
End Sub

このコードは、ボタンと保存対象のデータが同じフォームにある前提です。親フォームのボタンからサブフォームを保存するときは、対象サブフォームを明示して設計します。また、フォームの更新前イベントで保存を取り消している場合もあるため、既存の入力チェックと併せて確認してください。

チェックの変更からレコードを保存し再表示する確認手順

症状別に更新できない原因を切り分ける

コントロールソースが正しくても、編集制限や接続先の権限によって保存できない場合があります。原因を一度に直そうとせず、保存経路の手前から確認します。業務用の編集禁止設定を理由なく解除することは避けてください。

症状主な確認箇所対応の方向
クリックできない使用可能・編集ロック・フォームの更新許可意図した入力権限か確認する
クリックできるが残らない連結先の空欄・計算式・保存エラーフィールドへ連結し保存を確認する
保存時に警告が出る必須項目・入力規則・更新前イベント警告の対象を修正する
テーブルでは値が違う主キー・ファイル・リンク先・表示の更新同じデータを見ているか確認する
複雑な一覧だけ更新できない集計や結合を含むレコードソース更新用と表示用を分ける
他のPCだけ保存できない共有先・DB権限・接続設定利用者の接続条件を比較する
保存されない四つの原因と確認対象

連続フォームで全部のチェックが変わる

連続フォームは、同じコントロールの配置をレコードごとに繰り返して表示します。非連結のチェックは各行の保存値を持たないため、全行が同じ状態に見えることがあります。レコードごとの状態を残したいなら、その行のフィールドへ連結してください。

ただし、全行が見た目だけ変わった場合と、更新クエリなどで実データが一括変更された場合は別です。最初にテーブルの値を確認し、本当に全件が変わったか切り分けます。WHERE条件のない更新処理がないか調べるのは、その後です。

連続フォームで非連結チェックが全行同じになる理由

Nullを未確認と同じ意味にしない

Nullは値が不明または未設定という意味です。非連結コントロールや外部DBのNULLを含むデータでは、三状態の設定によって灰色表示などになる場合があります。三状態は表示・入力の扱いであり、Accessの通常のYes/No項目を「未確認・承認・却下」の3値管理へ変える機能ではありません。

承認状態などが3種類以上ある場合は、状態コードと選択肢を設ける方が意味を明確にできます。外部DBのNULLをFalseとして表示する場合も、元データまでFalseに更新するのか、表示だけ置き換えるのかを決めてください。

Accessの設定や運用で解決が難しい場合は

設定変更だけで改善しない場合や、複数人での利用・外部DB・既存のVBAが関わる場合は、原因と影響範囲を整理してから改修を進めましょう。Accessの教科書では、既存Accessの修正や運用の見直しについて相談できます。対象画面、症状、再現手順をまとめると、調査の相談がしやすくなります。


複数人利用と監査を考えた運用に整える

業務上の「確認済」と、その利用者だけが選んだ「今回の処理対象」は分けて管理します。共有テーブルに一時選択を保存すると、別の利用者の選択が混ざる可能性があります。個人の作業対象は利用者や処理単位を識別する作業テーブルなどで設計します。

確認した人と日時も必要かを決める

Yes/Noだけでは、誰がいつ変更したかを説明できません。履歴が必要なら確認者ID、確認日時、取消理由などの記録を別途設計します。フォーム側だけで記録してもテーブルを直接更新できる運用では記録が抜けるため、更新経路全体をそろえる必要があります。

変更後のテスト

確認する操作期待する結果
既存行のオン・オフ再度開いても指定した値が残る
新規行の登録必須項目を満たしたときだけ保存できる
入力規則違反保存できない理由が分かり、成功表示しない
別レコードへの移動別の主キーの状態は変わらない
2台で同じレコードを編集競合時の警告と対応手順が確認できる
配布先PCで起動同じ接続先で保存・再表示できる
チェック状態の保存を業務で使う前の確認項目

まとめ

チェック状態の保存は、レコードソース、コントロールソース、レコード保存の順に確認します。最終的には同じ主キーのテーブル値と照合し、オン・オフ、新規・既存、別PCでの挙動を確かめましょう。連結が正しい場合は、更新できないクエリ、入力チェック、外部DBの権限などへ調査を進めます。


よくある質問

画面の値が変わっても、保存先に連結されていない場合はテーブルへ残りません。まずチェックボックス本体のコントロールソースが、保存したいフィールド名になっているか確認します。次にレコードを保存し、必須項目や入力規則のエラーがないか調べてください。フォームを開き直して同じ主キーを表示し、テーブルの値と照合します。別のコピーや別の接続先を見ていないかも確認すると、設定不良と確認場所の違いを切り分けられます。

通常は、フォームのレコードソースに含まれているフィールド名を設定します。確認済というYes/No型の項目へ保存するなら「確認済」を選びます。チェックボックス自身の名前や、横に表示されるラベルの文字を入れる欄ではありません。先頭に等号を付けた式は計算結果を表示する用途です。候補に目的の項目が出ない場合は、フォームのデータ元のクエリにその列が含まれるか、フィールド名が変更されていないかを確認してください。

Ctrl+Sを押したことだけでは、業務データが保存できたとは判定できません。フォームの設計保存とレコードの保存を区別し、入力後はレコード保存操作や別レコードへの移動で確定させてください。必須項目の不足や更新前イベントによる取消があれば、保存が成立しない場合があります。明示的な保存ボタンを使う場合も、エラーを表示する処理が必要です。最後にフォームを開き直し、同じ主キーの値が残っているか確かめます。

非連結チェックを連続フォームの詳細部に置くと、各レコードの値に結び付いていないため、繰り返し表示された行が同じ状態に見えることがあります。レコード単位の状態を保存するなら、Yes/No型のフィールドへ連結します。まずテーブルを確認し、見た目だけの変化か、実際に複数行が更新されたのかを分けてください。一時的な複数行選択が目的なら、共有の業務フラグを流用せず、利用者や処理単位を識別できる仕組みを検討します。

はい。正しく連結したYes/No型の項目では、チェックありとチェックなしの両方が保存対象です。外した後に別レコードへ移動するなどして保存し、元のレコードへ戻って確認します。オンだけ残ってオフが残らない場合は、更新イベントでTrueを代入していないか、既定値と保存値を混同していないかを調べてください。既定値をFalseにしても過去のデータは一括変更されません。テストではオンからオフと、オフからオンの両方向を確認します。

Nullを表示する設定や、コントロールが使用不可になっている状態などが考えられます。Nullは単なる「いいえ」ではなく、値が未設定・不明という意味です。三状態の設定、コントロールソース、外部DBのNULLの有無を確認してください。通常のYes/No項目へ三状態を設定するだけで、3種類の業務状態を保存できるわけではありません。未確認・承認・却下のような分類なら、状態コードを持つ項目とコンボボックスなどで明示的に管理します。

共有のYes/No項目を作業対象選択に使うと、別の利用者が付けたチェックと混ざるおそれがあります。「受注を確認済みにした」という全員共通の業務状態と、「自分が今回処理する」という一時的な選択は分けてください。後者は利用者IDや処理IDを持つ作業テーブルなどで管理します。また、同じレコードを同時更新すると競合する場合があるため、複数PCで警告と再読込の手順を確認します。履歴が必要なら変更者と日時の記録も設計します。

Accessの設定や運用で解決が難しい場合は

設定変更だけで改善しない場合や、複数人での利用・外部DB・既存のVBAが関わる場合は、原因と影響範囲を整理してから改修を進めましょう。Accessの教科書では、既存Accessの修正や運用の見直しについて相談できます。対象画面、症状、再現手順をまとめると、調査の相談がしやすくなります。

関連記事

チェックボックスの作成方法

フォームの基本

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

フォームのコントロール


参考情報

[1] Microsoft|CheckBox.ControlSource
https://learn.microsoft.com/en-us/office/vba/api/access.checkbox.controlsource

[2] Microsoft|Form.Dirty
https://learn.microsoft.com/en-us/office/vba/api/access.form.dirty%28property%29

[3] Microsoft|CheckBox.TripleState
https://learn.microsoft.com/en-us/office/vba/api/access.checkbox.triplestate

[4] Microsoft|Form.AllowEdits
https://learn.microsoft.com/en-us/office/vba/api/access.form.allowedits

[5] Microsoft|クエリのデータを編集する
https://support.microsoft.com/ja-jp/access/edit-data-in-a-query

TOP