「顧客台帳のフォームを開きながら、その顧客の受注データも同じ画面で確認・入力したい」「サブフォームをフォームに追加しようとしているが、リンク設定の意味がわからず正しく動かない」「MOS Access試験でサブフォームの設問が出ると聞いたが、どの操作を覚えればいいのか」——こうした疑問を持つ方は多いです。
Accessのサブフォーム・サブレポートは、一対多リレーションシップで結合された2つのテーブルのデータを1つの画面にまとめて表示・操作するための機能です。顧客台帳(1)と受注明細(多)、社員情報(1)と勤怠記録(多)のように、メインデータに紐づく関連データを同一フォーム上で追加・編集できる設計が可能になります。本記事では、サブフォームの埋め込みウィザード・リンク親子フィールド設定・表示形式の選択・集計値の参照方法、サブレポートの埋め込み手順、よくあるエラーと対処法、MOS Access試験の頻出出題パターンまで体系的に解説します。
「Accessで実務で使える本格的なデータ管理システムを構築したい」「MOS Access試験でサブフォームを確実に得点したい」という方は、ぜひ最後までご覧ください。
サブフォームとサブレポートとは:使いどころと基本概念
サブフォームとサブレポートはどちらも「親オブジェクト内に別のオブジェクトを埋め込む」仕組みですが、用途が異なります。
| 項目 | サブフォーム | サブレポート |
|---|---|---|
| 親オブジェクト | フォーム | レポート |
| 主な目的 | データの表示・入力・編集 | データの印刷・集計表示(読み取り専用) |
| 典型的な使い場面 | 受注入力画面に顧客名+受注明細を同時表示 | 月次売上レポートに商品別内訳を埋め込む |
| データ更新 | 可能(直接入力) | 不可(印刷・エクスポート用) |
サブフォームが特に威力を発揮するのは、一対多リレーションシップを持つテーブルを1画面で管理したい場面です。たとえば「顧客テーブル(1)」と「受注テーブル(多)」がある場合、顧客フォームを親フォーム、受注一覧をサブフォームとして埋め込むと、顧客を切り替えるたびにその顧客の受注明細が自動的に絞り込まれて表示されます。データを複数画面を行き来せずに扱えるため、データ入力ミスの低減と作業効率の向上が期待できます。
事前準備:リレーションシップの確認
サブフォームが正しく機能するためには、親テーブルと子テーブルの間にリレーションシップ(一対多)が設定されていることが前提です。事前に確認しておきましょう。
- 「データベースツール」タブをクリックする
- 「リレーションシップ」をクリックする
- 親テーブルの主キーフィールドと子テーブルの外部キーフィールドが結合線でつながっていることを確認する
- 結合線をダブルクリックして「参照整合性の適用」にチェックが入っているかを確認する
リレーションシップが設定されていない場合は、サブフォームウィザードで手動でリンクフィールドを指定することも可能ですが、参照整合性を担保するためにもリレーションシップを先に設定しておくことを強く推奨します。設定手順の詳細については「Access主キー・外部キー・リレーションシップを正しく理解する」記事を参照してください。
サブフォームを親フォームに埋め込む:ウィザード使用手順
最もシンプルな方法はサブフォームウィザードを使う方法です。既存のフォームにサブフォームコントロールを追加する手順を説明します。
手順1:親フォームをデザインビューで開く
- ナビゲーションウィンドウで親フォーム(例:「顧客フォーム」)を右クリックする
- 「デザインビュー」を選択する
- フォームのデザインビューが開く
手順2:サブフォームコントロールを配置する
- 「デザイン」タブの「コントロール」グループで「サブフォーム/サブレポート」ボタン(枠の中に小さな枠が描かれたアイコン)をクリックする
- フォームの詳細セクションにドラッグして配置する(サブフォームを表示したいエリアのサイズに合わせてドラッグ)
- マウスを離すと「サブフォームウィザード」が自動的に起動する
ウィザードが起動しない場合は、「デザイン」タブの「コントロール」グループで「コントロールウィザードを使う」がオンになっているかを確認してください。
手順3:ウィザードでデータソースとリンクを設定する
ウィザードは3つのステップで構成されています。
ステップ1:データソースの選択
- 「既存のテーブルまたはクエリを使用する」を選ぶと、テーブルやクエリから直接サブフォームを生成できる
- 「既存のフォームを使用する」を選ぶと、すでに作成済みのフォームをサブフォームとして埋め込める
既存のフォームを再利用する方法がメンテナンス性に優れています。受注入力用フォームがすでにある場合はそれを選択します。
ステップ2:リンクフィールドの設定
- 「一覧から選択する」を選ぶと、Accessがリレーションシップ情報をもとに候補を自動提示する
- 「自分で定義する」を選ぶと、親フォームのフィールドと子フォームのフィールドを手動でペアリングできる
リレーションシップが設定済みであれば「一覧から選択する」で正しい候補が表示されるので、それを選択します。たとえば「顧客ID で “顧客テーブル” と “受注テーブル” をリンクします」といった候補が表示されます。
ステップ3:サブフォームのラベル名設定
サブフォームコントロールに表示するラベル名(例:「受注一覧」)を入力して「完了」をクリックします。コントロール名はVBAやマクロから参照するときに使うため、わかりやすい名前にしておくと後の作業が楽になります。
手順4:サブフォームを保存して動作確認する
- 「Ctrl + S」でフォームを保存する
- 「ホーム」タブの「表示」→「フォームビュー」に切り替える
- 親フォームのレコードを切り替えながら、サブフォームに表示される関連レコードが変わることを確認する
リンク親フィールド・リンク子フィールドの意味と手動設定
サブフォームウィザードを使わずに手動で配置した場合、または後からリンク設定を変更したい場合は、プロパティシートで設定します。
リンクフィールドとは
| プロパティ名 | 設定内容 | 例 |
|---|---|---|
| リンク親フィールド | 親フォームのレコードソースに含まれるフィールド名 | 顧客ID |
| リンク子フィールド | サブフォームのレコードソースに含まれるフィールド名 | 受注テーブルの顧客ID |
この2つのフィールドが一致するレコードだけがサブフォームに表示されます。親フォームでレコードを切り替えると、リンク条件が自動的に更新されてサブフォームの表示内容が絞り込まれます。
手動設定の手順
- 親フォームをデザインビューで開く
- 埋め込まれたサブフォームコントロールを1回クリックして選択する(サブフォーム内のコントロールをクリックしないよう注意)
- 「デザイン」タブの「プロパティシート」をクリックして開く
- 「データ」タブを選択する
- 「リンク親フィールド」欄に親フォームのフィールド名(例:顧客ID)を入力する
- 「リンク子フィールド」欄にサブフォームのフィールド名(例:顧客ID)を入力する
複数フィールドでリンクする場合はセミコロン(;)で区切って入力します(例:「顧客ID;年度」)。リンクフィールドは必ずしも主キーと外部キーでなくても構いませんが、一意性が保証されているフィールドを親フィールドに使うことで予期しない重複表示を防ぐことができます。
サブフォームの表示形式(ビュー)の選択と変更
サブフォームは「既定のビュー」プロパティによって表示形式を変更できます。データの性質と用途に合わせて選択してください。
| ビュー名 | 表示スタイル | 適した場面 |
|---|---|---|
| データシートビュー | Excelのような一覧表形式 | 複数の子レコードを素早く確認・入力したい場合(最も一般的) |
| 帳票ビュー | 同じレイアウトが縦に並ぶリスト形式 | 1レコードあたりの項目数が多く、横に収まらない場合 |
| 単票ビュー | 1レコードのみを大きく表示 | 子レコードが常に1件だけの場合(一対一リレーション) |
受注明細や勤怠記録のような「1人の顧客に複数の関連レコードがある」データはデータシートビューが最も扱いやすく、MOS試験でも最も頻繁に登場します。
既定のビューの変更手順
- ナビゲーションウィンドウでサブフォームとして使っているフォームをデザインビューで開く
- フォームセレクター(フォーム左上の四角いマーク)をクリックしてフォーム全体を選択する
- プロパティシートの「書式」タブを開く
- 「既定のビュー」を「データシート」「帳票」「単票」から選択する
- 保存する
サブフォームでのデータ入力・編集操作
サブフォームに入力したデータは子テーブル(例:受注テーブル)に自動的に保存されます。リンクフィールドの値(例:顧客ID)は、親フォームの現在のレコードの値が自動的にセットされるため、手動で入力する必要はありません。
新規レコードの入力
- フォームビューでサブフォームの空行(アスタリスク「*」が表示された行)をクリックする
- 各フィールドに値を入力する(リンクフィールドは自動入力)
- 次のフィールドへTabキーで移動する
- 最終フィールドでTabキーを押すか別のコントロールをクリックするとレコードが保存される
親フォームとサブフォーム間のフォーカス移動
親フォームとサブフォームの間をキーボードで移動するには以下のショートカットキーを使います。
| 操作 | キー操作 |
|---|---|
| 親フォーム→サブフォームへ移動 | Tabキーで順番に移動 |
| サブフォーム内でフィールド移動 | Tabキー |
| サブフォーム→親フォームへ戻る | Ctrl+Tabキー |
| サブフォームの次レコードへ | ↓キー(データシートビュー時) |
Ctrl+Tabキーを覚えておくことが特に重要です。Tabキーだけではサブフォームの中を延々とタブ移動してしまい、親フォームに戻れなくなるケースがよくあります。MOS試験でも操作手順として問われることがあります。
サブフォームの集計値を親フォームで参照する方法
サブフォームの合計金額や件数を親フォームのラベルやテキストボックスに表示したい場面はよくあります。実現する方法は2つあります。
方法1:サブフォーム内で集計フィールドを作り、親フォームから参照する
最も確実な方法です。手順は以下の通りです。
ステップ1:サブフォームのフッターに集計テキストボックスを追加する
- サブフォームをデザインビューで開く
- フォームフッターに非連結テキストボックスを追加する(表示されていない場合は「表示」→「フォームヘッダー/フッター」でフッターを表示)
- テキストボックスのプロパティシートを開き、「名前」を「合計金額」などわかりやすい名前にする
- コントロールソースに集計式を入力する(例:
=Sum([金額])または=Count(*))
ステップ2:親フォームのテキストボックスからサブフォームの集計値を参照する
親フォームに非連結テキストボックスを追加し、コントロールソースに以下の式を入力します。
=[サブフォームコントロール名].Form![テキストボックス名]
具体例:サブフォームコントロール名が「受注一覧」、サブフォーム内のテキストボックス名が「合計金額」の場合は次のようになります。
=[受注一覧].Form![合計金額]
「サブフォームコントロール名」はデザインビューでサブフォームコントロールを選択し、プロパティシートの「その他」タブの「名前」に表示される値です(ウィザードで付けたラベル名とは別物になる場合があるため注意してください)。
方法2:DSum・DCount関数で直接集計する
サブフォームフッターを使わずに親フォームのテキストボックスから直接集計したい場合は、ドメイン集計関数を使います。
=DSum("金額","受注テーブル","顧客ID=" & [顧客ID])
この式は「受注テーブルの中で顧客IDが一致するレコードの金額を合計する」という意味です。シンプルですが、レコード数が多いとDSum関数は都度全テーブルを参照するためパフォーマンスが低下することもあります。本格的なシステムでは方法1の参照式が推奨されます。
サブレポートをレポートに埋め込む手順
レポートにサブレポートを追加する手順はサブフォームとほぼ同じです。主な違いは「データの更新ができない(読み取り専用)」点と、「印刷・PDF出力を前提としたレイアウト設計が必要」な点です。
サブレポート埋め込み手順
- 親レポートをデザインビューで開く
- 「デザイン」タブの「コントロール」グループで「サブフォーム/サブレポート」ボタンをクリックする
- 詳細セクションまたはグループフッターにドラッグして配置する(印刷時の配置を意識して大きさを決める)
- サブフォームウィザードが起動したらデータソースとリンクフィールドを設定する
- 「完了」をクリックしてウィザードを閉じる
サブレポートをグループヘッダー・グループフッターに配置すると、グループ単位で関連データをまとめて表示できます。たとえば「顧客グループのヘッダーに顧客情報レポート、フッターに受注合計サブレポート」というレイアウトが典型的な使い方です。
サブレポートの高さ調整
サブレポートは内容に合わせて自動的に高さが変わります。プロパティシートの「書式」タブで「拡張可能」と「縮小可能」を「はい」に設定しておくと、レコード数に応じてサブレポートの表示領域が動的に変化し、余白が発生しにくくなります。
よくあるエラーと対処法
サブフォームを設定する際によくつまずくパターンと対処法をまとめました。
サブフォームが空白のまま何も表示されない
原因1:リンクフィールドの設定ミス
リンク親フィールドとリンク子フィールドのデータ型が一致していない場合(例:親が数値型・子がテキスト型)、条件が一致せず空白になります。両テーブルの該当フィールドのデータ型を揃えてください。
原因2:サブフォームのレコードソースが空
サブフォームに使っているフォームまたはクエリのレコードソースが正しく設定されていない場合、そもそもデータが取得できません。サブフォーム単体をフォームビューで開いて、データが表示されるかどうかを確認してください。
原因3:リンクフィールドのフィールド名が誤っている
フィールド名にスペースや特殊文字が含まれる場合、角かっこで囲む必要があります(例:[顧客 ID])。プロパティシートで確認してください。
サブフォームへの入力がエラーになる
「参照整合性エラー」が発生する場合は、入力しようとしている外部キーの値が親テーブルに存在しないことが原因です。親レコードを先に保存するか、リレーションシップの「連鎖追加」設定を確認してください。また、サブフォームのフォームがデザインビューのまま開かれていると、フォームビューに切り替えるまで入力できません。必ずフォームビューで操作してください。
集計式が「#エラー」と表示される
親フォームからサブフォームの集計値を参照する式で「#エラー」が出る場合は、サブフォームコントロール名の確認が最初のチェックポイントです。プロパティシートの「その他」タブに表示される「名前」が参照式のコントロール名と完全一致しているかを確認してください。コントロールのラベルテキストとコントロール名は別物であることに注意が必要です。
サブフォームコントロールの中に入れない・誤ったコントロールが選択される
デザインビューでサブフォームコントロールを1回クリックすると「サブフォームコントロール全体」が選択されます。サブフォームの内部コントロール(テキストボックス等)を編集するには、サブフォームコントロールをダブルクリックして「サブフォームの編集モード」に入ってから操作します。
MOS Access試験でのサブフォーム・サブレポート頻出パターンと攻略法
MOS Access試験(Expert・Generalどちらも)でサブフォームは頻出分野のひとつです。出題パターンを把握して確実に得点しましょう。
頻出出題パターン
| 出題パターン | 求められる操作 | ポイント |
|---|---|---|
| サブフォームの追加 | 既存フォームに指定されたテーブルをサブフォームとして埋め込む | ウィザードの操作順と各ステップの意味を理解する |
| リンクフィールドの変更 | 既存サブフォームのリンク親/子フィールドを変更する | プロパティシートの「データ」タブの場所を把握する |
| サブフォームの表示形式変更 | サブフォームのビューをデータシート/帳票に変更する | サブフォームのプロパティを変更する場所を覚える |
| サブフォームのコントロール名確認 | 集計参照式を正しく作成する | コントロール名とラベル名の違いを理解する |
| Ctrl+Tabキーの使用 | サブフォームから親フォームにフォーカスを戻す | Tabキーとの違いを把握する |
合格のための学習ポイント
ポイント1:ウィザードの3ステップを確実に操作できるようにする
「データソース選択→リンクフィールド設定→コントロール名入力」の3段階を試験時間内に確実に完了させるため、繰り返し練習してください。MOS試験は実際に操作してファイルを保存する形式のため、理解だけでなく手が覚えるレベルまで練習することが重要です。
ポイント2:プロパティシートの「データ」タブの場所を身体で覚える
リンクフィールドの変更・コントロールソースの設定はすべてプロパティシートから行います。「どのタブを開けばどのプロパティがあるか」を素早く操作できるよう意識してください。
ポイント3:サブフォームのコントロール名とラベルの違いを理解する
ウィザードで設定したラベル名(画面に表示されるテキスト)と、プロパティシートに表示されるコントロール名(VBA・参照式で使う名前)は別物です。集計参照式でエラーになる原因の多くはここです。試験中に混乱しないよう、コントロール名はプロパティシートの「その他」タブで必ず確認する習慣をつけてください。
ポイント4:フォームビューと印刷プレビューで動作確認する癖をつける
試験では「設定後に正しく動作するか」まで確認することが重要です。サブフォームを追加したらフォームビューに切り替えて、親レコードを変えるとサブフォームの表示が変わることを必ず確認してください。
MOS Access試験の出題バージョンと学習範囲
MOS Access試験は現在「MOS 365 Access」と「MOS 2019 Access」の2バージョンが主に実施されています(2026年時点)。どちらのバージョンでもサブフォームはコアスキルに含まれます。試験勉強では公式テキストの操作手順をそのまま再現できるレベルまで練習することが合格の近道です。
まとめ:サブフォームをマスターしてAccessの活用度を上げる
この記事では、Accessのサブフォーム・サブレポートについて以下の内容を解説しました。
- サブフォームとサブレポートの違いと使いどころ(一対多データの1画面表示)
- サブフォームウィザードを使った埋め込み手順(3ステップ)
- リンク親フィールド・リンク子フィールドの意味と手動設定方法
- データシート・帳票・単票ビューの選択基準
- データ入力とCtrl+Tabキーによるフォーカス移動
- 集計値を親フォームで参照する2つの方法(Form参照式・DSum関数)
- サブレポートの埋め込みと高さ調整
- よくある5つのエラーと対処法
- MOS Access試験の頻出パターンと学習ポイント
サブフォームは、テーブル設計・リレーションシップ・フォーム設計の知識が統合される実践的な機能です。最初は設定が複雑に感じるかもしれませんが、「リンク親子フィールドで2つのテーブルをつなぐ」という基本原理を理解すると、設定の意味がわかり自分でトラブルシューティングできるようになります。まずは手元のAccessで「顧客テーブル+受注テーブル」のような簡単なデータを使って、実際にサブフォームを作成してみることをおすすめします。
