尝试使用表单创建一个行,该行使用字符串在concat中将两个值串在一起。单击完成按钮后,宏将检查多个值以确定它是否可以放入信息中。我试图设置的其中一个规则是检测字符串/值是否已存在。
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
当信息违反规则时,代码可以正常运行。但是,如果结果为false(值与列中的任何内容都不重复),则会收到“运行时错误'91':对象变量或未设置块变量”
需要调整哪些方法才能解决问题?
答案 0 :(得分:2)
Find
返回Range
对象引用。当没有任何内容符合条件时,函数返回Nothing
- 空引用。
这确实非常接近链接的可能重复,具有以下细微差别 - 这:
Range("...").Cells.Find(...) > 0
真的这样做了:
Range("...").Cells.Find(...).Value > 0
您隐式调用Range
对象的默认成员,该成员指向其Value
。< / p>
隐式成员调用“抛出运行时错误91”,因为Find
返回Nothing
所以你没有从中获取值的对象,以执行{{ 1}}比较。
错误91 的解决方案与链接的Q&amp; A一样,首先验证> 0
是否返回有效的对象引用。
在未来和许多其他情况下避免类似错误的解决方案是避免隐式默认成员调用 - 即,编写代码表示内容并说明其含义。
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
成员呼叫是多余的。