- ベストアンサー
アクセスでオートナンバーをリセットするには?
Accessで連番をふるプロセスで質問です。 データをあるテーブルに追加した時に、連番をふりたいと考えています。 最も簡単なのはオートナンバーフィールドを設定する方法なのですが、この場合一つ欠点があります。 それはレコードを全削除した場合でもナンバーがリセットされないという事です。 追加クエリでテーブルにデータを追加する前に必ずテーブルのレコードを全削除するのですが、 この際にオートナンバーも一緒にリセットする方法は無いでしょうか? また、質問の題名とは変わってしまうかもしれませんが、 オートナンバーを使用せずにレコードに連番をふる方法があればご教授下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>最適化せず(プログラムを走らせたままで)オートナンバーをリセットする方法をもしご存知でしたらご教授頂ければ幸いです。 テーブルのレコードを削除してからコピーすると、 オートナンバーはリセットされます。 それを利用した方法です。 他にも方法はあると思いますが、これが簡単かな。 Sub AutoNumberReset() Const TargetTable = "Table1" 'リセットしたいテーブル Const TargetAutoID = "ID" 'テーブルのオートナンバーのフィールド名 Const TargetFields = "Data1, Data2" 'オートナンバー以外のフィールド名 Const TempTable1 = "temp1" '作業用テーブル1 Const TempTable2 = "temp2" '作業用テーブル2 '確認メッセージなし DoCmd.SetWarnings False 'ターゲットを作業用テーブルにコピーし削除 DoCmd.CopyObject , TempTable1, acTable, TargetTable DoCmd.CopyObject , TempTable2, acTable, TargetTable DoCmd.DeleteObject acTable, TargetTable '作業用テーブル2のレコード削除する DoCmd.RunSQL "delete * from " & TempTable2 '作業用テーブル2をターゲットにコピー(この時点でリセットされる) DoCmd.CopyObject , TargetTable, acTable, TempTable2 '作業用テーブル1からレコードの内容をターゲットに戻す(オートナンバー以外のデータ) DoCmd.RunSQL "insert into " & TargetTable & " select " & TargetFields & " from " & TempTable1 & " order by " & TargetAutoID '作業用テーブルの削除 DoCmd.DeleteObject acTable, TempTable1 DoCmd.DeleteObject acTable, TempTable2 '確認メッセージあり DoCmd.SetWarnings True End Sub
その他の回答 (3)
- venzou
- ベストアンサー率71% (311/435)
>オートナンバーを使用せずにレコードに連番をふる方法があればご教授下さい。 リセットの方法については回答出ているので、こちらの質問に答えます。 これには何らかの並べ替えに使用できるフィールドが必要です。 (重複は不可) すでにオートナンバーのフィールドがあるならこれを利用します。 (何番から始まってもOK、番号が抜けててもOK) 仮にこのフィールドをF1とします。 テーブル名をTable1と仮定します。 ----以下手順---- 新規のクエリを作り、テーブルを追加します。 クエリのフィールドに下記を記述 連番:DCount("F1","Table1","F1 <=" & [Table1].[F1]) 残りのフィールドは適当に。 ----以上手順---- これで1から始まる連番が追加できます。
お礼
ご返答いただきありがとうございます。 なるほど、クエリで簡単に出来るのですね! これは大変参考になりました。ありがとうございました。
- yupokichi
- ベストアンサー率37% (20/53)
Bronco7さんの言うとおり、 最適化するとオートナンバーはリセットされます。 もし100番までオートナンバーをとっていて 101~150のデータを削除したあと最適化すれば また101からの入力が可能です。 最適化は ツール - データベースユーティリティ - 最適化/修復 から行うことができます。 また、ツール/オプション/全般タブで 「閉じるときに最適化する」にチェックをいれておけば データベースを閉じるたびに最適化することも可能です。 こうすることで、データベースの肥大化を防ぐことが可能です。
補足
ご返答頂きありがとう御座います。 No.1の補足にも記述したのですが、最適化をせずに、あるプログラムの中でオートナンバーをリセットする方法を探しております。 最適化せず(プログラムを走らせたままで)オートナンバーをリセットする方法をもしご存知でしたら引き続きご教授頂ければ幸いです。
- Bronco7
- ベストアンサー率29% (150/511)
オートナンバーを全削除したのなら データベースの最適化/修復を実行すれば リセットされますよ。
補足
ご返答頂きありがとう御座います。 たしかに最適化するとリセットされるんですよね。 ですが最適化の場合には実際は一旦データベースが終了し再起動している状態なので、起動時に走るプログラムが動いてしまったり、最適化前に開いていたフォームが復元されないなどの問題が出てしまうのです。 最適化せず(プログラムを走らせたままで)オートナンバーをリセットする方法をもしご存知でしたらご教授頂ければ幸いです。
お礼
ご返答いただきありがとうございます。 回答を読んでいて、「コピーする」という部分で思いつきました。 どうせならテーブル内のレコードでなくテーブル全体を削除して、マクロのオブジェクトコピーから基となるテーブルを毎回同じ名前でコピーすれば良いのではないか、と。 思ったとおり毎回オートナンバーが1から反映されるようになりました。