Accessテーブルにデータを追加する方法と重複を防ぐ手順

概要

この記事の結論
Accessのテーブルにデータを追加する方法は、1件ずつならフォームやデータシート、複数件なら追加クエリが基本です。自動化する場合はVBAからDAOなどでクエリを実行できます。追加処理は既存レコードの更新とは異なり、同じ処理を再実行すると重複することがあります。実行前に追加先と抽出件数を確認し、バックアップ、重複を防ぐキー、実行後の件数照合を用意してから進めましょう。

この記事でわかること

  • 1件追加と一括追加を使い分ける
  • 追加クエリを選択結果の確認から作る
  • INSERT INTOとDAOの基本を理解する
  • キー違反と再実行による重複を防ぐ

この記事の主な内容

  1. データ追加の方法を件数と運用で選ぶ
  2. フォームやテーブルから1件追加する
  3. 追加クエリで複数件を登録する
  4. INSERT INTOとDAOで追加を自動化する
  5. 重複登録と再実行の事故を防ぐ
  6. 追加できない原因と対処方法
  7. 実行前後の照合とまとめ
  8. よくある質問

想定読了時間:約12分~14分


データ追加の方法を件数と運用で選ぶ

Accessへ新しいデータを入れるときは、1件ずつ入力するのか、別の表から複数件を取り込むのかで方法を選びます。利用者が日常的に登録するなら入力フォーム、条件に一致した複数行を既存テーブルへ入れるなら追加クエリが基本です。
[参考1]
[参考2]

追加クエリとは、選んだデータを既存テーブルの新しいレコードとして登録するクエリです。レコードはテーブルの1行を意味します。既存行の内容を変える更新クエリや、新しいテーブルを作るテーブル作成クエリとは役割が異なります。

方法向く場面注意すること
入力フォーム担当者が1件ずつ登録入力チェックと保存の動作を設計
テーブルのデータシート検証や少量の直接入力重要な表への誤入力を防ぐ
追加クエリ条件に合うデータの一括追加抽出件数とフィールド対応を確認
Excel・CSV取込外部ファイルの登録取込用テーブルで型と重複を確認
VBAとDAOなど決まった処理の自動実行パラメーター、エラー処理、結果記録

VBAで追加するためにADOだけが必須というわけではありません。AccessではDAOのQueryDefやDatabaseを使って追加クエリを実行する方法もあります。データの抽出や一括登録をSQLへ任せ、VBAは実行制御や検証を担当すると、処理の役割を整理しやすくなります。

[参考4]
[参考5]

手入力、複数件追加、自動化で使う方法を選ぶ図

追加と更新を取り違えない

顧客の住所を変更したい場合、顧客テーブルへ同じ顧客をもう1件追加するのではなく、対象の既存行を更新します。追加は「新しい業務上の対象が増えた」場合の処理です。新規か既存かの判定に使うキーを決めておかないと、同じ相手を繰り返し登録する原因になります。

オートナンバー型の主キーが付いていれば、同じ商品コードでも別IDで登録される設計があります。主キーが重複しないことと、業務データが重複していないことは別です。商品コードなど、業務上重複を許さない項目にも適切な一意制約を設けます。

新しい行を作る追加と既存行の値を変える更新の違い

フォームやテーブルから1件追加する

フォームまたはテーブルのデータシートを開き、新規レコードへ移動して値を入力します。画面下部の新規レコードボタンや「ホーム」の「新規」を利用できます。行選択部分のアスタリスクは新しいレコードの目印になります。
[参考1]

  1. 入力対象のテーブルまたはフォームを開きます。
  2. 新規レコードへ移動します。
  3. 必須項目を入力し、Tabキーで次の項目へ進みます。
  4. Shift+Enterで保存するか、別レコードへ移動して保存します。
  5. 追加したキーを使って検索し、内容を確認します。

フォームやテーブルでは、別レコードへの移動や画面を閉じる操作でも保存が行われます。「保存ボタンを押していないので登録されていない」と決め付けないでください。利用者向けの画面では、どの操作で登録されるかを明示し、取消方法も合わせて説明します。
[参考1]

新規行へ移動できない場合

フォームの「追加の許可」、レコードソースの更新可能性、保存先への権限を確認します。集計クエリなど更新できないデータ元を使っている場合、画面に項目を表示できても新規登録はできません。リンクテーブルなら接続先の権限やキーの識別も関係します。

なお、フォームの「データ入力」を「はい」にすると、新規入力用として既存行を表示しない動作になります。既存データが消えたわけではありません。入力専用にしたいのか、過去の登録内容も編集したいのかに合わせて設定を選びます。


追加クエリで複数件を登録する

追加クエリは、先に選択クエリで対象を確認してから作ります。追加は通常の「元に戻す」で取り消せないため、最初から本番表へ実行して試さないことが重要です。分割データベースでは、画面ファイルだけでなく実データ側のバックアップを取ります。
[参考2]

練習するテーブルを用意する

ここでは商品取込用テーブルW_商品取込から、商品マスターM_商品へ登録する説明用の例を使います。既存システムで使用する場合は、実際の列名、型、必須項目、一意キーへ合わせてください。

テーブルフィールド設定例
M_商品商品IDオートナンバー型・主キー
M_商品商品コード短いテキスト20文字・必須・重複なし
M_商品商品名短いテキスト100文字・必須
W_商品取込商品コード短いテキスト20文字
W_商品取込商品名短いテキスト100文字

CSVから取り込んだコードが数値として解釈されると、先頭ゼロが失われることがあります。取込後に型だけをテキストへ変えても失った情報が戻るとは限りません。コードの型を決め、元ファイルと取込結果を照合してから追加へ進みます。

デザインビューで作成する手順

  1. 「作成」からクエリデザインを開き、W_商品取込を追加します。
  2. 商品コードと商品名をグリッドへ配置し、対象条件を設定します。
  3. データシートビューで行数、空欄、重複、値の内容を確認します。
  4. デザインビューへ戻り、クエリの種類を「追加」に変更します。
  5. 追加先をM_商品にし、「レコードの追加」行で列を対応付けます。
  6. バックアップと件数を確認して実行し、登録結果を照合します。

実行前のデータシート表示は対象確認であり、追加そのものではありません。逆に、追加クエリを実行すれば新しい行が登録されます。確認のために何度も実行することを避け、クエリ名にも「Q_商品追加」など処理内容が分かる名前を付けます。

選択結果を確認してから追加先を設定し実行後照合する順序

追加先の列は明示する

商品IDを追加先で自動採番する場合は、通常、追加する列から商品IDを除きます。別システムのIDをそのまま保持する移行では考え方が変わるため、重複や参照関係を別途検証します。自動採番の番号が連続することは前提にしません。
[参考3]

追加元追加先確認点
商品コード商品コード文字列、桁数、未入力、重複
商品名商品名文字列、最大文字数、必須条件
対応なし商品IDこの例では追加先で自動採番

列名が同じでも型や桁数が同じとは限りません。また、追加対象に含めなかった必須項目へ既定値がなく、Nullも許されなければエラーになります。「一部の列だけを追加できる」は「残りの列の条件を無視できる」という意味ではありません。

追加元と追加先の列の対応、型、必須項目を確認する図

INSERT INTOとDAOで追加を自動化する

SQLで1件追加するにはINSERT INTOとVALUESを使います。複数件を別表から追加する場合はINSERT INTOとSELECTを組み合わせます。列の並びで値が対応するため、追加先の列名を省略せずに書くと確認しやすくなります。
[参考3]

1件追加と複数件追加のSQL

INSERT INTO [M_商品] ([商品コード], [商品名])
VALUES (‘P001’, ‘コピー用紙 A4’);

この例は1件の追加です。既にP001がある状態で商品コードに一意制約があれば、同じ内容を再実行しても追加できません。次の複数件追加例も、重複や未入力を検査済みの練習用データに対して使います。

INSERT INTO [M_商品] ([商品コード], [商品名])
SELECT [商品コード], [商品名]
FROM [W_商品取込];

画面の入力値はパラメーターで渡す

VBAで利用者の入力をSQL文字列へ直接連結すると、アポストロフィを含む商品名や日付の表現で問題が起きやすくなります。値はパラメーターで渡し、SQLの構造と入力値を分ける方法が扱いやすくなります。以下はDAOを使う説明用の関数です。
[参考4]
[参考5]

Public Function AddProduct(ByVal code As String, _
                           ByVal productName As String) As Long
    On Error GoTo ErrHandler
    Dim db As DAO.Database
    Dim qd As DAO.QueryDef
    Dim errNo As Long
    Dim errText As String
    If Len(Trim$(code)) = 0 Or Len(code) > 20 Then
        Err.Raise vbObjectError + 1001, , “商品コードを確認してください。”
    End If
    If Len(Trim$(productName)) = 0 Or Len(productName) > 100 Then
        Err.Raise vbObjectError + 1002, , “商品名を確認してください。”
    End If
    Set db = CurrentDb
    Set qd = db.CreateQueryDef(“”, _
        “PARAMETERS pCode Text(20), pName Text(100); ” & _
        “INSERT INTO [M_商品] ([商品コード], [商品名]) ” & _
        “VALUES ([pCode], [pName]);”)
    qd.Parameters(“pCode”) = code
    qd.Parameters(“pName”) = productName
    qd.Execute dbFailOnError
    AddProduct = qd.RecordsAffected
    qd.Close
    Set qd = Nothing
    Set db = Nothing
    Exit Function
ErrHandler:
    errNo = Err.Number
    errText = Err.Description
    On Error Resume Next
    If Not qd Is Nothing Then qd.Close
    Set qd = Nothing
    Set db = Nothing
    On Error GoTo 0
    Err.Raise errNo, “AddProduct”, errText
End Function

標準モジュールへ置き、DAOの型が認識される参照設定を確認して使います。戻り値は追加された件数です。呼び出すボタン側でもエラーを受け取り、成功した場合だけ完了を表示します。例外を無視して「登録しました」と表示する処理にはしないでください。

dbFailOnErrorはエラー時の失敗を扱うためのオプションですが、複数の独立した処理全体を自動的に1つへまとめるものではありません。ヘッダーと明細などをまとめて確定する場合は、対象DBのトランザクション対応を確認し、開始・確定・取消の単位を設計します。本コードは単一の追加文の例です。


重複登録と再実行の事故を防ぐ

重複対策は、取込元の重複、追加済みデータとの重複、同時実行の3つを分けます。追加先にないコードだけ選ぶ条件を付けても、取込ファイル自体に同じコードが2行あれば、それだけで完全な対策にはなりません。

追加済みのキーを除くSQL例

INSERT INTO [M_商品] ([商品コード], [商品名])
SELECT S.[商品コード], S.[商品名]
FROM [W_商品取込] AS S
WHERE S.[商品コード] Is Not Null
  AND NOT EXISTS
      (SELECT * FROM [M_商品] AS T
       WHERE T.[商品コード] = S.[商品コード]);

この例は、既に登録された商品コードを候補から除外します。追加先の商品コードには重複なしのインデックスを設定し、取込元についても事前に同じコードの件数を確認します。Nullを除く条件だけでは空文字や空白のみの文字列は除けないため、取込検査で別に確認してください。

商品名が違う同一コードの2行がある場合、どちらかを自動的に選ぶのではなく、元データの確認対象へ戻します。SELECT DISTINCTだけでは、コードが同じで名称が違う行を一つへ確定できません。同時実行時の重複も、抽出条件に加えて一意制約で防ぎます。

取込元の重複、追加済みキー、一意制約を確認する考え方

失敗したときにすぐ再実行しない

エラー後は、どこまで登録されたかを先に確認します。画面の警告、DAOの単一実行、複数処理の組み合わせでは結果の扱いが異なります。取込回を識別する番号や登録キーの記録があれば、完了した行と未登録の行を分けて判断できます。

データ追加と取込処理の改善でお困りの方へ

検証用コピーでの確認が難しい場合や、複数の画面・外部連携へ影響する場合は、Accessの教科書のお問い合わせ窓口へご相談ください。現在の構成、困っている操作、変更したい内容を整理すると、確認すべき範囲を伝えやすくなります。


追加できない原因と対処方法

追加エラーは、型変換、キー違反、必須・入力規則、ロックや権限などに分けて調べます。警告を非表示にして通すのではなく、条件を満たしていない行を特定して修正してください。主キーや参照整合性を外して無理に登録する方法は、後の不整合につながります。

原因例確認・対処
データ型や桁数数値欄に文字、長すぎる文字列元の値と追加先定義を比較
必須項目商品名がNull未入力行を抽出し補正
一意キーの重複商品コードが登録済み追加か更新かを判断
参照整合性存在しない顧客IDを明細へ追加親テーブルの登録を確認
更新不可のクエリ集計結果へ追加しようとする書き込む実テーブルを確認
ロック・権限他処理の更新中、接続先に権限なし実行タイミングと権限を確認
信頼・無効モードアクションクエリが停止する出所を確認し適切な信頼設定で実行

エラー行の原因は複数ある場合があります。まず少量の代表データで正常系と異常系を確認し、件数を増やします。個人情報を含む取込データをそのまま他者へ渡すのではなく、原因が再現する最小限のサンプルへ置き換えると確認もしやすくなります。

データ型、必須入力、一意キー、参照整合性を確認する図

実行前後の照合とまとめ

追加処理は「エラーメッセージが出なかった」だけで完了にしません。予定件数、実際の追加件数、追加されたキー、除外した件数と理由を確認します。複数人が同時登録する環境では、テーブル全体の件数差だけで今回の処理を判断しないでください。

記録項目記入例目的
処理日時・取込回2026-10-12 午前の1回目処理を特定する
取込元件数100件元データと照合
既存として除外15件重複を追加しなかった理由
不適合として保留2件修正対象を把握
追加予定・実績83件・83件漏れを検出
追加したキー対象コードの一覧再実行や切り戻しを判断

例の数値は説明用です。業務では追加対象を識別できるキーを残し、再実行が必要な場合も同じ処理を無条件に繰り返さないようにします。1件入力はフォーム、一括追加はクエリ、自動化はVBAによる制御を組み合わせ、データの条件と確認手順を整えて運用しましょう

追加予定件数、実行件数、登録キー、エラーを記録する項目

よくある質問

通常の元に戻す操作で取り消すことはできません。実行前に追加先のバックアップを取り、対象となる行を選択クエリで確認してください。誤って追加した場合は、追加したキーや取込回の記録を基に対象を特定し、修正または復元を判断します。実行後に他の利用者が新しいデータを登録している場合、古いバックアップへ丸ごと戻すとそのデータを失う可能性があります。復旧対象と変更後のデータを分けて考えることが必要です。

ADOに限定されません。AccessではDAOを使い、保存済みの追加クエリやパラメーター付きQueryDefを実行する方法があります。1行ずつの処理が必要ならRecordsetを使う方法もありますが、同じ条件の複数行を追加するならSQLでまとめて処理できるかを先に検討します。選ぶ基準は既存の構成、接続先、必要な処理です。VBAは入力チェック、実行制御、エラー処理、結果記録に使い、役割を整理すると保守しやすくなります。

追加先で新しいIDを採番させる場合は、通常はオートナンバー列を追加対象から外します。商品コードや商品名など必要な列だけを指定してください。旧システムのIDを保持する移行では明示的に値を追加する場合もありますが、重複や関連テーブルとの整合性を検証する別の作業になります。また、オートナンバーが連続していることを業務上の条件にしないでください。取消や失敗などで欠番が生じても、直ちにデータ欠落とは限りません。

できますが、重複判定に使うキーを決める必要があります。商品なら商品コード、伝票なら伝票番号と明細番号の組み合わせなど、業務上同一と判断できる値を使います。追加済みのキーを抽出対象から除く処理に加え、追加先にも一意制約を設けます。さらに取込元ファイル内の重複を検査してください。途中失敗した後の再実行では、処理回や登録済みキーの記録を確認し、成功した行を無条件に再登録しないことが重要です。

項目や型が合う場合でも、定期取込では一度取込用テーブルへ入れて検査する方法が扱いやすくなります。先頭ゼロ、日付、空白、桁数、重複、必須項目を確認し、不適合行を分けてから本番へ追加します。取込ウィザードで既存テーブルへ追加する場合も、列の対応や定義を事前に確認してください。特に型の自動判定へ任せると、コードが数値になるなどの違いが生じるため、元ファイルと取込結果の照合が欠かせません。

抽出条件による除外、登録済みキー、必須項目の不足、型変換、参照整合性などを順に確認します。追加前の選択結果の件数と、実行時の警告やエラー、追加されたキーを照合すると原因を絞れます。VBAのExecuteでは、同じQueryDefやDatabaseオブジェクトのRecordsAffectedで処理件数を取得できます。ただし、テーブル全体の増減だけでは他の利用者の更新が混ざる場合があります。今回の対象をキーや処理回で識別してください。

データ追加と取込処理の改善でお困りの方へ

検証用コピーでの確認が難しい場合や、複数の画面・外部連携へ影響する場合は、Accessの教科書のお問い合わせ窓口へご相談ください。現在の構成、困っている操作、変更したい内容を整理すると、確認すべき範囲を伝えやすくなります。

関連記事

Accessのテーブルとは

Accessのクエリとは

データ入力用フォームの作成

リンクテーブルの作成


参考情報

参考1 Microsoft Support|レコードの追加と編集
https://support.microsoft.com/ja-jp/access/ways-to-add-edit-and-delete-records

参考2 Microsoft Support|追加クエリ
https://support.microsoft.com/en-us/access/add-records-to-a-table-by-using-an-append-query

参考3 Microsoft Learn|INSERT INTO
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql

参考4 Microsoft Learn|QueryDef.Execute
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/querydef-execute-method-dao

参考5 Microsoft Learn|Parameters
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/parameters-collection-dao

TOP