Application.worksheetFunction.match无法正常工作VBA Excel

时间:2015-08-28 11:37:51

标签: excel vba function excel-vba match

我正在尝试使用前缀生成唯一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

由于

3 个答案:

答案 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))