Accessのサブフォームの作り方をお探しですね。
広告
Accessのサブフォームの作り方を分かりやすく解説!一対多の入力画面を作ろう
Accessでデータベースを作っていると、「お客さんの情報と注文履歴」や「売上伝票と明細」みたいに、1つのメインデータに関連する複数の子データを、同じ画面で一緒に見たり入力したりしたいことがよくあります。
Excelだとこういった「一対多」のデータ管理はなかなか難しいのですが、Accessならサブフォーム機能を使って直感的な入力画面が作れます。
この記事では、メインフォームとサブフォームをちゃんと連動させる方法から、うまく動かない時の対処法まで、分かりやすく説明していきますね。
Accessのサブフォームって何?一対多の入力画面を作るメリット
Accessのサブフォームというのは、メインのフォーム(親フォーム)の中に、別のフォーム(子フォーム)を部品みたいに埋め込んで表示できる便利な機能です。
データベースの基本である「一対多」の関係を持つデータを、1つの画面で効率よく扱うために用意されています。
例えば、画面の上半分に特定のお客さんの基本情報を表示して、下半分にはそのお客さんの購入履歴を一覧表で表示する、といった使い方ができます。
サブフォームを使う一番のメリットは、**データ入力がすごく楽になって、入力ミスも減る**ことです。
親データと子データを別々の画面で入力していると、画面を切り替えるたびに「今どのお客さんのデータを入力してるんだっけ?」と確認しないといけなくて、間違えて別のお客さんの明細を登録してしまう危険があります。
でも、メインフォームとサブフォームがちゃんと連動していれば、親データを選ぶだけで関連する明細だけが自動的に表示されるので、迷わず素早く正確に入力できるようになります。
それに、**使う人にとって分かりやすい画面**が作れるのも大きなポイントです。
1つの画面の中で、データを見たり、新しく追加したり、編集したりが全部できるので、画面をあちこち行き来する手間が省けます。
毎日たくさんのデータを処理する仕事では、こういった小さな手間を減らすことが、作業のスピードアップにつながります。
Accessで現場に喜ばれるデータベースを作るなら、メインフォームとサブフォームの連携は必須のテクニックと言えますね。
【準備編】メインフォームとサブフォームを連動させるために必要なこと
サブフォームをちゃんと動かすには、いきなりフォームを作り始めるのではなく、**まずテーブルの設計をしっかりやっておく**必要があります。
一番大事なのが、関連するテーブル同士を結びつける「リレーションシップ(関連付け)」の設定です。
親テーブルと子テーブルが、共通の項目を通じて「一対多」の関係として正しく認識されていないと、フォームでいくら設定してもデータは連動しません。
具体的には、親テーブル側の「主キー(お客さんIDや伝票番号など、絶対に重複しない番号)」と、子テーブル側の「外部キー(親の主キーの値を受け入れる項目)」を正確に紐づけます。
例えば、売上伝票テーブルの「売上ID」が主キーなら、売上明細テーブルにも同じデータ型の「売上ID」という項目を用意しておいて、データベースのツール画面からリレーションシップの線を引いて結合します。
この土台の繋がりがあって初めて、Accessは「どの明細がどの伝票に属しているか」を判断できるようになります。
テーブル間のリレーションシップが設定できたら、次にそれぞれのテーブルを元にして、メインフォームとサブフォームのベースとなる画面を作っておきます。
一般的に、メインフォームは1件のデータを詳しく見せる「単票形式」で、サブフォームは複数件のデータを一覧で見せる「データシートビュー」や「表形式」で作るのがおすすめです。
この準備段階で特に注意したいのは、**親フォームにも子フォームにも、お互いを紐づけるための共通のキー項目がちゃんと含まれている**ようにしておくことです。
メインフォームとサブフォームの具体的な作り方・配置の手順
テーブル設計と基本のフォームの準備ができたら、いよいよメインフォームの中にサブフォームを配置して、連動させる作業に入ります。
まず、作成済みのメインフォームをデザインビューで開いて、画面上部のリボンメニューにある「フォームデザイン」タブから、「サブフォーム/サブレポート」のアイコンをクリックします。
そのまま、メインフォーム上の空いているスペースをマウスでドラッグして、子フォームを配置する四角い領域を作ります。
領域を作ると、「サブフォームウィザード」が自動的に起動して、どのフォームを埋め込むかを選ぶ画面が表示されます。
サブフォームウィザードの最初の画面では、事前に作っておいた子フォーム(明細用のフォーム)を選んで次に進みます。
次の画面では、親フォームと子フォームをどの項目を基準にしてリンクさせるかを聞かれます。
テーブル間のリレーションシップが正しく設定されていれば、Accessが自動的に「売上IDを使用してリンクする」といった候補を提示してくれます。
もし自動で提示されない場合や、自分で指定したい場合は、一覧から共通のキー項目(主キーと外部キー)を手動で選んで設定します。
サブフォームの配置とウィザードの設定が終わったら、**フォームビューに切り替えて動作確認**をしましょう。
メインフォームのレコード移動ボタンで親データを次に進めた時、サブフォームの明細データも自動的に切り替わればOKです。
ちなみに、このウィザードによる自動設定の裏側では、サブフォームコントロールのプロパティシートにある「リンク親フィールド」と「リンク子フィールド」という項目に、指定した共通キーの名前が自動的に書き込まれています。
今後のために、一度プロパティシートを開いてこの2つの項目に同じ項目名が正しく設定されているか確認しておくといいですよ。
サブフォームが連動しない・入力できない時の解決法
手順通りに作ったはずなのに、親データを切り替えても明細が変わらなかったり、サブフォームに新しいデータを追加できなかったりするトラブルは、初心者から中級者までよく経験する問題です。
まず、**データが連動しない場合**は、サブフォームコントロールのプロパティにある「リンク親フィールド」と「リンク子フィールド」の設定が空白になっていないか、間違った項目名が入っていないかを確認してください。
この2つの設定値が一致していないと、Accessは親と子の紐づけができず、連動機能が働きません。
また、**サブフォームに新しいデータを入力できない場合**、保存のタイミングが原因であることが多いです。
Accessでは、親フォームで新規レコードを入力している最中(まだ保存されていない状態)に、子フォームに移動して明細を入力することはできません。
親データがデータベースに存在していない状態では、子データを紐づけて保存する先がないからです。
このエラーが出た時は、親フォームの必須項目を入力した後に一度保存するか、他のレコードに移動してデータを確定させてから、改めて明細を入力するようにしましょう。
さらに、**サブフォームがグレーアウトして編集できない**場合や、**新規追加の空欄行が表示されない**場合は、子フォームのデータソース(元になっているテーブルやクエリ)が更新できない状態になっている可能性があります。
特に、複数のテーブルを結合した集計クエリや、特定の関数を使ったクエリをサブフォームの元データにしていると、Accessが安全のためにデータの書き換えをブロックすることがあります。
この場合は、まず子フォームのプロパティで「追加の許可」や「更新の許可」が「はい」になっているか確認して、元のテーブルやクエリが単独で開いた時にデータの追加や編集ができるかをチェックしましょう。
もし設定を見直してもうまく動かない時は、以下の3つのポイントを順番に確認してみてください。
* サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」が一致しているか
* 親フォームのレコードを保存してから明細を入力しているか
* 子フォームの元データ(テーブルやクエリ)が更新可能な状態か
これらを1つずつ丁寧にチェックしていけば、エラーを解消して、ちゃんと入力も集計もできる実用的な一対多の入力画面が完成しますよ。
広告
