Accessでは、テーブルとフォームを1対1の関係で作ることが多いと思いますが、テーブル構造が同じ場合に、フォームをそれに合わせた分だけ作成することは、その後のメンテナンスを考えると業務量が増えて大変になります。そこで、1つのフォームから複数のテーブルを参照できる仕組みをVBAを用いて実装したいと思います。
サンプルテーブルの作成
今回は2つのサンプルテーブルとして、「Aテーブル」と「Bテーブル」を作成します。そして、それぞれのテーブル構造は次のようにし、サンプルデータを格納します。
■Aテーブル
フィールド名 | データ型 |
氏名_Aテーブル | 短いテキスト |
年齢_Aテーブル | 数値型 |
■Aテーブルのサンプルデータ
氏名_Aテーブル | 年齢_Aテーブル |
佐藤 A郎 | 50 |
渡辺 A子 | 33 |
■Bテーブル
フィールド名 | データ型 |
氏名_Bテーブル | 短いテキスト |
年齢_Bテーブル | 数値型 |
■Bテーブルのサンプルデータ
氏名_Bテーブル | 年齢_Bテーブル |
鈴木 B郎 | 47 |
山田 B子 | 22 |
ここで、注意していただきたい点は、AテーブルとBテーブルでそのテーブル構造が同じであり、格納しているデータの内容が同じであるという点です。
例えば、入庫と出庫の情報を別々のテーブルで保存する場合に、登録する内容はほぼほぼ同じになるため、このようなテクニックを使うことができます。
サンプルフォームの作成
次に、サンプルフォームを作成します。「テーブル切替フォーム」という名称のフォームを作成し、図1に示すように2つのテキストボックスと2つのコマンドボタンを配置します。テキストボックスの名称は「t_氏名」と「t_年齢」を、コマンドボタンの名称は「cmd_A」と「cmd_B」とします。
このフォームから先に作成した「Aテーブル」と「Bテーブル」を参照できるようにVBAで実装します。まず、「テーブル切替フォーム」を開いた際に、「Aテーブル」のデータが表示されるように設定をします。プロパティシート中「読み込み時」に[イベントプロシージャ]を設定し、以下のソースコードを記入します。
Private Sub Form_Load() 'レコードソースプロパティは参照するテーブルを設定する。 Me.RecordSource = "Aテーブル" 'コントロールソースはテーブル中のフィールドを設定する。 Me.t_氏名.ControlSource = "氏名Aテーブル" Me.t年齢.ControlSource = "年齢_Aテーブル" 'リクエリで画面を更新する。 Me.Requery End Sub
次に、各コマンドボタンを押すことで参照するテーブルを切り替えるようにVBAで実装します。内容は上述のコードとほとんど同じです。
まず、「cmd_A」のプロパティシートを開き、「クリック時」で[イベントプロシージャ]を設定し、以下のソースコードを記入します。
Private Sub cmd_A_Click() 'フォームのレコードソースにAテーブルを設定する。 Me.RecordSource = "Aテーブル" 'フォームの各テキストボックスに各フィールドを設定する。 Me.t_氏名.ControlSource = "氏名Aテーブル" Me.t年齢.ControlSource = "年齢_Aテーブル" '画面を更新する。 Me.Requery End Sub
同様に、「cmd_B」のプロパティシートを開き、「クリック時」で[イベントプロシージャ]を設定し、以下のソースコードを記入します。
Private Sub cmd_B_Click() 'フォームのレコードソースにBテーブルを設定する。 Me.RecordSource = "Bテーブル" 'フォームの各テキストボックスに各フィールドを設定する。 Me.t_氏名.ControlSource = "氏名Bテーブル" Me.t年齢.ControlSource = "年齢_Bテーブル" '画面を更新する。 Me.Requery End Sub
以上でフォームの作成は完了しました。
参照テーブルの切り替え確認
まずは、作成した「テーブル切替フォーム」をフォームビューで開きます。これにより、「読み込み時」におけるVBAコードがはたらきレコードソースには「Aテーブル」が、また各テキストボックスにはそれぞれに対応したAテーブル中のフィールドがセットされ、画面にはAテーブルの1レコード目が表示されます。
続いて、「cmd_B」のコマンドボタンをクリックすると、参照先のテーブルが「Bテーブル」となり、それに対応したレコードが表示されます。
この状態で、「cmd_A」をクリックすると図2の状態に戻ります。
このように、参照テーブルを切り替えることで1つのフォームで効率良くデータ入力を行えるようになります。
まとめ
今回は、1つのフォームから2つのテーブルを参照する方法を紹介しました。テーブル構造がほとんど同じで、1つのフォームで事足りるようでしたら、今回紹介した方法を用いることで、保守性を向上することができ、業務効率全体の改善を図ることもできます。ポイントは「RecordSource」プロパティと「ControlSource」プロパティを上手く使うところにあります。
この方法を上手く活用すれば、1つのフォームから複数のテーブルやクエリを参照することもできますので、用途に応じて使い分けていただければと思います。
スポンサーリンク
コメント