<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 簡単な自動採番 複雑な自動採番 クエリで連番 レポートで連番 コードを書かずに連番



■簡単な自動採番

いやー。リクエストはけっこうあるんですけどね。大変ですよ。これは。
なかなか。コード記述(VBA)について多少理解していないと、応用するのは難しいかもしれません。
まあ、そうは言ってもいくつかパターンがあると思いますので、とにかく渡来じゃなくてトライしてみてください。

ここでは、入力するときに自動的に伝票番号を作成したり、テーブルの中のレコードに連続番号をふったりするやり方について、いろいろお話していこうと思います。
また合わせて、普段あたしが使ってる方法をいくつかご紹介させていただこうと思います。
例によってサンプルはバカバカしいですが・・・。


のっけからなんですが、Accessには「自動的に連続して番号を付ける」という機能はありません。
なので、コードを書いたりして、自分で仕組みを作ります。オーダーメイドって感じですね。

テーブルにオートナンバー型のフィールドを作ることで、そのテーブルの中に自動的に連番がふられますけど・・・。
それ以外の方法では自動的に番号をふることはできません。クエリーやフォーム上でも基本的に無理なんです。

また、話はそれますが、オートナンバー型のフィールドも、途中でレコードが削除されると、その番号は欠番になります。
空いた番号をつめたり再度通しで番号をふりなおす機能はありません。
オートナンバー型のフィールドで、再度番号をふりなおすためには、
http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j021/1/49.htm
を参考にしてください。マイクロソフトのサポートデスクに寄せられた質問の回答集のひとつです。

なんでできないの??という疑問符が浮かぶのはわかりますが、Accessは表計算ソフトではありませんので、あくまでもレコード単位でものごとを考えます。
データは主キーやインデックスに基づいて整列するのであり、開くときに割り振られた番号や、入力したときと異なる値で整列することなどありえないんですね。
まあ、後で見てみて番号が飛び飛びになってるのは気持ち悪いですけどねぇ。

で、話を戻しまして、クエリーはテーブルと同じ扱いをしますが物理的にデータを持っているわけではありません。フォームも同じです。
フォームそのものにはデータは格納されていませんので、自動的に番号をふるような動作はできません。

わけのわかんないことをぐちゃぐちゃ言ってないでさっさとやれ??う・・・わかりましたよう。

どうやってやるかというと、

一番大きな値に1を足して、代入する

のです。この構造を身につけてしまえば、いろいろなところで連番を作ることができます。
また、どういうとき無理なのかという判断材料にもなると思いますので、まずはいろいろ挑戦してみましょう。


ケース1 簡単な自動採番

まず、下のようなテーブルを用意しました。[ナンバー]を主キーにしていますが、主キーは別になくてもテストはできると思います。
で、このテーブルを基に、フォームを作って、そのフォームを通じて入力をすると仮定します。

あたしは表形式のフォームにしました。え?ハデ??
まあ、いいじゃないですか。たまには。

えー、で、[ナンバー]は入力できないようにしてありますんで、[名前]だけ入力します。

と、こんな風に、自動的に6桁の番号がつくように作り込んでいます。

このフォームのイベントに、以下のようなコードを書いています。


まず、フォームの「挿入前処理」。つまり、新しいレコードが入力される直前の処理です。
もっと具体的に言うと、[名前]欄に文字を入力した瞬間、という感じですね。

If DCount("ナンバー", "テーブルA") = 0 Then

もし、テーブルAのレコード件数を数えてみた答えがゼロだったら

Me![ナンバー] = "000001"

フォーム内の[ナンバー]というテキストボックスに000001って代入する。

Else

テーブルAのレコード件数を数えてみた答えがゼロじゃなかったら

Me![ナンバー] = Format(DMax("ナンバー", "テーブルA") + 1, "000000")

フォーム内の[ナンバー]というテキストボックスに、テーブルAの中の[ナンバー]の中で一番大きな値に1を足したものを000000と先行ゼロを入れて6桁表示の書式にして代入する。

End If

もし、って考えるのはここで終わり。


一番上の行は、1件もデータがない場合、4行目の足し算が成り立たないので、判別するために入れています。
最初からテーブルに何件かデータが入っていることがわかっていれば、4行目だけでよいです。

この構文を作るためには、DCount関数、DMax関数、Format関数の使い方について、ヘルプや関数ガイドブックなどを引いてあらかじめ把握しておいてください。
簡単な意味は、上に記した通りです。

入力していくと、どんどん数字が増えて、新しい番号がついていきます。
もちろん、基にしているテーブルAの[ナンバー]フィールドに値が入っていくことになります。
自動採番させるフィールドを主キーにしている場合は、空っぽの状態は許されません。
なるべく早いタイミングで番号をつくって代入するのがベストです。

最初に述べたように、テーブルに直接こういう機能を施すことはできません。
なので、こうしてフォームを通して番号を作って代入するプロシージャを動かすわけです。