Вопрос или проблема
Этот код должен пройтись по скрытым и раскрытым листам книги и искать 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
Основные исправления:
-
Инициализация
foundCell1
иfoundCell2
:
В вашем коде отсутствует ключевое словоSet
, которое необходимо для присвоения объектамRange
. Это может вызвать ошибку времени выполнения 91. ДобавленоSet
перед присвоением. -
Проверка условий:
Исправлено использованиеOr
с проверкойfoundCell2
. Теперь условие корректно проверяет, что хотя бы одна из ячеек была найдена. -
Восстановление видимости листа:
Главное, чтобы вы восстанавливали исходное состояние листа после завершения поиска. Этот шаг был сохранён, но я переместил его, чтобы он сработал только после того, как вы пройдёте текущий цикл. - Сообщение об отсутствии результатов:
Условие для сообщения о том, что ничего не найдено, было перемещено за пределы цикла, чтобы сработать только в том случае, если ни одна ячейка не была найдена на всех листах.
Теперь код должен работать корректно и без ошибок. Если у вас есть дополнительные вопросы или возникают новые проблемы, не стесняйтесь обращаться за помощью!