Страницы: 1
RSS
Ошибка Run-time error '91 Object variable or With block variable not set' после внесения изменений в файл
 
Здравствуйте!
Имеется файл с макросом поиска. Поиск работает следующим образом: на листе "Поиск" через "да/нет" отмечаешь элементы, которые требуется найти, а макрос ищет данные элементы в ячейках заданного диапазона на всех листах книги.
Проблема: если в файле на любом листе внести какие-либо изменения (добавить текст в ячейку) или же просто открыть и закрыть ячейку без внесения изменений, то при последующем запуске макроса появляется ошибка Run-time error '91 Object variable or With block variable not set' (ошибка появляется в строке Loop While iFoundRng.Address <> firstAddress). До этого макрос работает нормально.
Файл примера приложил.
Вот код:
Код
Sub Поиск()
Dim iFoundRng As Range
Dim iSheet As Worksheet
Dim iFoundSht As Worksheet
Dim firstAddress As String
Dim TextToFind As Variant
Dim TextToFindA As Variant
Dim i As Variant
Dim iLastRow As Long
    
    Set iFoundSht = Sheets("Поиск") 'лист "Поиск" присваиваем переменной
    iFoundSht.Range("F3:F5000").Clear 'очищаем диапазон ячеек на листе Поиск
    TextToFindA = iFoundSht.Range("A2:B38") 'здесь задайте диапазон поиска+критериев отбора "да/нет", можно через InputBox
    For i = 1 To UBound(TextToFindA, 1)
        If TextToFindA(i, 2) = "да" Then TextToFind = TextToFind & "*" & Trim(TextToFindA(i, 1))
    Next i
    If TextToFind = "" Or TextToFind = False Then Exit Sub 'если ничего не ввели - Выход!
    TextToFind = Trim(TextToFind) 'убираем начальные и конечные пробелы
    Application.ScreenUpdating = False 'отключаем обновление экрана
    For Each iSheet In ThisWorkbook.Worksheets 'поиск по листам
        If iSheet.Name <> iFoundSht.Name Then
            If iSheet.FilterMode = True Then iSheet.ShowAllData 'если на листе установлен автофильтр, то снимаем его
            Set iFoundRng = iSheet.Range("A1:A10000").Find(TextToFind, , xlFormulas, xlPart)
            If Not iFoundRng Is Nothing Then 'если нашли
                firstAddress = iFoundRng.Address 'запоминаем адрес найденной ячейки, чтобы продолжить поиск по листу
                Do
                    With iFoundSht
                        iLastRow = .Cells(.Rows.Count, 6).End(xlUp).Row 'определяем последнюю заполненную строку на листе поиск
                        If iLastRow = 2 Then iLastRow = 3 'если лист пуст, то вставлять будем начиная с 4-й строки
                            With .Cells(iLastRow + 1, 6) 'проставляем имя листа
                                .Value = iFoundRng.Text
                                'добавляем гиперссылку
                                iFoundSht.Hyperlinks.Add Anchor:=iFoundSht.Cells(iLastRow + 1, 6), Address:="", _
                                    SubAddress:="'" & iSheet.Name & "'" & "!" & iFoundRng.Address, ScreenTip:="Перейти на лист " & iSheet.Name
                                '.Font.Bold = True 'выделяем жирным
                            End With
                    End With
                    Set iFoundRng = iSheet.Range("A1:A10000").FindNext(iFoundRng) 'продолжаем поиск на том же листе
                Loop While iFoundRng.Address <> firstAddress
            End If
        End If
    Next iSheet
    Application.ScreenUpdating = True 'включаем обновление экрана
    MsgBox "Поиск завершён!", 64, "Поиск"
End Sub
 
У меня работает отлично! Лучше выложите рядом и нерабочий пример.
Изменено: skais675 - 27.02.2019 12:14:49
 
Дак я и приложил тот файл, в котором возникает ошибка.

Попробовал запускать данный макрос на компьютерах коллег - у них всё работает хорошо, без ошибок. Значит, я так полагаю, проблема не в макросе, а в Excel на моем компе. Но что вызывает такую ошибку, может кто-нибудь знает?
 
yushkov, добрый вечер!

Довольно часто подобные вопросы возникают. Я не профи в компьютерной сфере, но исходя их опыта обычного пользователя уже давно сделал для себя вывод (это только ИМХО): вопрос скорее философский, нежели технический. Первое стандартное средство - переустановка программы (и хорошо, что в большинстве случаев помогает). Но почему она раньше работала отлично, а потом вдруг начинает косячить? Есть куча объяснений, но далеко не всегда они объясняют всё и вся. Возможно, изготовители железа и разработчики программ используют только экспериментальный опыт, а он не во всех ситуациях оказывается верным. Т.е. знаем: если сделать то-то и то-то, получается такой-то результат. (сравнение: если потереть ладони - почувствуешь, что они нагрелись). А вот почему так получается? Пока не будет знания об этом "почему", будут возникать и подобные вопросы. Живую клетку еще никому не удалось создать из ничего, возможно и тут что-то подобное. Возможно, камень не такой попался, не так на команды реагирует...  :)

повторюсь: ИМХО
 
А что при ошибке содержится в переменной iFoundRng?
Не смог воспроизвести ошибку, но в любом случае, если нет уверенности в существовании объекта при обращении к его свойствам не помешает его проверить. Даже в примере к справке такая проверка есть:
Код
'Example
'This example finds all cells in the range A1:A500 that contain the 
'value 2 and changes their values to 5.
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
В Вашем случае проблемную строку нужно заменить на
Код
Loop While Not iFoundRng Is Nothing And iFoundRng.Address <> firstAddress
 
Alec Perle, при ошибке iFoundRng = Nothing.
Замена проблемной строки на предложенную Вами результата не дала.

Ещё заметил такую особенность: если внести изменения в какую-нибудь ячейку, сохраниться, закрыть файл, а потом снова открыть файл - то макрос работает без ошибок.
Изменено: yushkov - 28.02.2019 06:33:03
 
Цитата
Alec Perle написал:
Даже в примере к справке такая проверка есть
Пример плохой, он вызывает ошибку 91, можете убедиться.
Если c является Nothing, то c.Address вызывает ошибку, эти две проверки нельзя совмещать в одном выражении. Следовало бы написать так
Код
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
            If c Is Nothing Then Exit Do
        Loop While c.Address <> firstAddress
    End If
End With
Изменено: Казанский - 28.02.2019 09:44:52
 
Казанский, изменил код как Вы предложили - ошибка 91 перестала выскакивать. Спасибо.  :)

Но теперь возникла другая проблема:
Например, искомое сочетание "Элемент1 + Элемент5".
Запускаю макрос - он находит 12 результатов ("Элемент1 + Элемент5", "Элемент1 + Элемент2 + Элемент5", "Элемент1 + Элемент3 + Элемент5" и др.). Это правильно.
Затем вношу изменения на каком-либо листе, которые никак не должны влиять на результаты поиска, и снова запускаю макрос. И теперь он находит только один результат - "Элемент1 + Элемент5".
Почему может быть так?
 
yushkov, просто для эксперимента попробуйте этот файл, там почти ничего не изменялось
По вопросам из тем форума, личку не читаю.
 
БМВ, попробовал Ваш файл.
Проблема, описанная в сообщении №8, осталась.
 
yushkov, все ведет к тому что проблема в конкретном экземпляре ПК. Я так понимаю, что никто не смог воспроизвести ошибку. Я б рекомендовал для начала проверку памяти, потом полную перестановку , но только с чисткой.
Складывается ощущение, что при определенных действиях поиск просто не находит или не возвращает найденное и так как ранее это контролировалось только на первом поиске, а при повторном уже ловилось нахождение первого значения, то при повторном происходил сбой, сейчас сбой убрали, но обеспечили завершение работы сразу при первом негативном поиске, а это привело к неполному результату.
Изменено: БМВ - 01.03.2019 07:45:14
По вопросам из тем форума, личку не читаю.
 
Только что наткнулся на интересную статью, возможно это о том, о чем в #4
Страницы: 1
Наверх