我有这个代码
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”下效果不好
答案 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的代码陷入循环)。