以前に下記のような質問を見つけ、項目毎の自動採番に転用し運用していたのですが、
二つの項目を選択後、選択した項目ごとに自動採番したい。
テーブル名:発行簿
フィールド名:
コード [テキスト型] リストボックスより選択 A;B;C
区分 [テキスト型] リストボックスより選択 前;中;後
発行番号 [テキスト型] 主キー 自動採番
発行番号 に
A-前-001
A-前-002
A-中-001
A-後-001
B-前-001
B-中-001
C-前-001
回答
区分の更新後処理に、
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & Format(Val(Right(Nz(DMax("発行番号", "発行簿","コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'" )),3)) + 1, "000")
と、言ううものでした。
ここで、例えば 区分 が 「後」 の時のみ、連番を 501 から始めるという方法はあるのでしょうか?
全くの見様見真似で、理解できておりません。よろしくお願いいたします。
A-後-001 これを A-後-501
式をバラバラにしてみましょう
処理は一番内側の括弧から順に処理されます。
バラバラにするなら下から順に処理を書けばいいということですね。
気を付ける点は、DMax関数は「値かNULL」が返ってくるところです。今回の場合、発行番号を対象にしているので「文字列かNULL」ですね。
条件に一致する発行番号がないとき(項目が新規の組み合わせの場合)、DMax関数がNULLを返すわけですが、この時の動きを調べてみてください。
結果を言うと項目が新規の組み合わせの場合、最新の番号として0(になる値)がとれるため、最新の番号+1で連番を作るということになっています。
この部分に条件分岐をいれてあげればいいですね。
ここまで何でもかんでも変数にして、とする必要はないですが、VBAで記述するなら適宜変数を置くと理解しやすくなります。
詳しく書いて説明して頂き、ありがとうございます。
出先のため、後日じっくりと勉強させていただきます。
hiroton様
回答頂きましてありがとうございます。
簡単に、どこかに条件分岐を入れるといいのかな~、などと考えていました。
式を分解して考える事が基本に繋がるのですね。
マネだけせずに、考えていきたいと思います。
3つ目のブロックに回答っぽいものがありますが1行で書くなら
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & Format(Val(Right(Nz(DMax("発行番号", "発行簿","コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'" )),3)) + 1, "000")
↓
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & Format(Val(Right(Nz(DMax("発行番号", "発行簿","コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'" ),IIf(Me!区分 = "後", 500, 0)),3)) + 1, "000")
フォーム上のテキストボックスだとか、レポートで一発表示だけしたいとか、どうしても計算式1行で済ませなければいけないという要件がでることもままあります。どっちも同じことをやっているのでどっちが基本ということもないですがVBAで記述するなら柔軟性を活用すべしということですね
自分でも見直したコードを追記してみた(やっていることは変わらない)ので見比べてみてください
後から見直したらもっといいコードがあったんじゃないかなと思うことはよくあること。なので
先のコードよりわかりやすくなってると思います
区分で設定を変えたいということでそこだけ条件分岐にしましたが、元々の「連番+1の処理」をそのまま残して初期値側を「後でプラス1されるからマイナス1しておく」ように弄ったところも条件分岐させてあげたほうが直感的に書けますね
ついでに
lastID
もAs String
指定できるので変な使い方ができないよう(バグのもとにならないよう)に制限できるのも良い点かなと余談
変数名も「lastNo」と「newNo」だとそっくりなのに中身別物じゃないかってなるので手を加えてみました