Запретить условное форматирование на всем листе

У меня есть этот код VBA, который попарно применяет условное форматирование к моему листу. Под этим я подразумеваю, что он ищет дубликаты из BC, DE, FG и т. д. Проблема в том, что он делает это для всего столбца, и это действительно замедляет мой лист.

Когда я проверяю правила, сгенерированные этим кодом, например, для столбцов B и D, они применяются к: =$B$1:$C$87,$B$89:$C$1048576. Причина, по которой это пропускает ROW 88, заключается в том, что у меня есть итоги в этой строке и удалены все правила. Есть ли способ изменить этот код, чтобы он применялся только к строкам 87 и выше, а не ко всему листу? Сейчас это значительно замедляет работу.

Sub findDups()
Dim startCell As Range
Dim formatCols As Range

Set startCell = ActiveCell

Do
    Set formatCols = startCell.Resize(1, 2).EntireColumn

    formatCols.FormatConditions.AddUniqueValues
    formatCols.FormatConditions(formatCols.FormatConditions.Count).SetFirstPriority
    formatCols.FormatConditions(1).DupeUnique = xlDuplicate
    With formatCols.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With formatCols.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With

    Set startCell = startCell.Offset(0, 2)

Loop Until startCell.Column >= 26

End Sub

person Batman    schedule 25.06.2013    source источник
comment
какая ячейка является вашей активной ячейкой, когда вы запускаете свой сабвуфер?   -  person Kazimierz Jawor    schedule 26.06.2013
comment
Доллары до пончиков это не условное форматирование замедляющее работу, а скрин-обновление. Попробуйте установить Application.ScreenUpdating = False во время выполнения вашего кода VBA и снова установить значение true после его завершения.   -  person Pieter Geerkens    schedule 26.06.2013
comment
Замедление происходит после того, как приведенный выше vba завершил работу. Но как только элемент введен, он проверяет наличие дубликатов по всему столбцу для двух столбцов. Это более 2 миллионов ячеек, когда нужно проверить только 160 максимум. Я думаю, что это правила условного форматирования, вызывающие отставание.   -  person Batman    schedule 26.06.2013


Ответы (2)


Вам просто нужно изменить formatCols (это странно, я не вижу в вашем коде ничего, что избегало бы строки 88)

...
Application.ScreenUpdating = False
Set startCell = ActiveSheet.Range("B1")

Do
    Set formatCols = startCell.Worksheet.Range(startCell, startCell.Offset(86, 1))

    ...
Loop Until ....

Application.ScreenUpdating = True
.....
person Daniel Möller    schedule 25.06.2013
comment
Извини. Я действительно вошел и выделил эту строку и удалил все примененное к ней условное форматирование. В противном случае этот код выполняется на всем листе. - person Batman; 26.06.2013
comment
Понятно... во всяком случае, этот код, который я разместил, выполняет работу для первых 87 строк (где вы читаете ..., используйте исходный код) - person Daniel Möller; 26.06.2013

Один из способов, который я использую для ограничения выбранных диапазонов, — найти последнюю ячейку в столбце. Где вы используете этот код:

Set formatCols = startCell.Resize(1, 2).EntireColumn

Я бы изменил его, чтобы использовать объект Range:

  1. Объявите новый объект Range и установите его в столбец, который вы хотите отформатировать.
  2. Найдите последнее значение в этом столбце (если оно равно 87, его можно использовать, в противном случае вы можете использовать startCell.End(xlDown)
  3. Установите новую переменную Range, чтобы использовать диапазон до этой ячейки
  4. Используйте значение Range, чтобы применить форматирование к

Это должно ускорить ваш код.

Вы также можете попробовать несколько дополнительных вещей:

  1. Установите для Application.ScreenUpdating значение False
  2. Задайте для Application.Calculation значение xlCalculationManual.

Надеюсь, поможет!

CompleteITPro

person bbrumm    schedule 25.06.2013