ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

Accessサブフォームの作り方|親子フォームの連動設定と表示されない原因も解説

この記事で学習できること
  • Accessサブフォームの仕組みと親子フォームの関係
  • 親子フォームを連動させる作成手順
  • 表示や入力ができないときの確認ポイント

Accessで発注や顧客の情報を管理していると、親のデータを確認しながら、関連する明細も同じ画面で入力したい場面があります。

例えば発注業務では、発注伝票を開いたまま、その伝票に紐づく発注明細を確認・追加できると便利です。
顧客管理なら、選択した顧客の注文履歴や対応履歴を同じ画面に表示したいこともあるでしょう。

このような親データと子データを一画面で扱う機能が、Accessのサブフォームです。

この記事では、発注伝票と発注明細を例に、親子フォームを連動させる作り方を順に解説します。
サブフォームが連動しない、表示されない、入力や追加ができないなど、具体的な問題についての解決方法にも触れました。

Accessのサブフォームとは?メインフォームとの違い

Accessのサブフォームとは、メインフォームの中に別のフォームを埋め込み、現在の親データに関連する子データを表示・入力するための機能です。
親1件に対して明細が複数件ある「1対多」の管理に向いています。

発注管理での役割は次のとおりです。

項目メインフォームサブフォーム
扱うデータ親データ子データ、明細データ
発注伝票発注明細
画面に表示する内容現在の伝票1件その伝票に属する明細複数件
連動に使うキー発注登録No(主キー)発注登録No(外部キー)

親フォームで 発注登録No = 1001 の伝票を開くと、サブフォームには同じ番号を持つ明細だけが表示されます。
親の伝票を切り替えれば、明細も対応する内容へ切り替わるのが、Excelなどの表計算アプリには無い便利な機能です。

親フォームとサブフォームは、共通キーを使って関連データを連動表示します。

上の画面のように、親フォーム内で明細一覧を見ながら作業すれば、別画面を開き直す手間を減らせます。
入力対象の伝票も把握しやすいです。

サブフォームを運用するためには、親子データに共通のキー(項目)が必要だということです。
テーブル間の関係を整えたうえで、サブフォームコントロールにリンク親フィールドとリンク子フィールドを設定すると、現在の親に一致する明細が表示されます。

サブフォームを作る前に確認するもの

フォームを配置する前に、親子データの構造を確認しておくと、途中で設定を戻る手間が減ります。

確認するもの発注管理の例ポイント
親テーブル発注伝票テーブル発注登録No など、1件を識別する主キーを持つ
子テーブル発注明細テーブル親と結ぶ 発注登録No を外部キーとして持つ
キーのデータ型親がオートナンバー型、子が対応する数値型親子で対応できる型にする
親フォーム発注伝票フォーム主キーをレコードソースに含める
子フォーム発注明細フォーム外部キーを含め、必要なら追加・編集できる構成にする

リレーションシップは、テーブル側で親子関係や参照整合性を管理する設定です。
一方、親フォームを移動したときの表示連動は、サブフォームコントロールのリンク親フィールドとリンク子フィールドが担います。

まずリレーションシップを整え、その対応キーをフォームのリンク設定にも使う流れが分かりやすい進め方です。
主キーと外部キーの設定を確認したい場合は、Accessのリレーションシップ設定方法を参照してください。

Accessサブフォームの作り方

ここでは、親フォームを「発注伝票」、サブフォームに表示する子フォームを「発注明細」として作成します。

手順は次の6つです。

  1. 親テーブルと子テーブルのリレーションシップを設定する
  2. 親フォームを作成する
  3. 子フォームを作成する
  4. 親フォームにサブフォームを配置する
  5. リンク親フィールドとリンク子フィールドを確認する
  6. フォームビューで連動と入力を確認する

手順1. リレーションシップを設定する

発注伝票テーブルの主キー 発注登録No と、発注明細テーブルの外部キー 発注登録No を関連付けます。
発注伝票1件に複数の明細が紐づくため、関係は1対多です。

Accessの「データベースツール」タブから「リレーションシップ」を開き、親側のキーを子側の対応フィールドへ結びます。
参照整合性を適切に設定すれば、存在しない伝票番号の明細を登録してしまう不整合も防ぎやすいです。

具体的な操作は、Accessでリレーションシップを作成する方法で確認できます。

手順2. 親フォームを作成する

発注伝票テーブルをもとに親フォームを作ります。
発注日や発注先を配置し、子フォームと結ぶ基準となる 発注登録No をレコードソースに含めてください。

フォームを初めて作る場合は、Accessフォームの基本的な作り方を先に確認すると操作を追いやすくなります。

親フォームの下部などに、明細を表示するための空きスペースを確保します。

手順3. 子フォームを作成する

発注明細テーブルをもとに、サブフォームとして表示する子フォームを作りましょう。

複数の明細を一覧で扱う場合は、表形式フォームまたはデータシートビューが適しています。
商品、数量、単価などの項目に加え、親フォームと結ぶ外部キー 発注登録No をレコードソースに含めてください。

表示形式を確認したい場合は、Accessフォームの種類と作り方も参考になります。
明細を入力する運用では、元になるテーブルやクエリが更新可能であることも確認しましょう。

手順4. 親フォームにサブフォームを配置する

親フォームをデザインビューで開き、次の順にサブフォームコントロールを配置します。

  1. 「フォームデザイン」タブで「サブフォーム/サブレポート」を選択する
  2. 親フォーム内で明細を表示したい位置をクリックする
  3. サブフォームウィザードで、作成した発注明細フォームを選択する
  4. 親フォームと子フォームを結ぶフィールドとして 発注登録No を指定する
  5. 完了後、表示領域の幅と高さを調整する

サブフォームコントロールを選択したら、親フォーム上で明細を表示したい位置に配置します。

配置するとウィザードが開くため、明細として表示する子フォームを選択します。

子フォームを選んだら、親フォームと子フォームを対応付けるフィールドを指定します。

ウィザードを完了すると親フォーム内に子フォームが配置されるので、まずはレイアウトを確認しましょう。

サブフォームが配置されたら、明細の項目が見やすく収まるよう表示領域のサイズを調整します。

サイズを整えた後はフォームビューへ切り替え、親データに対応する明細が表示されるか確認します。

手順5. リンク親フィールド・リンク子フィールドを確認する

ウィザードがキーを認識すればリンク設定は自動で入ります。
ただし、自動設定されなかった場合や指定を誤った場合に備え、プロパティシートを確認してください。

  1. 親フォームをデザインビューで開く
  2. 子フォームの中身ではなく、サブフォームコントロールの外枠を選択する
  3. プロパティシートの「データ」タブを開く
  4. 「リンク親フィールド」に親フォーム側の 発注登録No を指定する
  5. 「リンク子フィールド」に子フォーム側の 発注登録No を指定する
プロパティ設定例役割
リンク親フィールド親フォームの 発注登録No現在開いている発注伝票の番号を渡す
リンク子フィールド子フォームの 発注登録No同じ番号の明細を表示し、新規行に親番号を引き継ぐ

この設定が空欄だったり、違う項目を指定していたりすると、明細が連動しない原因になります。

手順6. 動作を確認する

フォームビューで確認するときは、見た目だけでなく、親データと子データの紐づきが正しく保たれているかを完成判定として確認します。

  • 親フォームでレコードを切り替えると、サブフォームの明細も切り替わるか
  • サブフォームに新しい明細を追加できるか
  • 入力後に保存しても、親データと子データの関係が崩れないか
  • 子データが別の親データに紐づいて表示されていないか
  • フォームを閉じて再度開いても、入力内容が残っているか

基本動作が確認できたら、入力しやすい余白や項目幅に調整します。
レイアウトを整える際は、Accessフォームのおすすめレイアウトも参考になるので、よかったらそちらもごらんください。

サブフォームの基本プロパティとメリット

サブフォームを使う一番のメリットは、親データと明細データを同じ画面で扱えることです。
フォームを行き来せずに関連する情報を見ながら入力できるため、確認しやすい作業画面になります。

  • 親データと明細データを1画面で確認できる
  • 親レコードを切り替えるだけで、関連する子データも切り替わる
  • 入力ミスや確認漏れを減らしやすい
  • 受注と受注明細、顧客と対応履歴など、実務の親子データ管理に向いている
  • 一覧と入力欄を分けずに済み、作業画面を分かりやすくできる

サブフォームを配置した後は、安定した運用を行うためにも、表示対象や連動を決めるプロパティも確認しましょう。

運用時に押さえておきたいプロパティは次の3つです。

プロパティ役割
ソースオブジェクトサブフォーム領域に表示するフォームを指定する
リンク親フィールド / リンク子フィールド現在の親に対応する子レコードを表示・登録する
レコードソース子フォームが表示・入力するデータの供給元を指定する

表示するフォームを確認したら、次にリンク親フィールドとリンク子フィールドが正しく設定されているかを確認します。

レコードソースやフォームプロパティの基本は、Accessフォームのプロパティの解説で詳しく確認できます。

サブフォームが連動しない・表示されない・入力できないとき

トラブルが起きたときは、症状に応じて確認箇所を切り分けます。

親フォームと連動しないとき

親フォームを移動しても同じ明細が出る場合は、まずリンク設定を確認します。

  1. サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」が空欄でないか確認する
  2. 親側が主キー、子側が対応する外部キーになっているか見直す
  3. 子フォームのレコードソースにリンク子フィールドが含まれているか調べる
  4. 親子のキーのデータ型が対応しているか確認する
  5. リレーションシップも同じキーで設定されているか見直す

新規の親データに明細を追加している途中であれば、親レコードをいったん保存してから動きを確認します。

サブフォームが表示されないとき

枠自体が表示されない場合と、枠はあるのに明細が出ない場合では、原因が異なります。

症状確認する設定
サブフォームの中身が表示されないサブフォームコントロールの「ソースオブジェクト」に対象フォームが指定されているか
枠はあるが明細が出ない子フォームのレコードソース、リンク親・子フィールド、現在の親に一致するデータの有無
1件だけ表示されて一覧にならない子フォームの既定のビューが単票フォームになっていないか
一部が見えないサブフォームコントロールのサイズやスクロールバーなどの表示設定

現在の親に属する明細がまだなければ、リンクが正しくても既存データは表示されません。
新規入力に使う場合は、空の新規行を追加できるかも併せて確かめます。

サブフォームに入力・追加できないとき

データは見えているのに入力できない場合は、子フォームのレコードソースと編集関連の設定を調べます。

レコードソースが更新可能か確認する

子フォームの元になっているクエリが集計クエリであったり、更新できない結合になっていたりすると、表示できても新しい明細は追加できません。
元テーブルを直接レコードソースにした場合に入力できるか試すと、原因を切り分けられます。

新規行が表示されない状態を確認したら、レコードソースに集計クエリなど更新できないクエリが指定されていないかを確認します。

フォームの許可設定を確認する

サブフォーム自体のプロパティ「編集ロック」が「はい」になっていると、入力や編集が行えません。
必ず「はい」になっているか確認しましょう。

また、子フォームのプロパティシートで、「追加の許可」と「更新の許可」が「はい」になっているか確認します。
明細を削除する運用であれば、「削除の許可」も確認対象です。

親レコードと必須項目を確認する

新しい発注伝票の入力直後は、親の主キーがまだ確定していない場合があります。
先に親レコードを保存してから、サブフォームに明細を追加してください。

それでも保存できない場合は、子テーブルの必須フィールドが埋まっているか、外部キーに親テーブルに存在する値が入るかを確認します。
参照整合性を設定していると、不整合な明細は保存されません。

サブフォームをさらに活用するには

基本の親子連動はVBAなしでも作れますが、実務では検索条件や選択内容に応じて表示する明細を変えたい場面があります。
その場合は、VBAでサブフォームのレコードソースを変更したり、ソースオブジェクトを切り替えたりすることで、同じ親フォーム内で必要な子データや子フォームを表示できます。

親フォーム側で検索条件やコンボボックスの選択を変更した後は、Requery を使ってサブフォームを再表示する方法もあります。
こうした制御を組み合わせると実務向けの検索・入力画面に発展できますが、詳しいVBA実装はAccess VBAでコンボボックス検索を行う方法Access VBAでサブフォームを切り替える方法で確認してください。

レコードソースに設定するSELECT文やWHERE句の基礎は、SELECT文の基本で確認できます。
ソースオブジェクトを切り替える活用例は、サブフォーム切り替えの活用例も参考になります。

Accessサブフォームに関するFAQ

サブフォームを作るにはリレーションシップ設定が必須ですか?

リンク親フィールドとリンク子フィールドを手動で設定し、表示を連動させられる場合はあります。
ただし、親子データの整合性を管理し、ウィザードで対応項目を認識しやすくするため、主キーと外部キーのリレーションシップを先に設定しておく方法が基本です。

サブフォームと連続フォームは何が違いますか?

連続フォームは、一つのフォームで複数レコードを繰り返し表示する形式です。
サブフォームは、メインフォーム内に別フォームを配置し、親レコードに関連する子レコードを扱う仕組みです。
サブフォームの表示形式として連続フォームを利用することもあります。

複数のフィールドで親子をリンクできますか?

複数項目で親子を識別する設計では、リンク親フィールドとリンク子フィールドに対応する項目を同じ順序で指定します。
初めて作る場合は、単一の主キーと外部キーで構成した方が設定を確認しやすくなります。

まとめ

Accessのサブフォームは、発注伝票と発注明細のような親子データを一画面で扱うための機能です。

作成時は、主キーと外部キーを整理したうえで、リレーションシップ、親フォーム、子フォーム、サブフォーム配置、リンク親・子フィールド、動作確認の順に進めます。
親を切り替えたときの表示連動は、リンク親フィールドとリンク子フィールドが中心となる設定です。

連動しないときはリンクとキー、表示されないときはソースオブジェクトとレコードソース、入力できないときは更新可否と許可設定を確認してください。

筆者自身も10年以上Accessを使って業務システムを作ってきましたが、実務では親フォームとサブフォームを組み合わせることで、明細の確認と入力を進めやすい画面を作る場面が多くあります。

Accessのフォームをさらに活用する場合は、Accessアプリの使い方まとめも参考になります。