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