2015-08-28 257 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)