VBA循环直到函数为真,每次更改传递值

时间:2016-11-23 16:13:32

标签: vba ms-access access-vba

我有一个添加新用户的表单。我正在尝试自动生成用户名,该用户名必须是唯一的。我有一个函数checkUsername,它接受传递的字符串并检查db表以查看该用户名是否存在。如果用户名存在则返回false,否则返回true。

我要做的是如果用户名已经存在,那么在末尾添加一个数字并再次检查。我想继续循环,直到找到unqiue用户名。下面是我在下面循环的尝试,但是它已经存在的返回用户名。此外,我更喜欢它增加数字,而不是只是添加到最后。目前,模式最终为username1,username12,username123。

'Generate username
Dim Username As String
Username = generateUsername(LCase(Left(FirstName, 1) & LastName))

Function generateUsername(Username As String) As String

    Dim i As Integer
    i = 1

    Do While checkUsername(Username)
        If checkUsername(Username) Then
           Exit Do
        Else
           Username = Username & i
           i = i + 1
        End If
    Loop

    generateUsername = Username

End Function

3 个答案:

答案 0 :(得分:3)

我会做的是,当用户名已经存在时(请参阅Andre的答案,代码将以不同的方式实现此目的):

  • 检查以前的“i”号码是一个字符串,看看我需要多少字符来切断用户名的结尾
  • 将username设置为username的子字符串,这将截断最后的X个字符(X是前一个“i”的字符数)
  • 将新“i”添加到结束用户名

这将解决您的命名问题。

对于寻找唯一名称的问题,在我们看到“checkUsername”函数的代码之前,没有人能够提供帮助。首先确保该函数返回您期望的值。我怀疑问题就在那里。

编辑:

我也不明白为什么循环中有“If / Else”语句。你已经确定这是真的。请参阅下面的简化版本(再次,假设我的代码适用于VB ...我通常在C#中执行此操作):

Do While Not checkUsername(NewName)        
    NewName  = Username & i
    i = i + 1
Loop

答案 1 :(得分:2)

如果用户名存在,我假设checkUsername()返回true?

然后您的If条件有误 - 如果不存在,您想要退出。

如果你使用两个变量,你的循环会变得更清晰:

Function generateUsername(origUsername As String) As String

    Dim i As Integer
    Dim Username As String

    i = 1
    Username = origUsername

    Do While checkUsername(Username)
'        If Not checkUsername(Username) Then
'           Exit Do
'        Else
           Username = origUsername & i
           i = i + 1
'        End If
    Loop

    generateUsername = Username

End Function

编辑:正如Joel所指出的,循环中的额外checkUsername()是不需要的。由于它可能涉及DLookup或类似,它实际上对性能有害 我在上面评论过它。

答案 2 :(得分:1)

抱歉,这是更正后的版本!

将代码改为:

Dim Username As String
Username = generateUsername(LCase(Left(FirstName, 1) & LastName))

Function generateUsername(Username As String) As String
Dim NewName  as String
Dim i As Integer
i = 1
NewName = Username
Do While checkUsername(NewName)
    If checkUsername(NewName) Then
       Exit Do
    Else
       NewName  = Username & i
       i = i + 1
    End If
Loop

generateUsername = NewName

End Function