VBA Найти отформатированную ячейку

Я пытаюсь написать макрос, который будет находить, активировать и циклически перемещаться по любым ячейкам, у которых есть границы снаружи. Это работает, когда я использую функцию поиска, и я записал следующий код, но когда я запускаю этот код независимо, он некоторое время зависает в части поиска, прежде чем вернуть

ошибка времени выполнения '91'.

Есть идеи, почему запись не работает так, как работает стандартный формат поиска?

    Sub FindBoarder()
'
' FindBoarder Macro
'

'
    Application.FindFormat.Clear
    With Application.FindFormat.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Application.FindFormat.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Application.FindFormat.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Application.FindFormat.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=True).Activate
    Cells.FindNext(After:=ActiveCell).Activate
End Sub

person Adrian Morris    schedule 21.06.2018    source источник
comment
Вы получите эту ошибку, если не будут найдены ячейки с указанными границами. Я предлагаю вам проверить, была ли обнаружена ячейка, прежде чем что-либо активировать.   -  person Ron Rosenfeld    schedule 21.06.2018


Ответы (2)


Другие указали на проблему, но если вам нужна помощь в поиске решения, вот вам:

Dim ToActivate As Range

Set ToActivate = Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=True)

If Not ToActivate Is Nothing Then
    ToActivate.Activate
Else
    Debug.Print "Not Found"
End If

Приведенный выше код заменяет ваш вызов Cells.Find. Вы захотите сделать что-то подобное со своим вызовом FindNext, хотя я действительно не уверен, какая должна быть связь между этими двумя вызовами.

person Steve Lovell    schedule 27.06.2018

Я пытался повторить ваш скрипт, и на удивление он работает, когда есть какое-либо форматирование. Ошибка возникает только тогда, когда нет ячеек с границами. Простой (но не правильный) способ избавиться от него — добавить в начало строчку:

При ошибке Возобновить Далее

И тогда этот макрос будет работать как кнопка «таб»)

person Artem    schedule 21.06.2018
comment
Лучше проверить, найдена ли ячейка. - person Ron Rosenfeld; 21.06.2018
comment
Я заключаю с Роном, что использование On Error Resume Next без надлежащей обработки ошибок - очень плохая практика. - person Pᴇʜ; 22.06.2018