错误91对象变量或未设置带块变量

时间:2019-06-07 14:33:45

标签: excel vba

我有这个代码

Sub search()
    Dim dato As String
    Dim filallibre As String
    dato = InputBox("Type 1 Or 2?")
    filalibre = Sheets(dato).Range("A65000").End(xlUp).Row + 1
    If dato = "" Then Exit Sub
    Set buscado = ActiveSheet.Range("A1:A" & Range("A65000").End(xlUp).Row).Find(dato, LookIn:=xlValues, lookat:=xlWhole)
    If Not buscado Is Nothing Then
        ubica = buscado.Address
        Do
            buscado.EntireRow.Copy Destination:=Sheets(dato).Cells(filalibre, 1)
            filalibre = filalibre + 1
            Set buscado = ActiveSheet.Range("A1:A" & Range("A65000").End(xlUp).Row).FindNext(buscado)
        Loop While Not buscado Is Nothing And buscado.Address <> ubica
    End If
End Sub

运行宏时,我的代码出现错误,当我键入“ 1”时它可以正常工作,但是当您输入“ 2”时,它将执行将行移动到名为“ 2”的工作表的工作。不会停止,似乎一直循环,直到我按Esc键,然后出现带有错误的消息框,错误似乎在该行中

Loop While Not buscado Is Nothing And buscado.Address <> ubica

我该如何解决?

编辑[6/7]

非常感谢您的建议,我已经尝试了一些建议,似乎对于这个VBA级别我还是太菜鸟了,或者我的代码完全出问题了,here I is the link to my excel file。测试一下,看看是否能找到问题

基本上,当我使用Ctrl + Shift + K运行宏时,文件的作用是询问“ 1”还是“ 2”,然后它确定A列中的行是1还是2,然后移动这些行到工作表1或2,具体取决于我在输入框中输入的数字,它在“ 1”下效果很好,但在“ 2”下效果不好

1 个答案:

答案 0 :(得分:2)

您不能将这两个测试合而为一:

Loop While Not buscado Is Nothing And buscado.Address <> ubica

如果第一次测试失败,则您的代码仍将继续检查buscado.Address的值-它不会停止对第一个False的测试(即,VBA中没有“短路”执行,因为是其他语言)

您可以轻松地显示此内容:

Dim c As Range

If c Is Nothing Or c.Address = "$A$1" Then Debug.Print "OK" '<< error

If c Is Nothing And c.Address = "$A$1" Then Debug.Print "OK" '<< error

编辑:@SJR是正确的-永远不会出现FindNext无法找到单元格的情况。最初的If Not buscado Is Nothing测试通过后,所有后来的FindNext都将获得匹配,因为Find总是在到达最后一个单元格时循环。

我错过了OP的错误仅在它们按下“ Esc”时才发生的情况,因此在这种情况下,我的回答(尽管从技术上讲,就VBA中的短路而言是合理的)没有解决根本的问题(OP的代码陷入循环)。