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

ExcelとAccessの学習室

Accessサブフォーム活用術:一つの画面で入力・集計を完結させる実装手順

この記事で学習できること
  • Accessサブフォームの基本的手順
  • サブフォームをうまく設定できない時のトラブルシューティング
  • サブフォームを思い通りに操るためのプロパティ、基礎知識

Microsoft Accessでデータベースを作成していると、「一つの画面で関連データをまとめて表示したい」「親データと明細データを同時に入力したい」と思う場面が必ず出てきます。

たとえば、顧客管理では「顧客情報」と「注文履歴」を一画面で確認したいですよね。
また、社員管理なら「社員基本情報」と「研修履歴」を同時に見られると便利です。

Excelでも工夫すれば似たような管理は可能ですが、親子の関連データを一つの画面で自然に連動させながら扱うのは簡単ではありません

こうした「1対多」のデータを一つの画面で扱えるのが、Accessのサブフォームです。
メインフォームの中に子フォームを埋め込むことで、関連データを自動で連動表示できる点は、Accessならではの大きなメリットです。

しかし実際に作ってみると、

  • 子データが表示されない
  • 親と連動しない
  • 新規追加がうまくいかない

といったトラブルに直面することも少なくありません。

この記事では、初心者の方でも順番通りに進めればサブフォームを完成できるように、

  • 親子フォームの基本構造
  • サブフォームの具体的な作成手順
  • 動かないときの確認ポイント

をわかりやすく解説します。

この記事を読み終えるころには、親子連動するサブフォームを自分で作成できるようになるはずです。

Accessのサブフォームとは?

Accessのサブフォームとは、メインフォームの中に別のフォームを埋め込み、関連するデータを同時に表示・入力できる仕組みです。

特に「1対多」の関係にあるデータを扱う場面で力を発揮します。

たとえば顧客管理システムを例に考えてみましょう。
画面の上部に「顧客情報」、下部に「その顧客の注文履歴」が表示されているレイアウトを、業務アプリで見かけたことはありませんか?

顧客を切り替えると、注文履歴も自動的に切り替わる、この仕組みを実現しているのが、サブフォームです。

上図の赤枠部分がサブフォームです。
親フォームの内容に応じて、明細データが自動的に切り替わります。

これは、下の画像のように親テーブル(顧客)子テーブル(注文履歴)が共通のキーで関連付けられているためです。

親フォームのレコードを変更すると、そのキーに一致する子データだけが自動的に表示されます。

Excelでも一覧表示は可能ですが、親データの切り替えに応じて関連データを自動で絞り込む仕組みを、同じ画面内で自然に実現するのは簡単ではありません。

Accessのサブフォームを使えば、

  • 親データの確認
  • 明細データの追加・編集
  • 合計計算や確認

までを一画面で完結させることができます。

つまり、入力ミスの防止や作業効率の向上につながる、Accessを活用する上で欠かせない機能のひとつなのです。

次の章では、実際にサブフォームを作成する手順を、初心者の方でも順番通りに進めれば完成できるように解説していきます。

Accessサブフォームの作り方【親子フォーム作成手順】

ここからは、実際にサブフォームを作成する手順を解説します。
今回作るのは、親フォーム(発注伝票)+子フォーム(発注明細) の親子構造です。

手順1-リレーション設定

まず最初に行うのが、テーブル同士の関連付けです。
サブフォームが連動するかどうかは、ここで決まります。

以下の手順で設定してください。

  1. 「データベースツール」タブを開く
  2. 「リレーションシップ」をクリック
  3. 親テーブルと子テーブルを追加
  4. 親テーブルの主キーを、子テーブルの外部キーへドラッグ
  5. 親テーブルの主キーを、子テーブルの外部キーへドラッグ
  6. 「参照整合性」にチェックを入れて保存

これで、1対多の関係が完成します。

※ここが未設定だと、サブフォームは正しく連動しません。

当ブログ内の別記事でリレーション設定の手順を詳しく解説しているので、気になる方はそちらをごらんください。

https://sys-daddy.com/access-relationship/

手順2-親フォーム作成

次に、親テーブルをもとに親フォームを作成します。

親フォームの作り方は単票フォームを作る手順と同じですので、当ブログの以下の記事を参照してください。
リンク記事の見出し「作成方法1-ウィザードからAccessフォームを作る」が最も参考になると思います。

https://sys-daddy.com/access-form-making/#mokuzi2

親フォームのレイアウトが決まったら、下の画像のように、サブフォームを入れるスペースを確保しておきましょう。

また、親フォームを設定する重要なポイントは、主キー(発注登録No)がフォーム上に存在していることです。

このフィールドが、子フォームと連動するための基準になります。

手順3-子フォーム作成

続いて、子テーブルから子フォームを作成します。

サブフォームに適した子フォームは「表形式フォーム」または「データシートビュー」です。
これらのフォームの作り方・種類についても、当ブログの別記事で解説しています。

https://sys-daddy.com/access-form-beginner/

子フォームとして挿入するための大事なポイントは以下の2つです。

  • 外部キー(発注登録No)が含まれている
  • 追加・編集が可能な状態になっている

手順4-サブフォーム配置

ここが実装の中心部分です。
サブフォーム配置は以下の手順で行ってください。

フォームデザイン」タブのサブフォームをクリック。

サブフォームコントロールが選択された状態になるので、空きスペースでクリック。

フォームウィザードが起動したら、設置したいフォームを選択。

親フォーム子フォームのリンク設定を行います。

サブフォームが配置されましたが、サイズの調整が必要です。

Excelのオートシェイプを操作するような感じでサイズを調整します。

正しく配置されているかは、フォームビューに切り替えて確認しましょう。

これで、親フォームの中に子フォームへの配置は完了です。

手順5-Link Master/Child設定

これまでの手順で、親フォームと子フォームのリンク設定は行えるのですが、万が一設定し忘れた場合は、プロパティから設定してあげましょう。

  1. サブフォームコントロールを右クリック
  2. プロパティシートを開く
  3. 「データ」タブの親子フィールド設定を確認

Accessが自動設定する場合もありますが、空欄になっている場合は必ず手動で設定してください。

ここが一致していないと、

  • 子データが表示されない
  • 別のレコードが表示される

といった問題が起こります。

親子フィールド設定については、本記事の後半でも解説しています。

手順6-動作確認

正常にサブフォームが作成されたか、以下のポイントで確認しましょう。

  • 親レコードを切り替えると明細も切り替わるか
  • 明細を追加できるか
  • 保存後もデータが残るか

問題なく動けば、サブフォームの完成です。

サブフォームが表示されない・動かないときの確認ポイント

サブフォームは正しく設定すれば必ず連動します。
しかし実際には、

  • 子データが表示されない
  • 親を切り替えても明細が変わらない
  • 新規追加ができない

といったトラブルが起こることがあります。

多くの場合、原因は限られています。
順番に確認していきましょう。

リレーションシップが正しく設定されているか

最も多い原因が、テーブル間の関連付けミスです。

確認方法

  • 「データベースツール」→「リレーションシップ」を開く
  • 親テーブルと子テーブルが線で結ばれているか確認
  • 主キーと外部キーが一致しているか確認

よくあるミス

  • フィールド名は同じだが、実際は別の項目を結んでいる
  • データ型が違う(オートナンバーと数値型の不一致)
  • リレーション自体が未設定

サブフォームは、このリレーションを前提に動きます。
まずここを確認してください。

リンク親フィールド / リンク子フィールド が空欄になっていないか

サブフォームコントロールのプロパティで、

リンク親フィールド(Link Master Fields) と リンク子フィールド(Link Child Fields) が正しく設定されているか確認します。

確認手順

  • 親フォームをデザインビューで開く
  • サブフォームコントロールをクリック
  • プロパティシート →「データ」タブを確認

よくある原因

  • 自動設定されていない
  • 親フォーム側に該当フィールドが配置されていない

※親フォーム上に主キーが存在していないと、正しく連動しません。

子フォームのレコードソースが更新可能か

サブフォームに表示されているデータが「編集できない」「追加できない」場合は、レコードソースを確認してください。

確認ポイント

  • レコードソースが更新可能なテーブルまたはクエリか
  • 集計クエリになっていないか
  • 複数テーブル結合で更新不可になっていないか

更新できないクエリを使っていると、明細追加ができません。

親レコードが保存されているか

新規データを入力中に明細を追加しようとすると、
うまく保存されない場合があります。

これは、親レコードがまだ確定していないためです。

対処法

  • 親データを一度保存してから明細を入力する
  • 別レコードへ移動して保存を確定させる

主キーが確定していないと、子レコードは紐づけできません。

フォームの編集プロパティが無効になっていないか

子フォームのプロパティで、

  • データ入力
  • レコードの追加
  • レコードの編集

が「いいえ」になっていないか確認します。

これが無効になっていると、追加や更新ができません。


トラブルが起きたら、次の順番で確認しましょう。

  • リレーションシップ
  • リンク親フィールド / リンク子フィールド
  • レコードソース
  • 親レコード保存
  • フォームプロパティ

ほとんどの問題は、この5項目で解決できます。

サブフォームを使うメリット

サブフォームを使う一番のメリットは、データの入力や閲覧の効率が著しく向上することです。

サブフォームの無いシンプルなフォームでも、データの閲覧や入力を行えますが、フォーム間の遷移が頻繁に発生します。

画面遷移の回数が少ない場合はそれほどでもないのですが、あまりにも頻繁に発生すると操作自体がストレスになり、作業効率も低下します。

サブフォームを活用すると、一つの画面に複数の関連データを表示できます
これにより、画面遷移による手間とストレスを軽減できて、効率的なデータベース運用が可能となります。

サブフォームを扱う時に知っておきたいプロパティ

サブフォームでよく使う3つのプロパティについて紹介します。

  • ソースオブジェクト(Source Object)
  • 親子フィールドの設定(Link Master Fields / Link Child Fields)
  • レコードソース(Record Source)

ソースオブジェクトは、サブフォームに表示させるフォームを決めるプロパティです。
マクロやVBAを活用すれば、必要に応じて別のフォームに切り替えることも可能です。

親子フィールドの設定は連結式のサブフォームを使うときに必要です。
親テーブルに主キー、子テーブルに外部キーが正しく設定されているか確認しましょう。

レコードソースとは、フォームに表示するデータの供給元となるテーブル、クエリ、またはSQL文のことで、空白フォーム以外の全てのフォームに必要な設定です。
Accessフォームについて解説した記事では、レコードソースについて解説しています。

https://sys-daddy.com/access-form-property/

サブフォームを思い通りに動かすための基礎知識

VBAプログラミングを使ってサブフォームを思い通りに動かすコツは、まずは中身(レコードソース)の仕様を固めることです。
コンボボックスや検索窓を使ってサブフォームを絞り込むときは、レコードソースの動的な設定が欠かせません。

イベントプロシージャでレコードソース(SQL文)を変更するコードを記載することで、ユーザーが条件を選択・入力した後にサブフォームのデータ表示を思い通りに調整することができます。
そのため、SELECT文やWHERE句、LIKE演算子といったSQL文の基本的な書き方を習得することが重要になります。

SQLの学習についても当ブログで解説しています。
使い方を知らない人は、まずはSELECT文を解説した記事からご覧ください。

https://sys-daddy.com/select-statement-beginner-01/

さらに、レコードソースを設定するVBAプログラミングについて学習したい方は、以下の記事を参考にしてください。

https://sys-daddy.com/access-vba-combo-box-data-search/

また、クエリやフォームなどのAccessオブジェクトが増えるほど、Access自体の管理も複雑で大変になってきます。
データベースが重くなり、どこに何があるか分からなくなるという問題を避けるため、どのようにしてオブジェクトを増やさずに思い通りの動きを実現できるかが大事なポイントです。

有効な手段は、一つの親フォームで複数のサブフォームを切り替えられるように設定することです。
サブフォームごとに一つずつ親フォームを設けるとオブジェクトの数が膨れ上がってしまいますが、統合された親フォームを使うことで管理するオブジェクト数を最小限に抑えることができます。
マスターデータなど、複雑な使い方をせずシンプルな表示だけで事足りる場合などは特に効果的な方法です。

サブフォームの切り替えができるプロパティはソースオブジェクトです。
このソースオブジェクトプロパティをVBAで動的に変更することで、同じサブフォーム領域に異なるフォームを表示でき、メニュー選択に応じた画面切り替えやユーザーインターフェースの統一が可能になります。

サブフォーム自体を切り替える方法は以下の記事で解説しています。

https://sys-daddy.com/access-vba-switch-subform-with-combobox/
https://sys-daddy.com/eye_catching_access_vba_switch_master_data2/

いったんコードのベースが仕上がれば、コピペ後の微修正のみで広く使いまわすことも可能です。
VBAを有効に活用することができれば、Accessの操作性と保守性の向上を同時に実現できるのです。

まとめ

今回は、Accessのサブフォームの使い方とメリット、よく使うプロパティについて解説しました。

Accessのサブフォームをうまく使えるかが、快適なAccessデータベースになるかの鍵となるとも言えます。

Access歴10年を超えるぼく自身も、これまでいくつものAccessデータベースの開発と運用を行ってきました。
いろいろなAccessフォームも作ってきましたが、今ではAccessデータベース内にある全フォームのうち、データシート形式のサブフォームが過半数を占めています

フォームを作り込めば高品質のAccessデータベースを作ることができますが、特に他の業務を掛け持ちしている方などは十分な時間をなかなか確保することができません。
限られた時間のなか、完成度の高いフォームを作るために有効なのが、データシートフォームをサブフォームに使うことです。

この記事を読んだ方は、データシート形式のサブフォームを意識しながらAccessフォームを作ってみてください。
きっとスピーディなフォーム作成と出来上がりの品質に納得していただけることでしょう。


当ブログでは、Accessアプリの使い方について解説した他の記事もあります。
下にまとめ記事のリンクを入れておきますので、よかったらごらんください。

https://sys-daddy.com/learning-access-apps