Фрагментация условного форматирования Excel

22

Часто я создаю лист с условным форматированием и устанавливаю диапазоны ячеек так, чтобы правила условного форматирования применялись только один раз к диапазону ячеек, например

Make $A$1:$A$30 red and
Make $B$1:$B$30 blue.

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

Make $A$1:$A$2 red 
Make $A$3:$A$4 red 
Make $A$5:$A$9 red
Make $A$10:$A$20 red 
Make $A$21:$A$30 red
...
Make $B$1:$B$2 blue 
Make $B$3:$B$4 blue
Make $B$5:$B$9 blue
Make $B$10:$B$20 blue 
Make $B$21:$B$30 blue
....

Есть ли хороший способ предотвратить это, или я обречен на очистку наборов правил вручную, когда они становятся слишком грязными?

Рис Гибсон
источник

Ответы:

13

Вставка и удаление строк не приводит к фрагментации условного форматирования.

Причина - копирование / вставка между ячейками или строками с использованием стандартного копирования / вставки. Исправление заключается в том, чтобы всегда использовать значение вставки или формулу вставки. На месте назначения щелкните правой кнопкой мыши и в разделе «Параметры вставки» появятся 123 (значения) и f (формулы). Не копируйте / вставляйте форматирование, поскольку это приводит к тому, что условия копируются / вставляются, а иногда они будут фрагментированы.

Когда вы делаете стандартное копирование / вставку, оно также копирует условные формулы ячейки. Допустим, у вас есть два правила:
1) Сделайте $ A $ 1: $ A $ 30 красным
2) Сделайте $ B $ 1: $ B $ 30 синим.
Теперь выберите A10: B10 и скопируйте / вставьте его в A20: B20. Excel будет удалять условное форматирование для A20: B20 из правил, которые применяются к этим ячейкам, и добавлять новые правила, имеющие форматирование для A20: B20. Вы в конечном итоге с четырьмя правилами.
1) Make = $ A $ 20 red
2) Make = $ B $ 20 blue
3) Make = $ A $ 1: $ A $ 19, $ A $ 21: $ A $ 30 red
4) Make = $ B $ 1: $ B $ 19, $ B 21 $: $ B $ 30 синий
Если бы вы скопировали / вставили только A10 в A20, Excel заметил бы одно и то же правило, применяемое как к источнику, так и к месту назначения, и не фрагментирует правила. Excel не достаточно умен, чтобы понять, как избежать фрагментации, когда копирование / вставка влияет на два или более условных формата.

Вставка и удаление строк не приводит к фрагментации, так как Excel просто расширяет или сокращает правило (правила) условия, которые охватывают область, в которую вы вставили или удалили строку.

Кто-то предложил использовать $ Q: $ Q вместо $ Q $ 1: $ Q $ 30. Это не поможет, и вы все равно получите фрагментацию при копировании / вставке форматирования ячеек, как указано выше.

user3347790
источник
Также обратите внимание, что Cut <kbd> ctrl-x <kbd> удалит условное форматирование из среза ячейки (теперь ячейка не имеет форматирования) и вставит форматирование в новую ячейку. Держу пари, кто-то там знает, как это предотвратить?
user5389726598465
@ user135711 Это зависит от того, что вы пытаетесь сделать. По умолчанию копируют и вырезают, выбирают формулы, форматирование и ссылки исходной ячейки, а вырезка также удаляет их из исходной ячейки. Если целью является удаление формулы / значения из источника, но для сохранения форматирования, я скопирую / вставлю материал в место назначения, а затем удалю источник. Удалить (клавиша Del) очищает только формулу или значение. Это оставляет форматирование и ссылки на месте.
user3347790
1
Функция INDIRECT (), за которую проголосовали как за ответ в другой версии этого вопроса, не работает, потому что она оценивается для ячеек при использовании в поле применения к полю, как если бы вы вводили ячейки вручную.
user5389726598465
На superuser.com/a/1113566/79488 есть хороший обходной путь для очистки фрагментированных правил, если вы использовали копирование / pase
Фабиан Шмид,
5

Была такая же проблема при применении условного формата к столбцу таблицы. При добавлении строк я обнаружил, что лучше всего применять правило ко всему столбцу, используя тот $A:$Aили иной столбец.

введите описание изображения здесь

CharlieRB
источник
По моему опыту, когда рабочий лист становится немного больше, выполнение этого приведет к тому, что условные форматы станут раздутыми, а вычисления могут быть сокращены до сканирования.
rohrl77
3

(Это обходной путь, поэтому я собирался поместить его в качестве комментария, но мне не хватает репутации.)

К сожалению, кажется, что вы обречены на очистку наборов правил, когда они становятся грязными.

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

Если вам нужно выполнить очистку, перейдите на этот рабочий лист, щелкните правой кнопкой мыши кнопку « Выбрать все» , выберите « Редактор формата» , затем нажмите кнопку « Выбрать все» на исходном рабочем листе. Форматы перезаписываются неиспользованной версией.


источник
2

Копирование / вставка / вырезание / вставка ячеек вручную вызывает проблему, и ее трудно избежать.

Проблема решена через макрос VBA.

Вместо того, чтобы копировать / вставлять / вырезать / вставлять ячейки вручную, я делаю это с помощью макроса Excel, который сохраняет диапазоны ячеек (активируется с помощью кнопки).

Sub addAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows.Add (currentRowIndex)
    Set currentCell = Table.DataBodyRange.Cells(currentRowIndex, Table.ListColumns("Column name").Index)
    currentCell.Value = "Cell value"
    Call setCreateButtons
End Sub

Sub removeAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows(currentRowIndex - 1).Delete
End Sub

Sub setCreateButtons()
    Set Table = ActiveSheet.ListObjects("Table name")
    ActiveSheet.Buttons.Delete
    For x = 1 To Table.Range.Rows.Count
        For y = 1 To Table.Range.Columns.Count

            If y = Table.ListColumns("Column name").Index Then
                Set cell = Table.Range.Cells(x, y)
                If cell.Text = "Some condition" Then
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - 2 * cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "-"
                    btn.OnAction = "removeAndBtnClick"
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "+"
                    btn.OnAction = "addAndBtnClick"
                End If
            End If
        Next
    Next
End Sub

Чтобы сбросить форматирование (не очень нужно):

Sub setCondFormat()
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.Range.FormatConditions.Delete
    With Table.ListColumns("Column name").DataBodyRange.FormatConditions _
        .Add(xlExpression, xlEqual, "=ISTLEER(A2)") 'Rule goes here
        With .Interior
            .ColorIndex = 3 'Formatting goes here
        End With
    End With
    ...
End Sub
Питер Герхат
источник
3
Пожалуйста, не размещайте один и тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, то один вопрос (обычно более новый) следует закрыть как дубликат другого. Вы можете указать это, проголосовав, чтобы закрыть его как дубликат, или, если у вас недостаточно репутации, поднять флаг, чтобы указать, что это дубликат. В противном случае настройте свой ответ на этот вопрос, а не просто вставляйте один и тот же ответ в нескольких местах.
ДэвидПостилл