Access でリレーショナル データを操作する場合、多くの場合、同じフォームで複数のテーブルまたはクエリを表示する必要があります。 たとえば、あるテーブルの顧客データと、別のテーブルからの顧客注文情報を同時に表示できます。 サブフォームは簡単に作成でき、Access を使用すると簡単に作成できます。
目的に合ったトピックをクリックしてください
- サブフォームの概要
- サブフォームを作成または追加する
- フォーム ウィザードを使用してサブフォームを含むフォームを作成する
- サブフォーム ウィザードを使用して既存のフォームに 1 つ以上のサブフォームを追加する
- フォームに別のフォームをドラッグしてサブフォームを作成する
- デザイン ビューの新しいウィンドウでサブフォームを開く
- サブフォームの既定のビューを変更する
- サブフォームを作成せずにフォームに関連データを追加する
サブフォームの概要
サブフォームは、別のフォームに挿入されるフォームです。 プライマリ フォームはメイン フォームと呼ばれ、囲まれたフォームはサブフォームと呼ばれます。 フォーム/サブフォームの組み合わせは、階層形式、マスター/詳細フォーム、または親子フォームと呼ばれることもあります。
サブフォームは、一対多リレーションシップを持つテーブルまたはクエリのデータを表示する場合に特に適切に機能します。 この種類のリレーションシップでは、プライマリ テーブル内の各レコードの主キー値が、一致するフィールドの値または関連テーブル内の多数のレコードのフィールドと一致します。 たとえば、従業員データを表示するフォームと、各従業員の注文を表示するサブフォームを作成できます。 "社員" テーブルのデータはリレーションシップの "一" 側となります。 各従業員は複数の注文を持つことができますので、Orders テーブルのデータはリレーションシップの "多" 側です。
メイン フォームには、リレーションシップの "1" 側のデータが表示されます。
サブフォームには、リレーションシップの "多" 側からのデータが表示されます。
この種類のフォームのメイン フォームとサブフォームはリンクされているため、サブフォームには、メイン フォームの現在のレコードに関連するレコードだけが表示されます。 たとえば、メイン フォームに青木俊之さんの情報が表示されている場合、サブフォームには彼の受注だけが表示されます。 フォームとサブフォームのリンクが解除された場合、サブフォームには、Nancy の注文だけでなく、すべての注文が表示されます。
次の表では、サブフォームに関連する用語を定義します。 この記事の手順を使用すると、ほとんどの詳細が処理されますが、後で変更を加える必要がある場合は、バックグラウンドで何が起こっているのかを把握するのに役立ちます。
| 用語 | 定義 |
|---|---|
| サブフォーム コントロール | フォームにフォームを埋め込むコントロール。 サブフォーム コントロールは、データベース内の別のオブジェクト (別のフォーム、テーブル、またはクエリ) の "ビュー" と考えることができます。 サブフォーム コントロールには、コントロールに表示されるデータをメイン フォームのデータにリンクするためのプロパティがあります。 |
| "ソース オブジェクト" プロパティ | サブフォーム コントロールのプロパティで、コントロールに表示するオブジェクトを示します。 |
| データシート | スプレッドシートのような表形式によるデータの表示。 サブフォーム コントロールは、ソース オブジェクトがテーブルまたはクエリである場合、またはそのソース オブジェクトが Default View プロパティが Datasheet に設定されているフォームである場合にデータシートを表示します。 このようなケースでは、サブフォームはデータシートまたはサブデータシートと呼ばれることがあります。 |
| "リンク子フィールド" プロパティ | サブフォーム内のどのフィールドがメイン フォームにリンクされるかを指定するサブフォーム コントロールのプロパティ。 |
| "リンク親フィールド" プロパティ | メイン フォーム上のどのフィールドがサブフォームにリンクされるかを指定するサブフォーム コントロールのプロパティ。 |
注
- この記事の手順に従う前に、テーブルのリレーションシップを作成することをお勧めします。 テーブルのリレーションシップを作成しておくと、Access でサブフォームとメイン フォーム間にリンクが自動的に作成されます。 データベース内のテーブル間のリレーションシップを表示、追加、または変更するには、[ データベース ツール ] タブの [ リレーションシップ ] グループで [ リレーションシップ] をクリックします。
- サブフォーム コントロールにソース オブジェクトとしてフォームがある場合は、フォームに配置するフィールドが含まれます。 1 つのフォーム、連続フォーム、またはデータシートとして表示できます。 フォーム オブジェクトに基づくサブフォームの利点の 1 つは、
[Quantity] * [Unit price]などの計算フィールドをサブフォームに追加できることです。 - ソース オブジェクトがテーブルまたクエリとなるサブフォーム コントロールを作成して、データシートまたはピボット ビューをフォームに挿入できます。 詳細については、「サブフォームを作成せずにフォームに関連データを追加する」をご覧ください。
サブフォームを作成または追加する
次の表を使用して、状況に最もふさわしい手順を決定してください。
| シナリオ | 推奨される手順 |
|---|---|
| Access でメイン フォームとサブフォームの両方を作成し、サブフォームをメイン フォームにリンクします。 | フォーム ウィザードを使用してサブフォームを含むフォームを作成する |
| 既存のフォームをメイン フォームとして使用しますが、Access で新しいサブフォームを作成し、そのサブフォームをメイン フォームに追加します。 | サブフォーム ウィザードを使用して既存のフォームに 1 つ以上のサブフォームを追加する |
| 既存のフォームをメイン フォームとして使用し、1 つ以上の既存のフォームをそのフォームにサブフォームとして追加します。 | フォームに別のフォームをドラッグしてサブフォームを作成する |
フォーム ウィザードを使用してサブフォームを含むフォームを作成する
この手順では、フォーム ウィザードを使用して、新しいフォームとサブフォームを組み合わせた構成を作成します。 また、メイン フォームまたはサブフォームとして使用するフォームをまだ作成していない場合は、作業を開始する最も簡単な方法でもあります。
[作成] タブの [フォーム] グループで、[フォーム ウィザード] をクリックします。
ウィザードの最初のページで、[表/クエリ] ボックスの一覧からテーブルまたはクエリを選択します。 この例では、各従業員の注文をサブフォームに表示する Employees フォームを作成するには、[ テーブル: 従業員 ] (一対多リレーションシップの "1" 側) を選択します。
注
テーブルまたはクエリは好きな順序で選択できます。
テーブルまたはクエリからフォームで使用するフィールドをダブルクリックします。
ウィザードの同じページで、[表/クエリ] ボックスの一覧から、別のテーブルまたはクエリを選択します。 この例では、Orders テーブル (一対多リレーションシップの "多" 側) を選択します。
テーブルまたはクエリからフォームで使用するフィールドをダブルクリックします。
ウィザードを開始する前にリレーションシップを正しく設定したと仮定して、[ 次へ] をクリックすると、ウィザードは データを表示する方法 (つまり、テーブルまたはクエリ) を求めます。 一対多リレーションシップの "1" 側でテーブルを選択します。 この例では、[従業員] フォームを作成するには、[ 従業員] を選択します。 ウィザードには、フォームの小さな図が表示されます。 ページは次の図のようになります。
フォーム図の下部のボックスはサブフォームを表します。
注
ウィザードで [ データの表示方法] が表示されない場合は、選択したテーブルまたはクエリ間の 1 対多リレーションシップが検出されなかったことを意味します。 ウィザードは続行されますが、Access はフォームにサブフォームを追加しません。 続行する前に、[ キャンセル ] をクリックし、テーブルリレーションシップを調べることができます。
ウィザードのページの下部にある [サブフォームがあるフォーム] をクリックし、[次へ] をクリックします。
[サブフォームのレイアウトを指定してください] ページで、必要なレイアウト オプションをクリックし、[次へ] をクリックします。 どちらのレイアウト スタイルでも、サブフォーム データは行と列に配置されますが、表形式レイアウトではさらに多くのオプションが提供されます。 表形式のサブフォームには、色、グラフィック、およびその他の書式要素を追加できますが、データシートの場合は、テーブルのデータシート ビューと同様に簡素な形式になります。
ウィザードの次のページで、フォームの書式設定を選び、[次へ] をクリックします。 前のページで [表形式] を選んだ場合、選んだ書式設定はサブフォームにも適用されます。
ウィザードの最後のページで、フォームのタイトルを入力します。 入力したフォームおよびサブフォームのタイトルに基づいて、フォームの名前とサブフォームのラベルが決まります。
フォーム ビューでフォームを開いて情報を表示または入力するか、デザイン ビューでフォームを開いてデザインを変更できるようにするかを指定し、[完了] をクリックします 。 Access では、サブフォーム コントロールを含むメイン フォーム用とサブフォーム自体用の 2 つのフォームが作成されます。
サブフォーム ウィザードを使用して既存のフォームに 1 つ以上のサブフォームを追加する
この手順を使用して、1 つ以上のサブフォームを既存のフォームに追加します。 サブフォームごとに、Access で新しいフォームを作成するか、既存のフォームをサブフォームとして使用するかを選択できます。
- ナビゲーション ウィンドウで既存のフォームを右クリックし、[デザイン ビュー] をクリックします。
- [ フォーム デザイン ] タブの [ コントロール ] グループで、下矢印をクリックして コントロール ギャラリーを表示し、[ コントロール ウィザードの使用 ] が選択されていることを確認します。
- [ フォーム デザイン ] タブの [ コントロール ] グループで、[ サブフォーム/サブレポート ] ボタンをクリックします。
- サブフォームを配置するフォームをクリックします。
- ウィザードに表示される指示に従って操作します。 [完了] をクリックすると、フォームにサブフォーム コントロールが追加されます。 既存のフォームを使用せずに、新しいフォームを作成することを選択した場合、Access で新しいフォーム オブジェクトが作成されて、ナビゲーション ウィンドウにそのオブジェクトが追加されます。
フォームに別のフォームをドラッグしてサブフォームを作成する
既存のフォームをメイン フォームとして使用し、1 つ以上の既存のフォームをサブフォームとして追加する場合は、この手順を使用します。
- ナビゲーション ウィンドウで、メイン フォームとして使用するフォームを右クリックし、[レイアウト ビュー] をクリックします。
- サブフォームとして使用するフォームをナビゲーション ウィンドウからメイン フォームにドラッグします。 Access では、サブフォーム コントロールがメイン フォームに追加され、そのコントロールが、ナビゲーション ウィンドウからドラッグしたフォームにバインドされます。 また、データベースで定義されているリレーションシップに基づいて、メイン フォームへのサブフォームのリンクも試行されます。
- この手順を繰り返して、追加のサブフォームをメイン フォームに追加します。
- リンクの設定が成功したかどうかを確認するには、[ホーム] タブの [ビュー] グループで、[ビュー]、[フォーム ビュー] の順にクリックし、メイン フォームのレコード セレクターを使用して、レコード間を移動します。 各社員のサブフォームが正しくフィルター処理されている場合、手順は完了です。
前のテストが機能しない場合、Access はサブフォームをメイン フォームにリンクする方法を判断できず、サブフォーム コントロールの Link Child Fields プロパティと Link Master Fields プロパティは空白です。 これらのプロパティは、次の手順を使用して手動で設定する必要があります。
ナビゲーション ウィンドウでメイン フォームを右クリックし、[デザイン ビュー] をクリックします。
サブフォーム コントロールを 1 回クリックして選択します。
[プロパティ シート] 作業ウィンドウが表示されない場合は、 F4 キーを押して表示します。
プロパティ シートで、[データ] タブをクリックします。
Link Child Fieldsプロパティ ボックスの横にある [ビルド] ボタンをクリックします。
[ サブフォーム フィールド リンカー ] ダイアログ ボックスが表示されます。[親フィールド] ボックスと [子フィールド] ボックスの一覧から、フォームをリンクするフィールドを選択し、[OK] をクリックします。 使用するフィールドが不確かな場合は、[推奨] をクリックすると、Access によってリンク フィールドが判定されます。
ヒント
フォームのリンクに使用するフィールドが表示されない場合は、マスター フォームまたは子フォームのレコード ソースを編集して、リンク フィールドが含まれていることを確認する必要がある場合があります。 たとえば、フォームがクエリに基づく場合は、リンク フィールドがクエリ結果に必ず存在するようにします。
メイン フォームを保存した後でフォーム ビューに切り替え、フォームが期待どおりに動作することを確認します。
デザイン ビューの新しいウィンドウでサブフォームを開く
デザイン ビューでメイン フォームを操作している間にサブフォームにデザインの変更を加える場合は、サブフォームを独自のウィンドウで開くことができます。
- サブフォームをクリックして選びます。
- [ フォーム デザイン ] タブの [ ツール ] グループで、[ 新しいウィンドウ] で [サブフォーム] をクリックします。
サブフォームの既定のビューを変更する
サブフォームをフォームに追加すると、サブフォーム/サブレポート コントロールはサブフォームの Default View プロパティに従ってサブフォームを表示します。 このプロパティには、次の値を設定できます。
- 単票フォーム
- 帳票フォーム
- データシート
- 分割フォーム
サブフォームを初めて作成する場合、このプロパティは [連続フォーム ] または [単一フォーム] に設定される場合があります。 ただし、サブフォームの Default View プロパティを Datasheet に設定すると、サブフォームはメイン フォームにデータシートとして表示されます。
サブフォームの Default View プロパティを設定するには:
開いているすべてのオブジェクトを閉じます。
ナビゲーション ウィンドウでサブフォームを右クリックし、[デザイン ビュー] をクリックします。
プロパティ シートがまだ表示されていない場合は、 F4 キーを押して表示します。
プロパティ シートの上部にあるドロップダウン リストで、[フォーム] が選択されていることを確認します。
プロパティ シートの [書式] タブで、[既定のビュー] プロパティを、使用するビューに設定します。
注
使用するビューが一覧にない場合は、そのビューの
Allow...Viewプロパティが [はい] に設定されていることを確認します。 たとえば、フォームの既定のビューとして [データシート] を指定する場合は、[データシートビューの許可] プロパティが [はい] に設定されているか確認します。サブフォームを保存して閉じ、メイン フォームを開いて結果を確認します。
サブフォームを作成せずにフォームに関連データを追加する
関連データを表示するために、別のフォーム オブジェクトを作成する必要は常にありません。 たとえば、レイアウト ビューまたはデザイン ビューで作業している場合、ナビゲーション ウィンドウからテーブルまたはクエリをフォームにドラッグすると、Access ではそのオブジェクトのデータを表示するサブフォーム/サブレポート コントロールが作成されます。 オブジェクトの Default View プロパティによって、データの表示方法が決まります。 通常、これはデータシート ビューに設定されますが、テーブルまたはクエリの Default View プロパティを 単一フォーム、 分割フォーム、 または連続フォームに設定して、関連するデータをフォームに表示する柔軟性を高めることもできます。
注
テーブルまたはクエリの Default View プロパティを変更すると、ナビゲーション ウィンドウから開くか、サブフォーム/サブレポート コントロールで表示するかに関係なく、テーブルまたはクエリを開くたびに表示方法が決まります。 テーブルのビュー設定を変更すると、ナビゲーション ウィンドウからテーブルを開くときに混乱が生じることがあるため、テーブルの代わりにこのプロシージャのクエリを使用することをお勧めします。