Страницы: 1
RSS
Условное форматирование циклом: тормозит если более 500 строк
 
Добрый день,
Я новичок VBA и не могу понять причину возникающего торможения при цикличном применении условного форматирования построчно. Торможение происходит прогрессивно и явно заметно после 500-й строки обработки. Задача размножить форматирование от строки номер 11 до последней используемой (в рабочем файле более 2000 строк). Формула условного форматирования: если ячейка в столбце "E" имеет значение "отменен", то эта строка (строка от столбца "B" до "DR") закрашивается  цветом.

Спасибо заранее всем кто откликнется!
 
Зачем условное форматирование, если применяете VBA?
А если задавать УФ в VBA, то лучше в цикле заполнять диапазон в переменной а потом этому диапазону одним махом присвоить формат
Код
Dim rRng As Range
       If условие_выполнено Then
           If rRng Is Nothing Then
               Set rRng = Cells(i, 1) ' формируем диапазон, добавляем  ячейку или диапазон
           Else
               Set rRng = Union(rRng, Cells(i, 1)) 'пополняем диапазон
           End If
       End If
........................
       If Not rRng Is Nothing Then rRng.(пишем_УФ)
Изменено: vikttur - 15.10.2017 18:12:39
 
А как надо было по правильному?  
 
Поскольку не для себя "стараетесь" - для юзера - Ваш алгоритм очень не рационален.
Юзер будет вынужден фильтровать данные по "разукрашке"!
Не проще ли, без затей, на соседнем листе построить "протокол" из всех отмененных строк?  :D  
 
В рабочей таблице много различных условий форматирования и много листов. В основном форматирование применяется по значению ячейки и только к этой ячейке. В случае значения "отменено" и еще пары других, надо залить цветом не одну ячейку  а строку, казалось бы, условное форматирование по формуле как раз для этого и сделано и ничего сложного, но выходит надо, возможно, вводить отдельное "протоколирование" , вообщем пока не понятно как поступить.
 
Нормальному, работающему юзеру нет никакого дела до "красот" интерфейса: он "ценит" только простоту действий для достижения своих целей!
 
Нормальному работающему юзеру необходимо выделение цветом статуса заказа товара, чтоб не допустить ошибок, а не для красоты. В вопросе стоит задача как создать решение, необходимое для работы, а мы уходим в обсуждение какому юзеру, что надо по вашим предположениям. Условия форматирования вводились в таблицу постепенно, пока первый год работали с заказами, и каждое форматирование - необходимость для работы персонала. Это рабочий процесс. Так как размножение строк приводит к бесконтрольному и неверному копированию условных форматирований, и был придуман макрос переписывающий условные форматирования. Мы обсуждаем здесь часть кода, которая выполняется медленно, и вопрос как это правильно реализовать, и если это не vba средствами то как, чтоб снизить ручное редактирование?
 
Подход менять надо. Вам об этом и пишут.
Условное форматирование грузит файл. Чем больше условий, тем больше загрузка. Задать УФ для всего столбца - это один формат. Задать форматирование для 1000 отдельных ячеек столбца - это 1000 форматов.
 
Спасибо за информативные ответ, но как тогда надо решить вопрос с таким же результатом по правильному? Иными словами, я прошу помощи в поиске правильного решения, а мне только указывают, что мой метод неверный, я критику то принимаю, но что является альтернативным решением?  
 
Потому что в этой теме обсуждается Ваш вопрос, а не Ваша задача.
Создайте тему с названием, отражающим суть проблемы, а не Ваш путь решения. С простым и понятным примером строк на 20-30.
 
Цитата
Dmitri написал:
"E" имеет значение "отменен", то эта строка (строка от столбца "B" до "DR") закрашивается  цветом.
Для начала: не красьте все столбы от "B" до "DR"!  :D  
 
В данном случае окраска всей строки есть цель. Сделано чтоб в конце таблицы было наглядно  видно, что эта строка особенная. Я понял, что лучше отказаться от условного форматирования и следует применить цвет к строке средствами vba, но тогда надо продумать как это будет применяться к строке если статус динамически меняется. То есть, в один день у строки статус "отменен" и окрашено, а в другой день, например, уже "не отменен" и цвет уже должен отсутствовать.
 
Цитата
Dmitri написал:
То есть, в один день у строки статус "отменен" и окрашено, а в другой день, например, уже "не отменен" и цвет уже должен отсутствовать.
Удобный вариант - отдельный "протокол": сброс цвета на листе и новое заполнение, в соответствии с текущим днем.
Либо вариант: сброс цвета на всем листе с исходной информацией.
 
Код
Sub Мяу()
    Dim r As Range, LastRow&
    Cells.FormatConditions.Delete    'Удалить все правила на листе
    LastRow = Range("E" & Rows.Count).End(xlUp).Row
    Set r = Range("B11:DR" & LastRow)
    With r
        .FormatConditions.Add Type:=xlExpression, Formula1:="=$E11=""отменен"""
        .FormatConditions.Add Type:=xlExpression, Formula1:="=$E11=""done"""
        .FormatConditions(.FormatConditions.Count).SetFirstPriority
        For i = 1 To .FormatConditions.Count
            With .FormatConditions(i)
                .Interior.ColorIndex = i + 2
                .StopIfTrue = False
            End With
        Next
    End With
End Sub
 
Спасибо каждому! Все идеи и рекомендации имеют смысл.
Касательно кода от RAN, проблему быстрого применения необходимого УФ решает за доли секунды! Если не уходить от УФ вообще , то это самое быстро исполняемое решение. Только пока не разобрался как работает применение УФ если в формуле всегда $E11, пояснение непонимания в приложении. Но исполняется и результат как надо!
 
Файл в приложении
Изменено: Dmitri - 15.10.2017 20:18:39
 
Цитата
Dmitri написал:
если в формуле всегда $E11,
Это значит столбец всегда "Е" а строка может меняться, если попадает под  условие - срабатывает то, что Вы ей назначили. Абсолютные и относительные ссылки - наберите в поисковике  :)  
 
Это я знаю, но когда формулы размножаешь на листе, то формулы получаются типа $E11 для строки 11, и $E2025  для строки 2025.  В соответствии с этим я и формировал формулы для условного форматирования - для каждой строки своя формула, а здесь применение идет верно - строка к строке, но в любой строке, в окне условного форматирования, одна и та же формула $E11=....  " это ввело в заблуждение
Страницы: 1
Читают тему
Наверх