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

有什么好的方法可以防止这种情况发生,或者当规则集变得凌乱时,我注定要手动清理它们吗?

Answers:


13

插入和删除行不会导致条件格式变得零散。

原因是使用标准复制/粘贴在单元格或行之间复制/粘贴。解决方法是始终使用粘贴值或粘贴公式。在目标上,单击鼠标右键,然后“粘贴选项”部分将提供123(值)和f(公式)。不要复制/粘贴格式,因为这会导致条件被复制/粘贴,有时它们会变得支离破碎。

当您执行标准复制/粘贴操作时,它还会复制单元格的条件公式。假设您有两个规则:
1)使$ A $ 1:$ A $ 30红色
2)使$ B $ 1:$ B $ 30蓝色
现在选择A10:B10并将其复制/粘贴到A20:B20。Excel要做的是从应用于这些单元格的规则中删除A20:B20的条件格式,并添加具有A20:B20格式的新规则。您最终有四个规则。
1)使= $ A $ 20红色
2)使= $ B $ 20蓝色
3)使= $ A $ 1:$ A $ 19,$ A $ 21:$ A $ 30红色
4)使= $ B $ 1:$ B $ 19,$ B $ 21:$ B $ 30蓝色
如果您仅将A10复制/粘贴到A20,则Excel会注意到同一规则同时应用于源和目标,并且不会分散规则。Excel不够聪明,无法弄清楚当复制/粘贴影响两种或多种条件格式时如何避免碎片。

插入和删除行不会引起碎片,因为Excel只是简单地扩展或缩小覆盖您在其中插入或删除行的区域的条件规则。

有人建议使用$ Q:$ Q而不是$ Q $ 1:$ Q $ 30。这无济于事,如上所述,当您复制/粘贴单元格格式时,您仍然会碎片化。


还要注意,Cut <kbd> ctrl-x <kbd>将从单元格cut中删除条件格式(现在该单元格没有格式),并将格式粘贴到新单元格中。我敢打赌有人知道如何防止这种情况发生?
user5389726598465

@ user135711这取决于您要执行的操作。默认情况下,复制和剪切都会获取源单元格的公式,格式和链接,而剪切也会从源单元格中删除它们。如果要从源中删除公式/值但要保持格式,我将把内容复制/粘贴到目标位置,然后删除源。删除(Del键)仅清除公式或值。它保留了格式和链接。
user3347790'5

1
INDIRECT()函数在该问题的另一个版本中被认为是答案,因此不起作用,因为在“应用于”字段中使用它时,它会像对您手动输入的单元格一样对单元格进行求值。
user5389726598465

superuser.com/a/1113566/79488提供了一个很好的解决方法,用于清理如果您使用复制/定

5

将条件格式应用于表的列时遇到相同的问题。添加行时,我发现最好使用$A:$A或任意列将规则应用于整个列。

在此处输入图片说明


以我的经验,当工作表变大时,这样做会使条件格式变得肿,并且可以将计算简化为爬网。
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
请不要对多个问题发布相同的答案。如果相同的信息确实回答了两个问题,则应关闭一个问题(通常是较新的问题),作为另一个问题的重复。您可以通过投票将其关闭作为重复项来表明这一点,或者,如果您没有足够的声誉,可以举一个标志来表明它是重复项。否则,请针对这个问题量身定制答案,而不仅仅是在多个地方粘贴相同的答案。
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.