19

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

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
....

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

4 ответа4

12

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

Причина - копирование / вставка между ячейками или строками с использованием стандартного копирования / вставки. Исправление заключается в том, чтобы всегда использовать значение вставки или формулу вставки. На месте назначения щелкните правой кнопкой мыши, и в разделе «Параметры вставки» появятся 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 красный
4) Make = $ B $ 1:$ B $ 19, $ B $ 21:$ B $ 30 blue
Если бы вы скопировали / вставили только A10 в A20, Excel заметил бы одно и то же правило, применяемое как к источнику, так и к месту назначения, и не фрагментировал правила. Excel не достаточно умен, чтобы понять, как избежать фрагментации, когда копирование / вставка влияет на два или более условных формата.

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

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

5

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

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
1

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .