查找以字母开头的列中的下一个数字

时间:2015-01-23 20:53:37

标签: vba ms-access access-vba

我为某些人创建了一个表单,用于在访问表中添加/修改记录。我需要做的是编写一个函数,在用户添加新记录时自动从列中查找下一个可用的数字。

我遇到的问题是我需要增加的列中的数字前面有R或W,所以我不能只使用DMax函数。我正在写一个输入框来询问第一个字符然后我需要它来搜索最大的数字然后给它们下一个可用的字符。

例如,该列包含:

R1000
R1001
W1000
R1002
W1001
W1002
R1003

当用户指定" R"我需要它返回" 1004"作为下一个可用。

编辑:所以,这可能需要移动到不同的类别,因为我有一个有效的代码。我只是不知道这是否最有效:

Dim MaxValue As Integer
Dim db As dao.Database
Dim rs As dao.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT GlobalAcct FROM TestTable")

rs.MoveLast
rs.MoveFirst

MaxValue = 0

Do While Not rs.EOF
    If MaxValue = 0 Or CInt(Right(rs!GlobalAcct, 4)) > MaxValue Then
        MaxValue = CInt(Right(rs!GlobalAcct, 4))
    End If

    rs.MoveNext
Loop

MaxValue = MaxValue + 1
Debug.Print MaxValue

1 个答案:

答案 0 :(得分:3)

这是一个函数,它将返回一个long,表示以您传入的任何字母开头的最大帐户。

Public Function GetLastAccount(ByVal sPrefix As String) As Long

    Dim rs As ADODB.Recordset
    Dim aSql(1 To 4)  As String

    aSql(1) = "SELECT TOP 1 Val(Right(GlobalAcct,Len(GlobalAcct)-1)) As NumAct"
    aSql(2) = "FROM TestTable"
    aSql(3) = "WHERE Left(GlobalAcct,1)='" & sPrefix & "'"
    aSql(4) = "ORDER BY GlobalAcct DESC"

    Set rs = New ADODB.Recordset
    rs.Open Join(aSql, Space(1)), Application.CurrentProject.Connection

    GetLastAccount = rs.Fields("NumAct").Value

End Function

使用中:

?getlastaccount("R")
 1003 
?getlastaccount("w")
 1002 

然后你可以添加1或者你想做的任何事情。

SQL语句是SELECT TOP 1ORDER BY DESC - 这就是你获得最大值的方式,你不必返回或浏览庞大的记录集。

ValRight函数用于隔离帐户的数字部分。有很多假设,包括帐户以您想要忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少返回一条记录的字符。但你可以弄清楚这些细节。