获取字符串中的下一个空闲数字

时间:2018-03-28 15:03:26

标签: vba excel-vba access-vba excel

我有一个名为 user 的表的.mdb数据库。 在此表中有一些记录,如

User00001
User00002
User00005
User99999

如何找到下一个空闲号码(User00003)?

我返回一组用户名。

我的意见是我可以使用类似的东西 首先使用右(5) 最大用户99999

删除用户

但现在呢?

我可以使用:

Dim MyNumber as integer
Dim SQL as Collection
Dim iCtr as Integer

Set SQL = SqlQuery(„Select username from user“) **my queryfunction**

For myNumber = 00001 to 99999

For iCtr = 1 To SQL.count
    If Right(SQL(iCtr),5) = MyNumber Then
        MsgBox myData(iCtr)
        Exit For
    End If
Next

Next

这就是我的想象 问题是myNumber不能是5位数吧? 也许完全错了。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

尝试这个小的用户定义函数:

Public Function NextFree(rng As Range) As String
    Dim arr
    ReDim arr(1 To rng.Count)

    i = 1
    For Each r In rng
        arr(i) = CLng(Mid(r.Value, 5))
        i = i + 1
    Next r

    For i = 2 To UBound(arr)
        If arr(i) <> arr(i - 1) + 1 Then
            NextFree = "User" & Format(arr(i - 1) + 1, "00000")
            Exit Function
        End If
    Next i

    NextFree = "User" & Format(arr(UBound(arr)) + 1, "00000")
End Function

enter image description here

答案 1 :(得分:1)

您可以尝试在SQL中执行整个操作,使用[Username]+1[Username]的反连接,并获取[Username]+1未加入[Username]的第一个值}:

Set SQL = SqlQuery("SELECT TOP 1 a.Username " & _
    "FROM (Select 'User' + Right('00000'+Cast(1 + Cast(Right(Username,5) AS bigint) As nvarchar(50)),5) AS Username FROM user) AS a " & _
    "LEFT OUTER JOIN user As b ON a.Username = b.Username " & _
    "WHERE b.Username IS NULL ORDER BY a.Username ASC")

或者,只是SQL:

SELECT TOP 1 a.Username
FROM (Select 'User' + Right('00000'+Cast(1 + Cast(Right(Username,5) AS bigint) As nvarchar(50)),5) AS Username FROM user) AS a
    LEFT OUTER JOIN user As b ON a.Username = b.Username
WHERE b.Username IS NULL ORDER BY a.Username ASC

答案 2 :(得分:0)

您可以添加新字段吗?如果是这样,您可以使用下面的第一个查询字符串创建一个新字段并将数据插入更新查询中。如果没有,您可以创建两个新查询。

在第一个查询中,使用以下方式获取用户ID:

UserNum: Right([user].[userID],5)

在第二个查询中,调用第一个查询(或者,如果您创建了一个字段,则调用用户表)并使用以下内容查找下一个数字:

NextID: (Max([myQuery].[UserNum])+1)

然后从VBA运行查询并将变量设置为值:

nextID = CurrentDb.Execute("secondQuery")