.Range(“ ...”)。Find生成Object变量或With Block变量未设置

时间:2019-09-03 18:10:32

标签: excel vba

我想找到一个关键字,然后对它执行操作。

Dim ws as Worksheet
Dim LastRow As Long
Dim NextRow as Long

Set ws = ActiveWorkbook.ActiveSheet

LastRow = ws.Range("A:A").Find(What:="", After:=Range("A10")).Row

NextRow = ws.Range("A:K").Find(What:="This City Is:").Row

ws.Cells(LastRow, 1) = Me.tbTextbox1.Value
ws.Cells(LastRow, 2) = Me.tbTextbox1.Value
ws.Cells(LastRow, 3) = Me.tbTextbox3.Value
ws.Cells(NextRow, 4) = "This City is: " + Me.tbTextbox4.Value

End Sub

我遇到问题的部分是NextRow。

NextRow = ws.Range("A:K").Find(What:="This City Is:").Row

是在说

  

“未设置对象变量或含块变量”

我试图使Textbox4行等于“ This City Is:”所在的文本。因为有时候,如果我决定在某处插入一行,我仍然希望代码遵循该术语。

1 个答案:

答案 0 :(得分:6)

NextRow = ws.Range("A:K").Find(What:="This City Is:").Row

您假设Range.Find会找到要查找的内容,但不会。

因此.Row成员调用与Nothing相对,因为Range.Find在找不到所需内容时会返回Nothing。对Nothing进行的任何成员调用都会引发错误91。

从不不使用Range.Find的返回值而无需先对其进行验证。在Range引用中捕获返回值:

Dim result As Range
Set result = ws.Range("...").Find(...)

然后确保它不是Nothing

If Not result Is Nothing Then
    NextRow = result.Row
    ...
End If

请注意,Rubberduck(我管理的免费,开源VBIDE外接程序项目)对这种情况(以及其他许多情况)发出警告:

Result of 'Range.Find' call is not tested for 'Nothing'