VBA发现运行时错误91的重复信息

尝试使用表单来创build一个使用string将concat中的两个值连接在一起的行。 在单击完成button时,macros将检查几个值以确定它是否可以放入信息中。 我试图设置的其中一个规则是检测string/值是否已经存在。

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':对象variables或块variables未设置”

需要调整什么才能解决问题?

Find返回一个Range对象引用。 当没有符合标准时,函数返回Nothing – 一个空引用。

这实际上非常接近于相连的可能重复,具有以下细微差别 – 这是:

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

真的是这样做的:

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

隐式调用Range对象的默认成员 ,它指向它的Value

这就是隐式成员调用抛出运行时错误91,因为Find返回Nothing所以你没有对象来获得一个值,执行> 0比较。

与链接问答中一样, 错误91的解决scheme首先validationFind是否返回有效的对象引用。

避免将来和其他许多情况下出现类似错误的解决scheme是避免隐含的默认成员调用 – 即编写代码,这意味着它说的是什么,并说明它的含义。

 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成员电话是多余的。