Accessの利点がよくわからない。Excelより便利なの?という人は非常に多いです。下手にExcelがデータベース的使い方が出来るようになって来ている為、尚更Accessを勉強してみるものの、この両者の違いがよくわからず、メリットを感じられず、モチベーションがなくなり、Excelでいいやとなりがちです。

今回はそんな疑問に答えるべく、まず利点その1として「サブフォーム」というものをまとめてみました。薬剤師さん向けに作ってはいますが、一般的な内容なので、どなたでも利用可能だと思います。

今回利用するAccessファイル

Accessファイルの構成

テーブル構成

今回のAccessファイルは最も基本的なテーブルの正規化を行ってあります。これには2パターンありますが、今回はシンプルな方法を作ってみます。正規化についてはまた別のエントリーで詳しくまとめてみるとして、以下のようなテーブル構成になっています。

  • 病院マスタ – 親フォームの元になるテーブルです。
  • 医薬品データ – サブフォームの元になるテーブルです。親1に対して複数のデータが登録される事になります。
  • 病院タイプ – 親フォームの病院タイプのドロップダウンでだけ使うテーブルです。
  • 都道府県 – 親フォームの都道府県のドロップダウンでだけ使うテーブルです。

リレーションシップ

また、今回のサブフォームの利点をさらに得るために、リレーションシップを張ってあります。リレーションシップについてもまた、別のエントリーでまとめてみましょう。

  • 病院マスタ   1 ⇔ N   医薬品データ

図:病院マスタと医薬品データをつなげてみた

サブフォームを作り込む

テーブルを元にサブフォームを作る

親フォームを作る

親フォームは簡単です。今回は親になる「病院マスタ」を元に、フォームウィザードを使って適当に作ってしまいましょう。以下の手順で作成可能です。

  1. 作成タブのフォームウィザードをクリックします。
  2. テーブル/クエリでは、病院マスタを選択し、全レコードを選んで選択したフィールドへ登録します。
  3. 次へ進んだら今回は単票形式を選びます。
  4. フォーム名(病院名マスタ)を付けたら、完了をクリック
  5. テキストボックスなどが自動で生成されるので、フォームの上半分くらいの位置にレイアウトを組んであげます。

図:全フィールドを今回は使うので全部追加します。

図:単票形式で今回は作成します。

図:下を空けて、フォームパーツを上に配置してあげます。

サブフォームをつくる

さて、今回の主役サブフォームを作ります。その1では最も単純な、テーブルを元にしたフォームを作ります。以下の手順で作成し、作成後に親フォームにこのサブフォームを貼り付けます。データシートで作る事になりますが、フォームの配置デザインは意味がないので、適当に入ってればOKです。

  1. 作成タブのフォームウィザードをクリックします。
  2. テーブル/クエリでは、医薬品データテーブルを選択し、とりあえず、全部追加しておきます。
  3. 次へ進んだら今回はデータシートを選びます。表形式でも行けますが今回はこれで。
  4. フォーム名(病院名マスタ)を付けたら、完了をクリック
  5. テキストボックスなどが自動で生成されます。ID病院IDは自動で入力されるので、フォームから削っておきます。
  6. 親フォームである病院マスタフォームデザインビューで開きます。画面右下のアイコンをクリックでデザインビューになります。
  7. デザインタブの中のコントロールにて、サブフォーム/レポートというパーツをクリックします。
  8. 適当な大きさにドラッグする。サブフォームウィザードが開くので、作った医薬品データフォームを指定する。
  9. リンクするフィールドの指定では、今回は病院マスタ側はID、医薬品データ側は病院IDでつながってるので、独自に設定するを選ぶ。
  10. 親はID、サブフォームは病院IDをそれぞれ選んで完了。この作業はプロパティシート上でも、リンク親フィールド、リンク子フィールドでそれぞれ設定が可能です。

図:サブフォームもとりあえず全フィールドを追加

図:データシートを選ぶのがポイント

図:データシートの場合、デザイン配置は無意味なので適当でOK

図:赤枠のこれがサブフォームコントロール

図:デザインビューは非常によく使います

図:サブフォームウィザードでサブフォームを指定する

図:親と子それぞれ連結させるフィールドを選ぶ

入力用のコンボボックスを用意する

今回、都道府県とタイプについては、専用のテーブルを用意し、それぞれのフィールドは、文字列型ではなく数値型になっています。これは検索スピードを上げる為に行ってる正規化のうちの1つです。しかし、数値では人間の入力がしにくいので、コンボボックスにして、文字を選ぶと対応するIDが入るようにしてあげます。

  1. 都道府県のテキストボックスを右クリック⇒コントロールの種類で、コンボボックスを選びます。
  2. もう一度右クリックして、プロパティを開き、プロパティシートを開きます。
  3. 値集合ソースという項目の中にあるをクリック
  4. クエリ作成画面っぽいのが出ます。ここで、都道府県テーブルを追加。全てのフィールドを追加してあげます。
  5. 閉じるボタン⇒はいで、閉じます。
  6. 連結列はID列なので1を入力。1列目という意味です。
  7. 次にプロパティシートの列数を2にします。IDと都道府県名で2列ですね。
  8. 列幅では、ID列を0、都道府県名を8cmとする為、0;8と入力、Enterをします。セミコロンな点に注意。
  9. 同じような感じで、タイプについてもコンボボックス化しておくと良いでしょう。
  10. これでサブフォームの追加が完了しました。1つのフォームにいくつでも連結する形を作れるなら、サブフォームは追加可能です。

図:コンボボックス用のクエリ追加画面

図:入力しやすいコンボボックス化はよく使うテクニック

サブフォームのメリット

3次元以上のデータを一度に扱える

Excelは、2次元。つまり、縦と横の表でしか最大でも表現ができません。其のため、3つ目の要素となると、別のシートに記述する事になりますが、1度にこれらを連結した状態で表示できるわけじゃありません。

Accessの場合、今回のようなフォームを利用すると、親の病院マスタにぶら下がる形で、医薬品データといった3つ目の要素を表示させる事ができるのです(親マスタで縦横2次元を実現してますからね)。さらに、同じく病院マスタのIDと連結できるフィールドを持つ別のサブフォームがあれば、同一画面に4つ目、5つ目と加える事が可能です(通常はタブコントロールも合わせて使います)。

また、これらのフォームは実際にある程度入力して、下のほうにあるレコードバーで移動をすると、病院が変わる事に連動して、そのサブフォームの内容も変わるようになります。親と子がIDで連結している為です。また、サブフォームにデータをガシガシ入力すると、自動的にサブフォーム側のIDと親IDにはそれぞれ、連番と病院マスタ側のIDが入ってくれます。

入力者が意識せずとも、きちんと整備されたデータを紐つけた状態で入力が簡単にできるようになります。これがサブフォーム化の最大のメリットですね。Excelではできない芸当ですし、ここまで一切VBAを記述していません。

図:このレイアウトはAccessの全ての基本になります

連鎖更新・連鎖削除

今回、テーブル間でリレーションシップを貼りました。その際に連鎖更新・連鎖削除を付け加えてあります。この設定を施しておくと、以下のようなメリットがあります。

  1. フォーム上でレコードを削除すると、サブフォームのテーブルに於いて、同じIDを持つデータも一緒に削除してくれます。手動で削除する必要がありません。これもAccessを使うメリットですね。ゴミデータが残りません。
  2. また、病院マスタのIDを変更してみると(今回はオートナンバーなので変更できませんが)、これも連動してサブフォーム側のテーブルのデータのIDも連動して変更してくれます。変更忘れといったミスが防げます。

Excelではこれら連鎖更新、連鎖削除といったものがない為、基本人間が全部手直ししなければなりません。Accessではその必要がありません。マスタのデータを弄るだけで済みます。

関連リンク

共有してみる: