我正在尝试使用前缀生成唯一ID。为了这个我生成一个介于0000和9999之间的随机数,并将其添加到我的前缀的末尾。我想要做的是检查A列中的表单以查看该ID是否已经存在,如果是,那么它只生成另一个随机数,并且它会一直持续到找到唯一的ID。要做到这一点,我使用while循环。以下是我的代码。我遇到的问题是,一旦match()函数找不到任何东西,它的值仍然是最后一个值,即:它找到最后一个值的行号。例如,如果我的id是T26 - 7055,它会搜索工作表并发现它已存在于第59行。然后它会生成另一个ID,这次说T26 -2099不存在,但匹配函数仍然返回59和while循环只是进入无限循环。我不明白为什么会这样,并希望你们中的一个人能够提供帮助。
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 :(得分: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)
答案 1 :(得分:2)
找到匹配项后,您没有将match
重置为0.
行后
matchedRow = True
放行
match = 0
在循环开始时Dim match as Long
不会重置它。
答案 2 :(得分: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))