2015-08-28 259 views
1

我想用一个前缀生成一个唯一的ID。为此,我生成一个介于0000和9999之间的随机数字,并将其添加到我的前缀末尾。然后,我想要做的是检查A列中的工作表,看看该ID是否已经存在,如果是,那么它只是产生另一个随机数,并继续进行,直到找到唯一的一个。为此,我正在使用while循环。以下是我的代码。我遇到的问题是,一旦match()函数找不到任何值,该值将保留为最后一个值,即:找到最后一个值的行号。例如,如果我的ID是T26-7055,它会搜索工作表并发现它已经存在于第59行中。然后它会生成另一个ID,这个时间称为T26 -2099,它不存在,但匹配函数仍然返回59,循环进入无限循环。我不明白为什么会发生这种情况,并希望你们中的一个人能够提供帮助。Application.worksheetFunction.match无法正常工作VBA Excel

Dim newID As String 
Dim x As Integer 
Dim matchedRow As Boolean 

matchedRow = True 
x = CInt(Int(9999 * Rnd()) + 1) 
newID = "T26 - " & x 
While matchedRow = True 
    Dim match As Long 
    On Error Resume Next 
     match = Application.WorksheetFunction.match(newID, Sheets("Exceptions").Columns(1), 0) 
    On Error GoTo 0 
    If match <> 0 Then 
     x = CInt(Int(9999 * Rnd()) + 1) 
     newID = "T26 - " & x 
     matchedRow = True 

    Else 
     matchedRow = False 
    End If 
Wend 

感谢

+0

将Dim match与其他Dim语句一起移动。在每个循环的开始处将匹配重置为0,所以就在'While'行之后加上'match = 0'。 我相信有一个创建唯一ID的更好方法。 –

+0

此链接可能有所帮助:http://www.mrexcel.com/forum/excel-questions/647784-excel-2010-generate-6-digit-unique-random-number-id-column.html –

回答

2

您在找到匹配项后不会将match重置为0。

matchedRow = True 

后放线

match = 0 

Dim match as Long在循环的开始不复位。

+0

非常感谢你。这工作 – GBSingh

1

您正在使用Application.WorksheetFunction.match。如果找不到匹配项,并且您找到了解决方法,则会引发错误。但是这也会抑制任何被发现的合法错误。

如果使用Application.match你将我们能够捕获错误如下:

Application.WorksheetFunction.IsError(Application.match(newID, Sheets("Exceptions").Columns(1), 0)) 

这将至少给你所遇到的错误的想法。 另外:您没有使用完全匹配的匹配项。我认为,根据你的故事,你将需要(这可能是你的烦恼的原因。 只需更改最后0到1,你会得到一个更精确的结果。

Application.WorksheetFunction.IsError(Application.match(newID, Sheets("Exceptions").Columns(1), 1)) 
+0

谢谢唯一的问题如果我将0更改为1,则它会错误地找到一个值并返回到无限循环。 0工作正常 – GBSingh

2
  • 尝试重命名变量“匹配”到别的东西 - 比赛是内置Excel函数

  • 使用Application.Match代替WorksheetFunction.Match(有细微的差别)名称


Dim newID As String 
Dim found As Variant 

Do 

    newID = "T26 - " & CInt(Int(9999 * Rnd()) + 1) 

    found = Application.Match(newID, Sheets("Exceptions").Columns(1), 0) 

Loop While Not IsError(found)