Ошибка 91 Переменная объекта или С переменной блока не установлено - PullRequest
0 голосов
/ 07 июня 2019

У меня есть этот код

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]

большое спасибо за ваши предложения, я попробовал некоторые из ваших предложений и, кажется, либо я тожеnoob для этого уровня VBA или что-то совершенно не так с моим кодом, здесь я ссылка на мой файл Excel , если кто-то хочет проверить его и посмотреть, можете ли вы найти проблему

В основном то, что делает файл, когда я запускаю макрос с помощью Ctrl + Shift + K, это запрашивает «1» или «2», затем он определяет, какие строки имеют 1 или 2 в столбце A, и перемещает эти строки на лист.1 или 2 в зависимости от того, какой номер я ввел в поле ввода, это работаетхорошо с "1", но не с "2"

1 Ответ

2 голосов
/ 07 июня 2019

Вы не можете объединить эти два теста в одну строку:

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

Если первый тест не пройден, ваш код все равно продолжит проверять значение buscado.Address - он не остановит тестирование на первомЛожь (т. Е. В 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 всегда зацикливается, когда попадает в последнюю ячейку.

Я пропустил, что ошибка ОП возникала только тогда, когда они нажимали «Esc», поэтому в этом случае мой ответ (хотя и технически обоснованный, как и короткое замыкание в VBA) не решает проблему, лежащую в основе (что код ОП застревает в цикле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...