- サブフォームの基本と使い分け(連結式と非連結式の違い)
- サブフォームでよく使うプロパティ
- サブフォームを操るためのプログラミングのコツ
Microsoft Accessを使ってデータベースを作っていると、「一つの画面で複数の情報をまとめて表示したい」「関連するデータを同時に見られるようにしたい」と思うことがありませんか?
たとえば、顧客管理システムを作るとき、お客様の基本情報(名前、住所、電話番号など)と一緒に、そのお客様の過去の注文履歴も同じ画面で確認できたら便利ですよね。
同様に、社員管理システムでは、社員の基本データと研修受講履歴を一度に閲覧することで、効果的な人材育成戦略を立てることができます。
そんな時に役立つのが「サブフォーム」。
Excelでも複数のデータを扱うことはできますが、こうした関連データを一つの画面で見やすくまとめて表示するのは意外と難しいです。
しかし、Accessのサブフォームを使えば、メインとなるフォームの中に別のフォームを埋め込むことができ、関連する情報を一つの画面にまとめて表示できるようになります。
つまり、一画面で関連情報を確認できるため転記ミスや参照漏れが減り、品質も向上します。
もくじ
この記事では、Accessを初めて触る方でも分かりやすいように、サブフォームの基本的な概念から具体的な作成方法、そして実際に使う時のコツまでを順番に解説していきます。
「データベースって難しそう…」と思っている方も、この記事を読み終える頃には、サブフォームを使って効率的な画面を作れるようになっているはずです。
Accessのサブフォームとは?
サブフォームは、一つの画面の中に複数のテーブルデータを同時に表示できる便利な仕組みです。
まるで机の上に資料を並べるように、関連するデータを一度に見ることができます。

顧客管理システムを例に挙げてみましょう。
画面の上半分にお客様の基本情報、下半分に注文履歴が表示されているレイアウトを、パッケージ型の業務アプリなどでよく見かけませんか?
顧客を切り替えるだけで、注文履歴も自動的に切り替わるので、別の画面を開く手間は不要。
これが「連結式」サブフォームの基本的な働きです。
親テーブル(発注伝票)と子テーブル(発注伝票明細)が共通のキーで結びついているため、親を変更すると子も自動的に絞り込まれます。

この画面一つで新しい注文の追加や編集、合計金額計算まですべて完結できるので、作業効率が格段にアップ!
一方で、親フォームと自動リンクを持たない「非連結式」のサブフォームも、Access運用で大きな役割を果たします。
下は空白のフォームに非連結式サブフォームを貼り付けて、入力データ一覧が表示されたものです。

表形式でデータをシンプルに表示させることができて、チェック欄を設けるなどカスタマイズも可能。
連結式が「一つの対象を深く管理する」ツールなら、非連結式は「広い視野で判断を助ける」サポート役といえるでしょう。
最初は「難しそう…」と感じるかもしれませんが、一度作ってしまえば、「こんなに楽になるのか!」と驚くはずです。
次の章では、実際にサブフォームを作る手順を初心者の方でも分かるように解説していきます。
Accessサブフォームの作り方
サブフォームを作る方法は大きく2つに分かれます。
- 連結式サブフォーム(単票フォームに設置)
- 非連結式サブフォーム(空白のフォームに設置)
本記事ではデータシートフォームを挿入する方法のみを紹介しますが、場合によっては帳票形式(表形式)のサブフォームを挿入する必要が生じることもあります。
データシート形式と表形式の挿入手順は似ているため、本記事の内容を理解できれば帳票形式の挿入方法にも対応できるでしょう。
両者の最も大きな違いは、データシートが入力速度に、帳票が可読性に強みを持つことです。
用途に応じてうまく使い分けましょう。
サブフォームの元となるデータシートフォームは、前準備として必要になります。
データシートフォームの作り方については、下記の記事を参考にしてください。
連結式のサブフォームを設置する
単票フォームに明細データを同じ画面で表示する時は、連結式のサブフォームを使うのが定番です。
では、伝票データをレコードソースとして設定された単票フォーム(親フォーム)に、伝票明細フォーム(子フォーム)を設置してみましょう。
単票フォームの中央あたりに、明細用のサブフォームを設置するエリアを設けています。

もちろん、元データの伝票テーブルと伝票明細テーブルはリレーションシップで連結された状態です。

フォーム名の指定までは、非連結式のサブフォームを貼り付ける時と同じ手順です。
フォームを指定したら、「完了」ではなく「次へ」をクリックしましょう。

「次へ」をクリックすると、親フォームと子フォームの設定画面が表示されます。
連結キーの条件が表示されるので、間違いないことを必ず確認し「完了」をクリックします。

「完了」をクリックすると、単票フォームに連結式サブフォームが設置されました。

デザインビューのままでサブフォームの大きさを調整します。

フォームビューに切り替えると、正しくデータが表示されました。

伝票データと明細データの連動を確認するためにも、レコードセレクタで移動させてみます。

最初のレコードの明細データ件数は1件です。

次のレコードは明細が3件表示されました。

このように、伝票データのレコードを移動させると、明細データの中身も変わり、親フォームと子フォームが連動していることが確認できます。
非連結式のサブフォームを設置する
非連結式のサブフォームを設置する手順はとてもシンプルです。
空白の親フォームにサブフォームを設置してみましょう。
貼り付ける位置は、ラベルやボタンから外れた、ちょうど中央あたりです。

フォームをデザインビューに切り替えます。

リボンのタブにあるサブフォームコントロールをクリックします。

クリックしたボタンに枠がつけば、サブフォームを配置できる状態です。
空白フォームのどこでもいいので、マウスでクリックしましょう。

クリック後、サブフォームウィザードが起動しました。

設置するフォームを選び、「完了」をクリックします。

指定した位置に非連結式のサブフォームが貼り付けられました。

デザインビューのままでサブフォームの大きさを調整します。

フォームビューで確認したところ、データが正しく表示されました。

このように、非連結式のサブフォームを設置するのに必要な設定は、フォーム名の指定だけです。
サブフォームを使うメリット
サブフォームを使う一番のメリットは、データの入力や閲覧の効率が著しく向上することです。
サブフォームの無いシンプルなフォームでも、データの閲覧や入力を行えますが、フォーム間の遷移が頻繁に発生します。
画面遷移の回数が少ない場合はそれほどでもないのですが、あまりにも頻繁に発生すると操作自体がストレスになり、作業効率も低下します。
サブフォームを活用すると、一つの画面に複数の関連データを表示できます。
これにより、画面遷移による手間とストレスを軽減できて、効率的なデータベース運用が可能となります。
サブフォームを扱う時に知っておきたいプロパティ
サブフォームでよく使う3つのプロパティについて紹介します。
- ソースオブジェクト(Source Object)
- 親子フィールドの設定(Link Master Fields / Link Child Fields)
- レコードソース(Record Source)
ソースオブジェクトは、サブフォームに表示させるフォームを決めるプロパティです。
マクロやVBAを活用すれば、必要に応じて別のフォームに切り替えることも可能です。

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

レコードソースとは、フォームに表示するデータの供給元となるテーブル、クエリ、またはSQL文のことで、空白フォーム以外の全てのフォームに必要な設定です。
Accessフォームについて解説した記事では、レコードソースについて解説しています。
サブフォームを思い通りに制御するプログラミングのコツ
VBAプログラミングを使ってサブフォームを思い通りに動かすコツは、まずは中身(レコードソース)の仕様を固めることです。
コンボボックスや検索窓を使ってサブフォームを絞り込むときは、レコードソースの動的な設定が欠かせません。
イベントプロシージャでレコードソース(SQL文)を変更するコードを記載することで、ユーザーが条件を選択・入力した後にサブフォームのデータ表示を思い通りに調整することができます。
そのため、SELECT文やWHERE句、LIKE演算子といったSQL文の基本的な書き方を習得することが重要になります。
SQLの学習についても当ブログで解説しています。
使い方を知らない人は、まずはSELECT文を解説した記事からご覧ください。
さらに、レコードソースを設定するVBAプログラミングについて学習したい方は、以下の記事を参考にしてください。
また、クエリやフォームなどのAccessオブジェクトが増えるほど、Access自体の管理も複雑で大変になってきます。
データベースが重くなり、どこに何があるか分からなくなるという問題を避けるため、どのようにしてオブジェクトを増やさずに思い通りの動きを実現できるかが大事なポイントです。
有効な手段は、一つの親フォームで複数のサブフォームを切り替えられるように設定することです。
サブフォームごとに一つずつ親フォームを設けるとオブジェクトの数が膨れ上がってしまいますが、統合された親フォームを使うことで管理するオブジェクト数を最小限に抑えることができます。
マスターデータなど、複雑な使い方をせずシンプルな表示だけで事足りる場合などは特に効果的な方法です。
サブフォームの切り替えができるプロパティはソースオブジェクトです。
このソースオブジェクトプロパティをVBAで動的に変更することで、同じサブフォーム領域に異なるフォームを表示でき、メニュー選択に応じた画面切り替えやユーザーインターフェースの統一が可能になります。
サブフォーム自体を切り替える方法は以下の記事で解説しています。
いったんコードのベースが仕上がれば、コピペ後の微修正のみで広く使いまわすことも可能です。
VBAを有効に活用することができれば、Accessの操作性と保守性の向上を同時に実現できるのです。
おまけ-参照用に小さいサブフォームを設置する
ここまで記事を読んでくれた方におまけとして、マイナーだけど便利なサブフォームの使い方も紹介しておきます。
それは参照用に小さいサブフォームを設置するという方法です。

例えば入力フォームでコード番号をキーボードで入力する仕様の場合、コード番号と項目名が同一画面に表示されていれば、入力しながらマスタデータを確認できます。
コンボボックスやリストボックスを使って、マウスで項目を選択させる方法もありますが、効率を追求する場合はキーボードでコードを直接入力する方が正しい選択です。
マスタレコードが10件以内であれば、入力フォームにマスタデータを非連結式サブフォームとして表示させるのはとても有効な方法だと思いますので、ぜひ試してみてください。
まとめ
今回は、Accessのサブフォームの使い方とメリット、よく使うプロパティについて解説しました。
Accessのサブフォームをうまく使えるかが、快適なAccessデータベースになるかの鍵となるとも言えます。
Access歴10年を超えるぼく自身も、これまでいくつものAccessデータベースの開発と運用を行ってきました。
いろいろなAccessフォームも作ってきましたが、今ではAccessデータベース内にある全フォームのうち、データシート形式のサブフォームが過半数を占めています。
フォームを作り込めば高品質のAccessデータベースを作ることができますが、特に他の業務を掛け持ちしている方などは十分な時間をなかなか確保することができません。
限られた時間のなか、完成度の高いフォームを作るために有効なのが、データシートフォームをサブフォームに使うことです。
この記事を読んだ方は、データシート形式のサブフォームを意識しながらAccessフォームを作ってみてください。
きっとスピーディなフォーム作成と出来上がりの品質に納得していただけることでしょう。
当ブログでは、Accessアプリの使い方について解説した他の記事もあります。
下にまとめ記事のリンクを入れておきますので、よかったらごらんください。