Vba 运行时错误91:对象变量或未设置块

Vba 运行时错误91:对象变量或未设置块,vba,excel,Vba,Excel,我有一个宏,可以搜索某个日期,并将其从一张工作表复制到另一张工作表中(如果找到该值),并对非空的每一行重复 在我当前的文档中,大约有150行,以下宏运行正常,但随机抛出错误: 运行时错误“91”:未设置对象变量或带块变量 这是宏: Sub Update() Application.ScreenUpdating = False Application.CutCopyMode = False Application.StatusBar = "Cleaning New Roles..." Shee

我有一个宏,可以搜索某个日期,并将其从一张工作表复制到另一张工作表中(如果找到该值),并对非空的每一行重复

在我当前的文档中,大约有150行,以下宏运行正常,但随机抛出错误:

运行时错误“91”:未设置对象变量或带块变量

这是宏:

Sub Update()

Application.ScreenUpdating = False
Application.CutCopyMode = False
Application.StatusBar = "Cleaning New Roles..."

Sheets("new").Select
Range("A2").Select

Do Until IsEmpty(ActiveCell)

    Dim SearchValue As String

    SearchValue = ActiveCell.Value
    Sheets("Old").Select
    On Error GoTo Error_handler
    Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate

    Range("R" & Selection.Row & ":T" & Selection.Row).Select
    Selection.Copy
    ActiveCell.Offset(0, -1).Select
    Sheets("new").Select
    Range("R" & Selection.Row).Select
    Selection.PasteSpecial Paste:=xlPasteValues

Error_handler:
    Sheets("new").Select
    Range("A" & Selection.Row).Select
    ActiveCell.Offset(1, 0).Select

Loop

Application.ScreenUpdating = True
Application.StatusBar = False

End Sub
调试将突出显示
单元格。查找

我不明白为什么前100行还可以,然后它就断了


任何指导都会非常有用。

通常,如果找不到搜索的字符串,就会出现此错误。VBA不会提出“找不到您要查找的内容”,而是向您抛出此错误消息。因此,您需要确保为VBA提供的要查找的所有内容实际上都在那里,或者捕获错误并解决如果不存在该错误该怎么办。

如果未找到搜索的字符串,通常会出现此错误。VBA不会提出“找不到您要查找的内容”,而是向您抛出此错误消息。因此,您需要确保为VBA提供的要查找的所有内容实际上都在那里,或者捕获错误并解决如果不在那里该怎么办。

如果成功,
Find()
函数将返回一个
范围
对象。您假设它总是这样,并将一个
Activate()
调用链接到末尾:

Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
如果
Find()
失败,这将失败。相反,将返回值指定给
范围
对象并测试是否成功:

Dim r As Range
Set r = Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)

If Not r Is Nothing Then
    ' Find successful
End If
Find()
函数如果成功,将返回一个
Range
对象。您假设它总是这样,并将一个
Activate()
调用链接到末尾:

Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate
如果
Find()
失败,这将失败。相反,将返回值指定给
范围
对象并测试是否成功:

Dim r As Range
Set r = Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)

If Not r Is Nothing Then
    ' Find successful
End If

不要太多
,试试看。选择

Sub Update()
    Dim SearchValue As String, rFnd As Range, o As Long

    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    Application.StatusBar = "Cleaning New Roles..."

    With Sheets("new")
        o = 0

        Do Until IsEmpty(Range("A2").Offset(o, 0))
            SearchValue = vbNullString
            SearchValue = .Range("A2").Offset(o, 0).Value

            With Sheets("Old")
                On Error GoTo Error_handler
                Set rFnd = .Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)

                Sheets("new").Range("R2").Offset(o, 0).Resize(1, 3) = _
                  .Range("R" & rFnd.Row).Resize(1, 3).Value
            End With

Error_handler:
            o = o + 1
        Loop
    End With

    Application.ScreenUpdating = True
    Application.StatusBar = vbNullString

End Sub

有关摆脱依靠选择和激活来实现目标的更多方法,请参阅。

在没有太多
的情况下尝试。选择

Sub Update()
    Dim SearchValue As String, rFnd As Range, o As Long

    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    Application.StatusBar = "Cleaning New Roles..."

    With Sheets("new")
        o = 0

        Do Until IsEmpty(Range("A2").Offset(o, 0))
            SearchValue = vbNullString
            SearchValue = .Range("A2").Offset(o, 0).Value

            With Sheets("Old")
                On Error GoTo Error_handler
                Set rFnd = .Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)

                Sheets("new").Range("R2").Offset(o, 0).Resize(1, 3) = _
                  .Range("R" & rFnd.Row).Resize(1, 3).Value
            End With

Error_handler:
            o = o + 1
        Loop
    End With

    Application.ScreenUpdating = True
    Application.StatusBar = vbNullString

End Sub

请参阅,以了解有关如何摆脱依赖选择和激活来实现目标的更多方法。

错误上转到错误上的
处理程序不应该处理未找到的值吗?错误上转到错误上的
处理程序不应该处理未找到的值吗?错误上转到错误上的
处理程序不应该处理未找到的值吗由找不到值引起的错误?错误上的
是否应转到错误处理程序
不处理由找不到值引起的错误?Jeeped,在查找单元格中添加检查,如Bond的回答所示。如果你这样做,你的答案就更完整了。我没有为此设置一个完整的测试环境,但是抛出到
error\u handler:
的错误处理程序应该会处理这个问题,并且更像OP的原始代码。Jeeped,在finding cell中添加checking for nothing,如Bond的答案所示。如果你这样做,你的答案就更完整了。我没有为此设置一个完整的测试环境,但是抛出到
error\u handler:
的错误处理程序应该处理这个问题,并且与OP的原始代码更为相似。