Microsoft Access 掲示板

IDが連番に並んでいるのか知りたい / 23

24 コメント
views
4 フォロー
23
hatena 2024/02/19 (月) 13:49:42 修正

最小値や最大値だけでなく、IDが34まで増えたときに19から22の間だけ、27から34の間だけで数値を並び替えて同じようにIDの連番をチェックするときは、どうすればいいんだろうと疑問に思ったからです。

チェックしたい範囲を引数で渡すようにすればいいでしょう。
ただし、指定した範囲だけチェックしたいのなら、その範囲のレコードを抽出して並び替える必要があります。

同じ処理をするのなら、きっともっと良い方法があるんだろうと邪推しました。お願いできますか?

引数を省略できる設定があります。引数の前に Optional をつけます。

VBA 省略可能な引数 Optional と名前付き引数

引数を省略したは全レコードをチェック、引数が指定してあればその引数間のレコードを対象にするというふうにすればいいでしょう。

上記を考慮すると下記のようなコードになります。

Public Sub SequenceCheck4(Optional MinId As Long = 0, Optional MaxID As Long = 0)
    If MinId = 0 Then MinId = DMin("ID", "T1")
    If MaxID = 0 Then MinId = DMax("ID", "T1")
    
    Dim StepNum As Long, SeqNum As Long, stOrder As String
    If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
        StepNum = 1   '昇順
        SeqNum = MinId
        stOrder = "昇順"
    Else
        StepNum = -1  '降順
        SeqNum = MaxID
        stOrder = "降順"
    End If

'    CurrentDb.Execute "UPDATE T1 SET 連番チェック = Null WHERE Not 連番チェック Is Null;"
    
    Dim sSQL As String
    sSQL = "SELECT * FROM T1 Where ID>=" & MinId & " And ID<=" & MaxID & " ORDER BY 数値, ID"
    If stOrder = "降順" Then sSQL = sSQL & " DESC"
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset(sSQL)
    Do Until rs.EOF
        rs.Edit
        If rs!ID <> SeqNum Then
            rs!連番チェック = stOrder & "×"
        Else
            rs!連番チェック = Null
        End If
        rs.Update
        SeqNum = SeqNum + StepNum
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
End Sub

使用例


'27から34の間だけ連番チェック
Call SequenceCheck4(27, 34)

'全レコードを連番チェック
Call SequenceCheck4()

通報 ...