2017-04-18 130 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