hiroton
2020/09/18 (金) 19:08:01
622cc@f966d
式をバラバラにしてみましょう
処理は一番内側の括弧から順に処理されます。
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" &
Format(
Val(
Right(
Nz(
DMax(
バラバラにするなら下から順に処理を書けばいいということですね。
Dim strWhere As String '//発行番号のグループの条件
Dim retDMax
Dim retNz
Dim retRight As String
Dim retVal As Long
Dim retFomat As String
strWhere = "コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'"
'//条件の中から一番大きいモノを取り出す
retDMax = DMax("発行番号", "発行簿", strWhere)
'//条件に一致するものがないときはNULLになっているので文字列に統一する
retNz = Nz(retDMax)
'//ほしいのは数字部分だけなので右から3文字取り出す
retRight = Right(retNz, 3)
'//計算できるように文字から数値に変換して1増やす
retVal = Val(retRight) + 1
'//出来上がった連番を登録用に整形する(3桁0詰め)
retFormat = Format(retVal, "000")
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & retFormat
気を付ける点は、DMax関数は「値かNULL」が返ってくるところです。今回の場合、発行番号を対象にしているので「文字列かNULL」ですね。
条件に一致する発行番号がないとき(項目が新規の組み合わせの場合)、DMax関数がNULLを返すわけですが、この時の動きを調べてみてください。
結果を言うと項目が新規の組み合わせの場合、最新の番号として0(になる値)がとれるため、最新の番号+1で連番を作るということになっています。
この部分に条件分岐をいれてあげればいいですね。
Dim strWhere As String '//発行番号のグループの条件
Dim varLastNoString
Dim varNzLastNoString
Dim strLastNo As String
Dim nNewNo As Long
Dim strNewNo As String
strWhere = "コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'"
varLastNoString = DMax("発行番号", "発行簿", strWhere)
'//新規(条件グループの連番が見つからなかった時)の連番を区分によって切り変える
varNzLastNoString = Nz(varLastNoString, IIf(Me!区分 = "後", 500, 0))
strLastNo = Right(varNzLastNoString, 3)
nNewNo = Val(strLastNo) + 1
strNewNo = Format(nNewNo, "000")
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & strNewNo
ここまで何でもかんでも変数にして、とする必要はないですが、VBAで記述するなら適宜変数を置くと理解しやすくなります。
Dim tempLastNo As Long '//条件により連番の初期値を変えたい
Dim lastNo
Dim newNo As Long
'//新規(条件グループの連番が見つからなかった時)の仮の連番を設定する
If Me!区分 = "後" Then
tempLastNo = 500
Else
tempLastNo = 0
End If
'//発行番号は「[コード]-[区分]-[連番(3桁0詰め)]」形式の文字列なのでうまいことなんやかんやする
lastNo = Nz(DMax("発行番号", "発行簿", "コード='" & Me!コード & "' AND 区分='" & Me!区分 & "'"), tempLastNo)
newNo = Val(Right(lastNo, 3)) + 1
Me!発行番号 = Me!コード & "-" & Me!区分 & "-" & Format(newNo, "000")
通報 ...