Поле поиска по диапазону скрытых листов

Вопрос или проблема

Этот код должен пройтись по скрытым и раскрытым листам книги и искать textbox.text в диапазонах I и K, возвращая листы в их первоначальное состояние видимости. Однако это не работает. Он выдает ошибку на строке foundCell1, когда я навожу на foundCell1, он говорит “Пусто”. Поисковый термин заполнен правильно. Я вручную раскрыл все листы, чтобы убедиться, что видимость не мешает, но это ничего не решило. Есть мысли?
Ошибка выполнения 91, переменная объекта или переменная блока With не установлена на строке foundCell1.

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        SearchSheets
    End If
End Sub

Sub SearchSheets()

    Dim ws As Worksheet
    Dim searchTerm As String
    Dim foundCell1 As Range
    Dim foundCell2 As Range
    Dim OrVis As Boolean

    searchTerm = Trim(TextBox1.Text)

    For Each ws In ThisWorkbook.Worksheets

        If InStr(1, ws.Name, "-") > 0 And Not Right(ws.Name, 3) = "MAP" Then
           OrVis = ws.Visible
            ws.Visible = xlSheetVisible

            foundCell1 = ws.Range("I:I").Find(searchTerm, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
            foundCell2 = ws.Range("K:K").Find(searchTerm, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

            If Not foundCell1 Is Nothing Or foundCell2 Is Nothing Then

                ws.Activate
                ws.Move After:=Worksheets("Index")
                If Not foundCell1 Is Nothing Then
                    foundCell1.Select
                Else
                    foundCell2.Select
                End If

                Exit For
            End If

            ws.Visible = OrVis
            End If

            If foundCell1 Is Nothing And foundCell2 Is Nothing Then
                MsgBox "Не найдено", vbInformation, "Результаты поиска"
            End If
     Next ws

End Sub

Ответ или решение

Чтобы исправить вашу проблему с кодом поиска по скрытым листам в Excel, необходимо внести несколько изменений. Ваша текущая реализация содержит ошибки, связанные с неправильной инициализацией переменных foundCell1 и foundCell2. Также нужно убедиться, что вы правильно проверяете найденные ячейки. Давайте посмотрим на исправленный код:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        SearchSheets
    End If
End Sub

Sub SearchSheets()

    Dim ws As Worksheet
    Dim searchTerm As String
    Dim foundCell1 As Range
    Dim foundCell2 As Range
    Dim OrVis As XlSheetVisibility

    searchTerm = Trim(TextBox1.Text)

    For Each ws In ThisWorkbook.Worksheets

        If InStr(1, ws.Name, "-") > 0 And Not Right(ws.Name, 3) = "MAP" Then
            OrVis = ws.Visible
            ws.Visible = xlSheetVisible

            Set foundCell1 = ws.Range("I:I").Find(searchTerm, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
            Set foundCell2 = ws.Range("K:K").Find(searchTerm, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

            If Not foundCell1 Is Nothing Or Not foundCell2 Is Nothing Then

                ws.Activate
                ws.Move After:=Worksheets("Index")

                If Not foundCell1 Is Nothing Then
                    foundCell1.Select
                Else
                    foundCell2.Select
                End If

                Exit For
            End If

            ' Восстановление видимости рабочего листа
            ws.Visible = OrVis
        End If
    Next ws

    ' Если ничего не найдено, сообщаем об этом пользователю
    If foundCell1 Is Nothing And foundCell2 Is Nothing Then
        MsgBox "Не найдено", vbInformation, "Результаты поиска"
    End If

End Sub

Основные исправления:

  1. Инициализация foundCell1 и foundCell2:
    В вашем коде отсутствует ключевое слово Set, которое необходимо для присвоения объектам Range. Это может вызвать ошибку времени выполнения 91. Добавлено Set перед присвоением.

  2. Проверка условий:
    Исправлено использование Or с проверкой foundCell2. Теперь условие корректно проверяет, что хотя бы одна из ячеек была найдена.

  3. Восстановление видимости листа:
    Главное, чтобы вы восстанавливали исходное состояние листа после завершения поиска. Этот шаг был сохранён, но я переместил его, чтобы он сработал только после того, как вы пройдёте текущий цикл.

  4. Сообщение об отсутствии результатов:
    Условие для сообщения о том, что ничего не найдено, было перемещено за пределы цикла, чтобы сработать только в том случае, если ни одна ячейка не была найдена на всех листах.

Теперь код должен работать корректно и без ошибок. Если у вас есть дополнительные вопросы или возникают новые проблемы, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...