2017-04-18 127 views
0

嘗試使用表單創建一個使用字符串將concat中的兩個值串聯在一起的行。單擊完成按鈕後,宏會檢查幾個值以確定它是否可以放入信息中。我試圖設置的這些規則之一是檢測字符串/值是否已經存在。發現重複信息的VBA運行時錯誤91

ID = txtStory.Value & "." & txtTask.Value 

If Range("A7:A98").Cells.Find(what:=ID, LookAt:=xlWhole) > 0 Then 
MsgBox "Story ID already exists.", vbExclamation, "Duplicate Found" 
Exit Sub 
End If 

當信息違反規則時,代碼正常運行。但是,如果結果爲假(該值與列中的任何內容不重複),則我收到「運行時錯誤'91':對象變量或塊變量未設置」

需要什麼調整以解決問題?

+0

需要查看整個代碼才能夠幫助您。這不是你有問題的部分。當你沒有重複的時候,你會傳遞那個'End If',並且在那裏有一個錯誤。 – Masoud

+1

[Cells.find error 91]可能的重複(http://stackoverflow.com/questions/26243490/cells-find-error-91) – cyboashu

+0

以下是range.find方法的參考https://msdn.microsoft。 COM/EN-US /圖書館/辦公室/ ff839746.aspx。如果找不到匹配項,Range.find返回一個Range對象,或者返回Nothing(一個VBA關鍵字)。 –

回答

2

Find返回一個Range對象引用。當沒有符合條件時,函數返回Nothing - 空引用。

這的確是非常非常貼近聯繫想成爲重複的,用下面的細微差別 - 這一點:

Range("...").Cells.Find(...) > 0 

真的做得這樣的:

Range("...").Cells.Find(...).Value > 0 

呼叫Range對象的默認成員,它指向它的Value

這是隱式成員調用的投擲運行時錯誤91,因爲Find回到Nothing所以你沒有對象得到的值,來執行> 0比較。

用於誤差91是,如在連接Q & A中的溶液,首先驗證Find返回一個有效的對象引用。

避免將來和其他許多情況下出現類似錯誤的解決方案是避免隱式的默認成員調用 - 即編寫代碼,這意味着它說的是什麼,並說明它的含義。

Set result = Range("...").Find(...) 
If Not result Is Nothing Then 
    '.Find call was successful 
    If result.Value > 0 Then '<< explicit Range.Value member call 
     '... 
    End If 
Else 
    '.Find call failed 
End If 

請注意,.Cell成員調用是多餘的。

+0

謝謝! Rich Holton也是一樣,鏈接提供了一個類似的問題,並指出我正確的方向。 – Thelnternet