Access
アイキャッチ 猫

今回は、Accessで連番の振り方をいくつかご紹介します。

EXCELから連番をコピペする

まず初めに非常にアナログですが、簡単で確実な方法です。
後述するクエリ(DCount関数)で連番を振る方法では件数が多い場合に時間がかかりすぎるため、あえてこのような方法をとっている方もいます。

説明するまでもないかもしれませんが、このように連番用にEXCELを作り、
コピーしてAccessのテーブルに貼り付けます。

Excel連番

メリット:
・Accessの知識が必要ないため、不慣れでも連番を振ることができる。
クエリの順番通りに連番が振れる。

デメリット:
手作業のためミスが発生する可能性がある。
・テーブル内容に変更があった場合、対応できない。

使用用途:
一度しか処理せず、再度連番を振る必要ない場合 等

なお、件数が多すぎるとお使いのパソコンやAccessのバージョンによってはペーストする際にエラーがでるようですので、ご注意ください。

テーブル定義でオートナンバー型を使う

テーブルをデザインビューで開き、項目のデータ型を、「オートナンバー型」とするだけなので、最も手軽な振り方です。

Access連番 オートナンバー

このようにデータ型を「オートナンバー型」にするだけで、入力する際、以下のように自動で連番が入力されていきます。

Access連番 オートナンバー

オートナンバー型を使うメリットデメリットですが、以下が考えられます。

メリット:
・手軽で分かりやすい。
一意(ユニーク)な連番が振られるため、万が一にも重複の心配がない。
・手動で変更できないため、うっかり違う値に変更してしまうことがない

デメリット:
・連番が振られた後は変更ができない
・レコードを削除した際に、抜け番が発生する。
・レコード追加時にしか連番が振れない。

この中でも特に、デメリットの一度削除すると抜け番が発生するところが注意点かと思います。
例えば以下のように、レコードを一度入力した後、間違えに気づき修正した場合、抜け番が発生してしまいます。

Access連番 オートナンバー
Access連番 オートナンバー

もちろん連番の変更をしようとしても、以下のエラーが出てしまい、変更もできません。

Access連番 オートナンバー

そんな良くも悪くも融通が利かないオートナンバー型ですが、以下のような使用用途が考えられます。

使用用途:
・絶対に連番が変わってしまうのを避けたい場合
・欠番ができても問題ない場合 等
例)Access内部で使用するデータ紐付け用の主キーID

なお、テーブルをデザインビューで開き、項目の「切り取り」→同じ箇所に「行の挿入」→「貼り付け」をすることで、連番の振り直し自体は可能です。
※1から連番が再度振られるため、連番を振りなおしたことによる影響範囲を検討の上、行ってください。

Dcount関数を使う

クエリで連番を振る際に使用するのがDCount関数を使った方法です。
DCount関数は元々指定した範囲のレコード数をカウントする関数ですが、以下のように指定することで、連番を振ることもできます。

DCount(“*”,”テーブル名”,”[基準項目]<=” & [テーブル名]![基準項目])

指定内容の説明です。
引数1:レコード数をカウント
引数2:テーブル名またはクエリ名
引数3:条件。現在のレコードの[基準項目]以下の[基準項目]の数をカウント

これだけでは分かりにくいので、例を使って見てみましょう。

Access連番 DCount関数
Access連番 DCount関数

まず、基準項目を「社員NO」として連番を振るため、データ型は比較可能な「数値型」としています。

Access連番 DCount関数

連番: DCount(“*”,”T_クエリ”,”[社員NO]<=” & [T_クエリ]![社員NO])

クエリはこのようにDCount関数を使い、設定しました。

結果は以下のとおりです。

Dcount関数を使うメリットデメリット・使用用途ですが、以下が考えられます。

メリット:
・テーブル内容に変更があっても、自動で値が振られ抜け番が発生しない
一意(ユニーク)な連番が振られるため、重複の心配がない。

デメリット:
・元々Dcountは別用途で作られた関数のため、不慣れなユーザには判読しづらい。
・基準項目(数値項目等、比較可能な項目)が必要。
・氏名順等、特別な並び順にしたい場合、連番を振ることができない
レコード件数が多いと、とにかく重い!
(レコードごとに毎度、基準項目以下のレコードをカウントしにいくため)

使用用途:
データ入力後に連番が振りたい場合 等

VBAで連番用関数を作成する

少し難易度は上がりますが、VBAで連番用関数を作成し、連番を振る方法です。
VBAを使用し、ユーザ定義関数を作成し、マクロから呼び出します。

VBAについては以下を作成しましたので、コピーしてお使いください。

' InsertRenban(String,String)
' 連番挿入関数
' P1:クエリ名(テーブル名でも可能だが、非推奨)
' P2:連番用項目名
Public Function InsertRenban(TargetName As String, TargetField As String)
    Dim rsTarget As Recordset
    Set rsTarget = CurrentDb.OpenRecordset(TargetName, dbOpenDynaset)
    
    Dim iRecordCnt As Long
    
    'レコード毎に"+1"し、終端まで読み込み
    Do Until rsTarget.EOF
        lRecordCnt = lRecordCnt + 1
        
        rsTarget.Edit
        rsTarget.Fields(TargetField) = lRecordCnt
        rsTarget.Update
        rsTarget.MoveNext
    Loop
End Function

では、例を使ってご紹介します。
まずテーブルは以下です。新しく連番をつける場合は、テーブル定義で「連番」項目を追加してください。

VBA
VBA

次にクエリを用意し、並び順を確定させます。
※テーブルの順はAccessが独自にソートしているだけなので、今回のVBAを使い連番を振る場合、この工程が重要です。

実行マクロについては、以下としました。

VBA

InsertRenban(“Q_定義関数”,”連番”)

実行結果は以下となりました。

VBA

メリットデメリット・使用用途については以下となります。
個人的には、クエリを使うのであればこちらをおすすめします。

メリット:
・テーブル内容に変更があっても、自動で値が振られ抜け番が発生しない
一意(ユニーク)な連番が振られるため、重複の心配がない。
クエリに比べ、レコード件数が多くても処理が速い
・連番はクエリの並び順に左右されるため、基準項目は不要

デメリット:
・マクロ、VBAを使うのでAccess初心者には取っつきにくい。

使用用途:
データ入力後に連番が振りたい場合 等

まとめ

今回は以下についてご紹介しました。
・EXCELから連番をコピペする
・テーブル定義でオートナンバー型を使う
・Dcount関数を使う
・VBAで連番用関数を作成する

どの方法を使って連番を振れば最も良いかですが、どれもケースによっては一長一短ですので、ケースごとに使い分けてください
ご参考になれば幸いです。