非連結フォームから追加クエリでテーブル登録する作り方

このシステムでは、新規登録フォームの多くを非連結フォーム(レコードソースを持たないフォーム)で作成しています。テーブルに直接連結したフォームだと、複数人が同時に使用した際にレコードのロックによる排他的エラーが発生しやすくなるためです。20台近くが同時接続するこのシステムでは、フォームをテーブルから切り離しておくことが安定稼働の前提になっています。その代わり、入力された内容を自分でテーブルに書き込む処理が別途必要になり、その役割を担うのが「追加クエリ」です。

非連結フォームと追加クエリの関係

連結フォームと非連結フォームの違い

項目 連結フォーム 非連結フォーム
レコードソース テーブル・クエリに直結 なし(VBAやマクロで制御)
複数人同時使用時の排他エラー 発生しやすい(レコードロック) 発生しない
テーブルへの書き込み 自動(フォーム操作がそのまま反映) 追加クエリ・更新クエリなど別途必要
向いている用途 少人数・単独利用の単票フォーム 20台規模で同時接続する業務システム

ここでは資材マスタ新規登録(F60資材新規)を例に、非連結フォームの内容を追加クエリでテーブルへ書き込む作り方を手順化して解説します。

資材新規登録フォーム

資材マスタ新規登録フォーム(F60資材新規)。ここに入力された内容をT60資材Mへ書き込む追加クエリを作成する

手打ち入力のリスクとコピペ方式のメリット

追加クエリでは、フォームに入力された値をテーブルへ書き込むために、各フィールドの抽出条件欄に「そのフォームのどのコントロールを参照するか」という指定を1つずつ設定していきます(具体的な式の形は次章で実際に組み立てながら説明します)。この指定を毎回キーボードで手入力する方式と、候補リストからの選択とコピペで組み立てる方式とでは、ミスの起こりやすさが大きく変わります。両者の違いを整理すると次のとおりです。

手打ち方式とコピペ方式の比較

項目 手打ち方式 コピペ方式
コントロール名の指定方法 キーボードで直接入力 候補リストから選択
綴りミス 起こりうる(実行時まで気づきにくい) 起こらない(存在しない名前を選べない)
レコードの追加欄との対応 自分で目視して選ぶ必要がある テーブル追加時に自動で並ぶため対応済み
フィールド数が多い場合の負担 増える 変わらない(同じ操作の繰り返し)
作業内容 都度、式を組み立てる 貼り付け→バックスペース→候補選択の繰り返し

このように、コピペ方式はコントロール名を一切手入力しないため綴りミスが原理的に起こらず、フィールド欄も自動対応済みのため目視確認の負担も減らせます。以降ではこのコピペ方式による具体的な作り方を手順化して解説します。

追加クエリの土台を作る

まずは通常の選択クエリとして土台を作ります。ここで全フィールドを一度追加しておくのがポイントで、後の「抽出条件のコピペ」工程をスムーズに進めるための下準備になります。

① テーブルを選択クエリのクエリデザインで追加する

「作成」タブの「クエリデザイン」から新規クエリを開くと、テーブルの追加ダイアログが表示されます。ここで書き込み先のテーブル(本例ではT60資材M)を選択します。

② 全フィールドをフィールド欄に追加する

テーブルペインの先頭「*」ではなく、個別のフィールドをすべてドラッグ(またはダブルクリック)してフィールド欄に並べます。この段階ではまだ選択クエリの状態です。

T60資材Mの全フィールドをフィールド欄に追加した状態

③ 追加クエリに変更し、追加先テーブルを指定する

「クエリの種類」から「追加」を選ぶと追加ダイアログが表示されるので、追加先テーブル名にも同じテーブル(T60資材M)を指定します。ここで初めて選択クエリが追加クエリに変わります。

リボンの「追加」をクリックし、追加先テーブル名にT60資材Mを指定する

④ レコードの追加欄への自動反映を確認する

追加クエリに変換すると、グリッドに「レコードの追加」の行が現れ、フィールド欄と同名のフィールドが自動的に並びます。この対応関係を自分で選び直す必要はありません。

追加クエリへの変換直後、レコードの追加欄に自動でフィールド名が入る

⑤ フォームにないフィールドを削除する

新規登録フォームに存在しない項目(IDや在庫関連の自動採番・自動更新フィールドなど)は、この時点でフィールド欄から削除しておきます。フォームのコントロール一覧と見比べながら、必要なフィールドだけを残します。

フォームに存在するコントロールに対応するフィールドだけを残した状態

抽出条件のコピペで式を量産する

土台が整ったら、各フィールドの抽出条件欄に[Forms]!から始まる式を1つずつ設定していきます。ここが本記事の核心部分で、候補リストからの選択とコピペだけで全フィールド分の式を組み立てます。

① 抽出条件にフォーム名までの候補を表示させる

いずれかのフィールドの抽出条件欄に[Forms]!と入力すると、開いているフォームの候補リストが表示されます。続けてフォーム名の一部(本例では「f60」)まで入力すると候補が絞り込まれるので、該当するフォーム(F60資材新規)を選択します。

[Forms]!に続けてf60まで入力すると候補が絞り込まれ、F60資材新規を選択できる

② 続けてコントロール名の候補を表示させる

フォーム名のあとにもう一度「!」を入力すると、今度はそのフォームに配置されているコントロールの候補リストが表示されます。ここでフィールド名と同名のコントロールを選択します。

!を入力するとコントロール候補が表示されるので、フィールド名と同名のものを選ぶ

③ 完成した式を切り取り、フィールド欄へ貼り付ける

これで[Forms]![F60資材新規]![所属部署コード]のような式が完成します。この文字列を切り取り(Ctrl+X)、対応するフィールド欄の抽出条件から式へ貼り付けると、「式1:[Forms]!…」という形でそのフィールド分が完成します。

抽出条件パスが完成した状態。この文字列を切り取ってフィールド欄へ移す

フィールド欄へ貼り付けた結果、式1として1フィールド分が完成する

④ 隣のフィールドへ移り、バックスペースで候補を再表示させる

次のフィールドの抽出条件欄に、先ほどと同じ式をそのまま貼り付けます。そのうえでバックスペースキーを押し、[Forms]![F60資材新規]!の直後まで文字を削除すると、再びコントロールの候補リストが表示されます。ここから該当するコントロールを選び直すだけで、次のフィールド分が完成します。

隣のフィールドの抽出条件欄に、同じ式をそのまま貼り付ける

!の直後までバックスペースで削除すると候補リストが再表示される。該当するコントロールを選択する

この「貼り付け→バックスペースで削除→候補から選択」を繰り返すことで、追加すべきフィールドの数だけ式を量産できます。コントロール名を手入力する工程が一切ないため、綴りミスが原理的に起こりません。

フォーム名・コントロール名のどちらも手入力せず候補リストから選ぶこの方法なら、綴りミスや対応漏れが起こりにくく、フィールド数の多いテーブルでも安心して追加クエリを組み立てられます。「貼り付け→バックスペースで!の直後まで削除→候補から選択」という単純な繰り返し作業に落とし込めるのが最大のメリットです。

フォームに存在しないフィールドの扱い

テーブルには存在するがフォーム上にコントロールがないフィールドについては、状況に応じて次の2通りで対応します。

  • YES/NO型のフィールド(取消フラグなど):テーブル側のフィールドプロパティで既定値をFalseに設定し、追加クエリのフィールド欄からは削除しておく
  • 区分値を持つフィールド(同一フォームを受注用・仕入先用で使い分け、登録元によって1・2などの固定値を書き分けたい場合など):該当フィールドの抽出条件(または値の欄)に式10:1のように固定値をクエリ側で直接指定する

前者はテーブルの規定値に任せ、後者はクエリの式で制御する、という使い分けです。

最後に必ずテーブルを削除する

すべてのフィールドを式に変換し終えたら、最後にクエリデザイン上のテーブルペインで対象テーブルを右クリックし、「テーブルの削除」を実行します。この順序を守ることが重要です。

テーブルペインを右クリックし「テーブルの削除(E)」を実行する。フィールド欄には式1〜式10が並び、すべて[Forms]!を参照する式になっている

テーブル削除の手順

クエリデザイングリッドの各列には、内部的に「どのテーブルの何というフィールドか」という参照情報が結び付いています。テーブルを削除すると、Accessはそのテーブルを参照している列を自動的にグリッドから消去します。まだ式に変換していない列(テーブルのフィールドのままの列)はこの削除に巻き込まれて消えてしまいますが、すでに[Forms]!...の式に変換済みの列はFormsだけを参照する独立した計算フィールドになっているため、テーブル削除の影響を受けません。

つまり、全フィールドを式に変換し終える前にテーブルを削除すると、レコードの追加欄からフィールドが消えてしまいます。「最後にテーブルを削除する」という順序は、この仕組みを踏まえた必須の手順です。

追加クエリの完成形

まとめ

非連結フォームからの追加クエリ作成は、次の流れで整理できます。

  1. 選択クエリでテーブルを追加し、全フィールドをフィールド欄に並べる
  2. 追加クエリに変換し、追加先にも同じテーブルを指定する(レコードの追加欄は自動反映)
  3. フォームにないフィールドを削除する
  4. 抽出条件に[Forms]!から候補選択でフォーム名・コントロール名を指定し、式を完成させる
  5. 完成した式をコピペしながら、他のフィールドにも同じ手順を繰り返す
  6. フォームにないフィールドはテーブルの規定値、またはクエリの式で個別に値を制御する
  7. 最後にテーブルペインからテーブルを削除する

手入力が必要な箇所は実質ゼロで、候補選択とコピペだけで完成させられるのがこの作り方の特徴です。

本サイトではマクロを用いた構築手順を中心に紹介していますが、決してマクロを唯一の正解として推奨しているわけではありません。VBAが扱える環境であれば、より多彩で柔軟なプログラムが組めるVBAでの構築をむしろ推奨したいと考えています。

ここでマクロという選択肢を提示しているのは、VBAにハードルを感じている方への「もう一つの入り口」として、また将来的な後継者への引き継ぎ負荷を抑えるという実務上のメリットを考慮してのことです。設計の考え方の一つとして、状況に合わせて活用してください。