Accessサブフォームの作り方をお探しですね。
広告
Accessのサブフォームで親子データを同時入力する画面を作ろう
Accessで売上伝票や注文書のような画面を作るとき、伝票の情報と明細を別々の画面で入力すると、操作がややこしくなりますよね。
そんなときに便利なのが「サブフォーム」です。
サブフォームを使えば、1件の伝票情報を見ながら、その下に複数行の明細をまとめて入力できるようになります。
この記事では、Accessのサブフォームの作り方を、基本的な考え方から具体的な手順、つまずきやすいポイントまで分かりやすく解説します。
1. サブフォームって何?親子データを一緒に入力できる便利な仕組み
Accessの「サブフォーム」とは、メインのフォームの中に別のフォームを入れ込んで表示する機能のことです。
例えば、メインフォームに「売上伝票の日付・お客さん名・伝票番号」を表示して、その下のサブフォームに「商品名・数量・単価・金額」といった明細を何行も入力できる画面が作れます。
これは、データベースでよく使われる「1対多」の関係を画面で表現する方法です。
1件の売上伝票に対して複数の明細が紐づくような業務では、親のデータと子のデータを同じ画面で扱えるので、入力の流れがとてもスムーズになります。
ここで大事なのは、サブフォームは単に「見た目でフォームを重ねる機能」ではないということです。
ちゃんと動かすには、親テーブルと子テーブルの関係がはっきりしている必要があります。
親テーブルには主キー、子テーブルには外部キーを用意して、その値で両者をつなぎます。
例えば、親テーブル「T_売上」に「売上ID」という主キーがあって、子テーブル「T_売上明細」にも「売上ID」という外部キーを持たせる設計です。
この関係があることで、メインフォームに表示している売上IDに対応する明細だけが、サブフォームに表示・入力されるようになります。
サブフォームが活躍するのは、こんな場面です。
伝票と明細、お客さんと対応履歴、社員と資格情報、案件と作業記録など、いずれも「親1件に対して子が複数件ある」構造です。
逆に、親と子の関係がないデータを無理やり同じ画面に並べると、入力ミスやデータのズレが起きやすくなります。
サブフォームの作り方を覚える前に、まずは「どのテーブルが親で、どれが子なのか」「どの項目でつなぐのか」を整理することが、使いやすい画面を作る第一歩です。
2. サブフォームを作る前に準備しておくテーブル設計とリレーションシップ
親子データを同時入力する画面を作る前に、まず確認すべきなのはテーブルの構造です。
親テーブルには1件を識別するための主キーを設定し、子テーブルには親テーブルの主キーを保存するための外部キーを用意します。
売上入力を例にすると、親テーブル「T_売上」には「売上ID」「売上日」「顧客ID」などを入れて、子テーブル「T_売上明細」には「明細ID」「売上ID」「商品ID」「数量」「単価」などを入れます。
子テーブル側の「売上ID」は、どの売上伝票に属する明細なのかを示すための大切な項目です。
テーブルを作ったら、Accessの「データベースツール」タブから「リレーションシップ」を開いて、親テーブルの主キーと子テーブルの外部キーを線でつなぎます。
このとき、必要に応じて「参照整合性」を設定すると、存在しない親データに対して明細が登録されるのを防げます。
例えば、売上IDが存在しないのに売上明細だけが登録される状態を防げるので、データの信頼性が高まります。
長く使うAccessファイルほど、このリレーションシップ設計を丁寧にやっておくことが大切です。
サブフォームを作る前には、メインフォームとサブフォームの「レコードソース」も考えておきましょう。
レコードソースとは、フォームがどのテーブルやクエリのデータを表示・編集するかを決める設定です。
メインフォームは親テーブル、サブフォームは子テーブル、または子テーブルをもとにしたクエリを使うのが基本です。
商品名やお客さん名を表示したい場合は、クエリで関連テーブルをつなげて表示用の項目を追加することもあります。
ただし、入力更新に使う項目と表示だけに使う項目を混同すると、更新できないフォームになる場合があるので、最初はシンプルな構成から始めるのが安全です。
準備の段階で特に注意したいのは、サブフォーム側にもリンク用の項目を含めておくことです。
売上明細フォームで「売上ID」を画面に見せる必要はありませんが、メインフォームとサブフォームを連動させるには、サブフォームのレコードソースに売上IDが含まれていないといけません。
フォーム上では、売上IDのコントロールを非表示にしておけば、利用者が気にする必要はありません。
つまり、画面には見せないけれど、裏側では親子をつなぐために必須の項目として扱う、という考え方です。
3. サブフォームの作り方:ウィザードを使う方法と手動で配置する方法
Accessのサブフォームを作る方法には、大きく分けて「フォームウィザードを使う方法」と「メインフォームに既存フォームを手動で配置する方法」があります。
初めての人におすすめなのは、フォームウィザードを使ってメインフォームとサブフォームをまとめて作る方法です。
リレーションシップが正しく設定されていれば、Accessが親子関係を自動で認識して、リンク項目を設定してくれることがあります。
「作成」タブからフォームウィザードを起動して、親テーブルの項目と子テーブルの項目を選んで進めると、「サブフォームがあるフォーム」を選べる画面が出てきます。
フォームウィザードでは、親側のデータを単票フォーム、子側のデータを表形式またはデータシート形式で表示する構成が一般的です。
単票フォームは1件の親レコードを分かりやすく表示する形式で、データシート形式はExcelみたいに複数行の明細を入力しやすい形式です。
売上伝票や注文入力では、上に伝票情報、下に明細一覧を並べるレイアウトが使いやすいです。
ウィザードが完了したら、そのまま使うのではなく、デザインビューでラベル名、項目の幅、タブの移動順、入力制御などを調整すると、実際の業務で使いやすい画面になります。
すでにメインフォームと明細フォームを作っている場合は、手動でサブフォームを配置できます。
メインフォームをデザインビューで開いて、コントロールから「サブフォーム/サブレポート」を選んで、配置したい場所をクリックします。
その後、既存のフォームをサブフォームとして指定するか、新しく作成するフォームを選びます。
配置したら、サブフォームコントロールのプロパティを開いて、「リンク親フィールド」と「リンク子フィールド」を確認します。
売上伝票の例なら、どちらも「売上ID」に設定します。
この設定が正しくないと、メインフォームのレコードを移動しても明細が連動しません。
設定が終わったら、必ずフォームビューで動作確認をしましょう。
新しい親レコードを作って、サブフォームに明細を入力したとき、子テーブル側に親の売上IDが自動で入るかを確認します。
また、メインフォームで別の売上伝票に移動したとき、サブフォームの明細がその伝票に対応したものだけに切り替わるかも重要です。
もし全件の明細が表示される場合は、リンク親フィールドとリンク子フィールドが未設定か、サブフォームのレコードソースにリンク用の項目が含まれていない可能性があります。
見た目だけで完成と判断せず、実際に登録・移動・編集を試してみることが大切です。
4. 親子フォーム設計で失敗しないためのコツと実務で使える工夫
サブフォームを使った画面設計でよくある失敗は、データ構造があいまいなままフォームだけを作ってしまうことです。
画面上では親フォームと子フォームが並んで見えても、リンク項目が正しく設定されていなければ、関係のない明細が表示されたり、入力した明細が親データに紐づかなかったりします。
また、VBAで無理やり値を入れて動かすこともできますが、基本設計が崩れている状態で処理を追加すると、後から修正するのが大変になります。
まずはテーブル設計、リレーションシップ、フォームのリンク設定という順番で整えるのが安全です。
実際の業務で使いやすいサブフォームにするには、入力する人が意識しなくていい項目を見せない工夫も必要です。
例えば、子テーブル側の売上IDはリンクに必要ですが、明細を入力する人が直接編集する項目ではありません。
なので、サブフォーム上では非表示にする、使用不可にする、タブ移動の対象外にするなどの設定を行います。
一方で、数量や単価のように入力頻度が高い項目は、左から右へ自然に入力できる順番に並べます。
こうした細かい調整によって、サブフォームは単なる一覧ではなく、業務入力に適した画面になります。
また、明細行が多くなる業務では、動作の速さにも注意が必要です。
サブフォームはメインフォームの表示に合わせて子データを読み込むので、子テーブルの件数が多い場合や、重いクエリをレコードソースにしている場合は、フォームの表示が遅くなることがあります。
必要な期間や状態で絞り込む、インデックスを適切に設定する、表示用のクエリを複雑にしすぎないといった対策が効果的です。
特に複数人でAccessを共有している環境では、表示速度だけでなく、同時編集時の競合にも気を配る必要があります。
サブフォームの完成度を高めるには、合計金額や明細件数の表示も検討するといいでしょう。
例えば、サブフォームのフッターに明細金額の合計を計算するテキストボックスを置いて、メインフォーム側にその値を表示すれば、伝票全体の金額を確認しながら入力できます。
さらに、商品IDをコンボボックスで選択できるようにしたり、数量や単価に入力チェックを設定したりすると、ミスの少ない画面になります。
Accessのサブフォームの作り方で大切なのは、親テーブルと子テーブルを同時入力できる形にするだけでなく、使う人が迷わず、正しいデータを登録できる画面に仕上げることです。
広告
