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

Excel 发现重复信息的VBA遇到运行时错误91,excel,vba,Excel,Vba,尝试使用表单创建一行,该行使用字符串将concat中的两个值串在一起。单击finish按钮后,宏将检查多个值,以确定是否可以将其放入信息中。我试图设置的规则之一是检测字符串/值是否已经存在 ID = txtStory.Value & "." & txtTask.Value If Range("A7:A98").Cells.Find(what:=ID, LookAt:=xlWhole) > 0 Then MsgBox "Story ID already exists.",

尝试使用表单创建一行,该行使用字符串将concat中的两个值串在一起。单击finish按钮后,宏将检查多个值,以确定是否可以将其放入信息中。我试图设置的规则之一是检测字符串/值是否已经存在

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


需要调整哪些内容来解决问题?

Find
返回一个
范围
对象引用。当没有任何内容与条件匹配时,函数将返回空引用

这确实非常接近于将重复的链接,具有以下细微差别-这是:

Range("...").Cells.Find(...) > 0
他真的这么做了:

Range("...").Cells.Find(...).Value > 0
您正在隐式地调用
范围
对象的默认成员,该成员指向其

抛出运行时错误91的是隐式成员调用,因为
Find
返回
Nothing
,因此您没有对象可从中获取值,以执行
>0
比较

错误91的解决方案是,与链接问答一样,首先验证
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
设置结果=范围(“…”)。查找(…)
如果没有结果,那就什么都不是了
“。查找呼叫成功

如果result.Value>0,则'
Find
返回一个
范围
对象引用。当没有任何内容与条件匹配时,函数将返回空引用

这确实非常接近于将重复的链接,具有以下细微差别-这是:

Range("...").Cells.Find(...) > 0
他真的这么做了:

Range("...").Cells.Find(...).Value > 0
您正在隐式地调用
范围
对象的默认成员,该成员指向其

抛出运行时错误91的是隐式成员调用,因为
Find
返回
Nothing
,因此您没有对象可从中获取值,以执行
>0
比较

错误91的解决方案是,与链接问答一样,首先验证
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
设置结果=范围(“…”)。查找(…)
如果没有结果,那就什么都不是了
“。查找呼叫成功

如果result.Value>0,则“需要查看整个代码才能帮助您”。这不是你有问题的部分。当你没有重复项时,你会通过
End If
,然后在那里的某个地方出现错误。可能重复的是range.find方法的引用。Range.find返回一个范围对象,如果找不到匹配项,则返回Nothing(VBA关键字)。需要查看完整的代码才能帮助您。这不是你有问题的部分。当你没有重复项时,你会通过
End If
,然后在那里的某个地方出现错误。可能重复的是range.find方法的引用。Range.find返回一个范围对象,如果找不到匹配项,则返回Nothing(VBA关键字)。非常感谢!Rich Holton也大声说出来,链接提供了一个类似的答案,为我指明了正确的方向。非常感谢!里奇·霍尔顿(Rich Holton)也大喊一声,这个链接提供了一个类似的答案,为我指明了正确的方向。