こんにちは、なかぜんです。
Accessを使っていて「オートナンバーの値が急に飛んだ!」と驚いたことはありませんか?
「連番にしたいのに、番号が10ずつ飛んでる…」「途中で100番台に進んでしまった…」そんな悩み、よく聞きます。
今回は、オートナンバーが飛ぶ理由と、それを防ぐ対策について、初心者の方にもわかりやすく解説します。
この記事を読むことで、トラブルの原因を理解し、実務でも安心してオートナンバーを使えるようになりますよ。
そもそもオートナンバーとは?
オートナンバーは、Accessのテーブルで主キー
としてよく使われる「自動採番」機能です。
新しいレコードが追加されるたびに、1ずつ自動で増える便利な機能です。
用途の例
- 顧客ID
- 注文番号
- 伝票番号
一見便利そうなこの機能ですが、実は「番号が飛ぶ」ことがあり、それが困りごとの元になるのです。
オートナンバーが飛んでしまう主な原因
1. キャンセルされた追加操作
Accessはレコードを追加しようとした瞬間に、仮でオートナンバーの値を予約します。
そのあと、ユーザーが保存せずにキャンセルした場合でも、その予約番号は戻されません。
2. クエリやVBAでの未完了追加
AppendクエリやVBAで.AddNew
を使った場合も、途中で処理が中断されると、番号だけが消費されてしまいます。
3. データの削除
レコードを削除しても、オートナンバーはリセットされません。
たとえば100件目を削除しても、次は101から始まります。
実際のコード例:VBAでの影響
以下は、新規レコードを追加してキャンセルした例です。
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("T_顧客", dbOpenDynaset)
rs.AddNew
rs!顧客名 = "テスト顧客"
' ここで何らかの理由でキャンセル
rs.CancelUpdate
rs.Close
Set rs = Nothing
解説:このコードでは、AddNew
でレコード追加処理を開始し、CancelUpdate
で取り消しています。
この時点で、オートナンバーは1件分「消費」されてしまいます。
対策:オートナンバーを飛ばさない工夫
1. 必要なときだけ追加する
フォームやVBAでは、AddNew
の前に「本当に追加するか?」を確認するロジックを入れると安心です。
2. テストデータと本番を分ける
テスト時に番号が飛ぶことがあるので、本番前にオートナンバーを初期化
するのもひとつの方法です。
3. オートナンバーに依存しすぎない
見た目の連番を求める場合は、自前で連番を管理する方が適しています。たとえば、日付+連番など。
注意点とよくあるミス
- 番号が飛んだことを気にして、オートナンバーを勝手に手入力しようとする(※これはNG)
- 番号が飛んでいても一意性は守られているので、実害がなければ放置でもOK
- 途中でオートナンバーをリセットしたくなる → 既存データに影響が出るため注意!
応用ポイント:独自の採番システムを作る
業務で「きれいな連番が必要」な場合は、VBAを使って独自の番号を発番しましょう。
Function GetNext番号() As Long
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT MAX(連番) AS 最大値 FROM T_注文")
If IsNull(rs!最大値) Then
GetNext番号 = 1
Else
GetNext番号 = rs!最大値 + 1
End If
rs.Close
Set rs = Nothing
End Function
この関数は、現在の最大番号に1を加えた値を返します。
これを使えば、見た目の連番もきれいに保てます。
まとめ:オートナンバーと上手に付き合おう
今回は、オートナンバーが飛んでしまう原因とその対策を紹介しました。
- オートナンバーは内部的に先に予約されるため、キャンセルでも番号が飛ぶ
- 見た目の連番を重視したいなら、自前で連番を作る方法が有効
- 実務では、番号の「見た目」より「一意性(ユニークさ)」が重要
Access初心者の方も、「あ、こういうことだったのか!」と理解が深まったのではないでしょうか?
次は、「自動採番のVBAテクニック」にチャレンジしてみるのもおすすめです!
それでは、またお会いしましょう。
なかぜんでした!
