Accessサブフォームの作成方法と親子リンクの設定

概要

この記事の結論
Accessのサブフォームは、親フォームの中に子フォームを配置し、共通するキーで表示する明細を連動させて作ります。受注1件と複数の受注明細を同じ画面で扱う場合などに適しています。

この記事でわかること

  • 親子テーブルとキーを準備する
  • フォームを作り親画面へ配置する
  • リンク設定とオブジェクト名を区別する
  • 新規登録と明細合計を試す

この記事の主な内容

  1. サブフォームで親と明細を一緒に表示する
  2. 親子テーブルとキーを準備する
  3. フォームを作り親画面へ配置する
  4. リンク設定とオブジェクト名を区別する
  5. 新規登録と明細合計を試す
  6. 全明細が出る場合と空欄の場合を切り分ける
  7. よくある質問

想定読了時間:約8分


1 サブフォームで親と明細を一緒に表示する

Accessのサブフォームは、親フォームの中に子フォームを配置し、共通するキーで表示する明細を連動させて作ります。受注1件と複数の受注明細を同じ画面で扱う場合などに適しています。

サブフォームとは、フォーム内へ埋め込む別のフォームです。
親を移動したときに明細が切り替わるかどうかは、リンク親フィールドとリンク子フィールドの設定で決まります。

親フォームとサブフォームについて、親、子、共通キーの関係を示す図。

2 親子テーブルとキーを準備する

T_受注は受注IDを主キーとし、T_受注明細に受注IDを保存します。
親の受注IDが通常のオートナンバーなら、子の受注IDは数値型・長整数です。
受注明細には別途、明細IDという主キーを設けます。

親1件に明細を複数登録するため、子の受注IDを重複禁止にしないでください。
参照整合性を使う場合は、既存の孤立明細を事前に修正します。

設定例と確認点

テーブル主キー関連列
T_受注受注ID親の識別
T_受注明細明細ID受注IDで親を参照
親子テーブルのキーについて、受注、明細、関連の関係を示す図

3 フォームを作り親画面へ配置する

親は単票フォーム、子は帳票フォームまたはデータシート形式にすると、ヘッダーと明細を見やすく表示できます。ウィザードを使っても、配置後にレコードソースとリンク設定を確認します。

サブフォームの作成手順について、親作成、子作成、配置、連動の関係を示す図

操作手順

1. T_受注を元にF_受注を作ります。

2. T_受注明細を元にF_受注明細を作ります。

3. F_受注をデザインビューで開きます。

4. サブフォーム/サブレポートを配置し、F_受注明細を指定します。

5. サブフォームコントロール名をsub受注明細にします。

6. リンク親フィールド、リンク子フィールドを受注IDにします。

2つの名前の違いについて、フォーム名、部品名、参照の関係を示す図

4 リンク設定とオブジェクト名を区別する

埋め込まれたフォーム名F_受注明細と、親側のコントロール名sub受注明細は別です。
VBAや式から子フォームを参照する場合は、通常、親側のコントロールを経由して .Form を使います。

リンクする受注IDは親子それぞれのレコードソースに必要です。
画面上で隠していても構いませんが、元クエリから列を除くとリンクできなくなることがあります。

サンプルコードと式

Me!sub受注明細.Form.Requery

新規登録の順序について、親入力、親保存、子入力の関係を示す図

5 新規登録と明細合計を試す

親の新規受注に必要項目を入力し、親が保存できることを確認してから明細を追加します。
適切なリンクがあれば子の受注IDへ親のIDが引き継がれますが、保存エラーがある状態では期待どおり登録できません。

子のフッターに =Sum([金額]) のテキストボックスtxt合計を置けば、親からその合計を参照できます。
親では =Nz([sub受注明細].[Form]![txt合計],0) のように未入力時の表示も決めます。
帳票形式の子フォームで試してください。

合計の表示について、明細金額、txt合計、親画面の関係を示す図

既存Accessへの影響を判断できない場合

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


6 全明細が出る場合と空欄の場合を切り分ける

親を変えても全明細が出る場合はリンク設定、空欄なら一致するキーの有無と型を確認します。
サブフォームのフィルターやレコードソースの条件も原因になります。

最初に親2件へそれぞれ異なる明細を登録し、親を移動するたびに対応する明細だけが表示されることを確認します。削除と必須入力、保存に失敗した場合の戻り方も含めて画面の動作を試しましょう。

表示されないときの確認について、リンク、保存値、型、条件の関係を示す図

7 よくある質問

リンク親・リンク子フィールドが未設定でないか確認します。

親の保存エラー、子の更新可否、必須項目を確認します。

親側にあるサブフォームコントロールの名前と.Formを使っているか確認します。

まとめと相談先

最初に親2件へそれぞれ異なる明細を登録し、親を移動するたびに対応する明細だけが表示されることを確認します。削除と必須入力、保存に失敗した場合の戻り方も含めて画面の動作を試しましょう。

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


参考情報

Microsoft公式資料を参照しています。サンプルは説明用の架空データです。
Windows版Accessの実機検証は未実施のため、適用前に対象環境のコピーで結果を確認してください。

Microsoft:サブフォームの作成
https://support.microsoft.com/en-us/access/create-a-form-that-contains-a-subform-a-one-to-many-form

Microsoft:親子リンク
https://learn.microsoft.com/en-us/office/vba/api/access.subform.linkmasterfields

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

TOP