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

时间:2015-08-19 11:37:31

标签: excel vba excel-vba

我有一个宏,可以搜索并将一个日期中的某些日期复制回另一个,如果找到该值,则重复每个不为空的行。

在我当前的文档中,大约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

调试突出显示Cells.Find行。

我看不出为什么前100行是好的然后它就会中断。

任何指导都会非常有用。

3 个答案:

答案 0 :(得分:3)

尝试不用.Select

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

有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros

答案 1 :(得分:1)

Find()函数返回Range对象,如果成功。您假设它始终是,并且您将Activate()电话链接到最后:

Cells.Find(What:=SearchValue, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False).Activate

如果Find()失败,则会失败。相反,将返回值分配给Range对象并测试是否成功:

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

答案 2 :(得分:0)

如果找不到搜索到的字符串,通常会出现此错误。 VBA没有提出"无法找到你想要的东西"但是会向您抛出此错误消息。所以你需要确保你要为VBA寻找的所有东西都在那里,或者抓住错误并解决如果不是这样做的事情。