Excel - 条件格式化 - 插入行

26

在“应用于”中使用偏移或间接似乎不起作用。是否有其他方法可以防止插入行后条件格式破裂?

我有一个条件格式适用于范围例如 $O$19:$O$105。条件是“如果单元格值> 10”,则以红色格式化。

问题是 - 当我在Excel中插入行时,此格式化范围会分裂,我会得到2个格式化规则。例如,如果我在第20行插入新行,则范围为 $O$19,$O$21:$O$105 和 $O$20 的2个规则。

通常对于上述条件,如果规则分成多个范围可能并不重要。但是对于“突出显示前10个”的条件,它会导致不希望的结果。

我尝试了以下方法,但并没有取得太大的成功:

  1. 尝试使用间接函数-但Excel似乎会解析公式并保存格式化规则,因此无法按预期进行插入。
  2. 尝试使用偏移函数-在这里,Excel再次解析了与上述相同的范围。

有人知道如何编写条件格式,以防止行插入后破裂吗?

[编辑]我意识到插入行并不会导致条件格式规则分裂。我还将一行复制并粘贴到插入的行中,这才是问题所在。如果我选择特殊粘贴并仅选择公式,则一切正常。


如果内置的条件格式不符合您的特定情况,您可以始终通过依附于工作表更改方法并查找与要执行格式化的区域相交的方式,在VBA中自定义编码动态格式化规则。 - danielpiestrak
@Gimp 你有一个我可以开始的示例/片段吗?我已经使用过VBA,但还不是很擅长。 - ssp
在使用VBA之前,请将条件格式公式中的单元格引用更改为相对引用,而不是绝对引用。因此,将“$O$19:$O$105”更改为“O19:O105”。然后插入您的行并查看它是否按照您的预期工作。顺便说一句,欢迎来到SO! - Scott Holtzman
@scott-holtzman 谢谢!我尝试了你的建议,但不起作用。Excel会自动将其转换回$O19:$O$105,并且再次插入行会拆分范围。 - ssp
2
我现在没有时间研究这个,但我不会选择VBA。肯定有一个非 VBA 的解决方案。这也太“简单”了吧。看一下这个链接... 也许你需要更改你的格式范围...只是一个想法: http://www.excelforum.com/excel-programming-vba-macros/778585-inserting-new-rows-splits-conditional-format.html - Scott Holtzman
感谢大家抽出时间查看我的问题。 特别感谢@scott-holtzman的评论,促使我更仔细地检查并意识到了我的错误。 - ssp
17个回答

15

我知道这是一个老帖子,但这里有另一个超级简单且非常有效的解决方案。

只需按需插入新行或列。然后选择并复制具有正确条件格式的行/列。在您刚创建的新行/列中进行“特殊粘贴”,并选择“所有合并条件格式”选项。您的条件格式规则现在应该会自动更新。

快乐使用Excel =)


8
这是条件格式普遍存在的问题。如果您插入行或移动单元格,Excel会默认将条件格式与单元格一起移动,并且假定您希望插入具有其原始格式(或没有格式)的单元格。

因此,它会尽力根据更改拆分格式化范围。不幸的是,“尽力而为”效果并不好。在幸运的情况下,您的格式规则会被复制,而您却没有注意到;在不幸的情况下,它们可能会在应用的范围中某些或全部破裂。

如果您使用列表对象(也称为“Excel表格”),这尤其是一个问题。插入一些行,重新排序,拖动一些值,下次查看条件格式列表时,您可能会发现有数十个到数百个重复规则。(例如:http://blog.contextures.com/archives/2012/06/21/excel-2010-conditional-formatting-nightmare/

根据我的经验,解决混乱的最快方法是删除所有规则并重新创建它们(或不创建)。

一些附注:

  • 适用于的范围始终是绝对的。无法避免。
  • 更糟糕的是,条件格式被视为挥发性公式,意味着它们在许多场合(打开另一个文件,滚动等)上重新计算。如果您没有注意到拆分,它们可能会在一段时间后显著减慢整个应用程序。
  • 如果您使用VBA,您可能希望使用Worksheet_Calculate事件,至少如果您的公式引用其他工作表(请注意名称!)

谢谢您提供的信息:“适用范围始终是绝对的。没有任何变通的方法。”我一直在将新行添加到表格末尾,但Excel拒绝应用条件格式。现在我知道原因了。 - Pressacco

4
尽管这是一个相当老的话题,但我的Excel表格也遭受了在插入新行时重复应用条件格式的问题。
我能够解决这个问题。让我与其他人分享一下,这可能也有所帮助。
在我的情况下,所有的条件格式规则都适用于整个表格。我意识到,在插入新行时只会复制某些规则。这些规则基于公式,比较不同行中的值。
在我的情况下,我想要在两行相邻的值不同时呈现水平边框,例如:
=$A2 <> $A1

如果我使用OFFSET来引用上一行,则所有内容都是正确的,没有重复的条件格式规则。
=$A2<>OFFSET($A2; -1; 0)

实际上我将这些条件格式公式放在了一个隐藏列中,但结果应该是一样的。


1
非常好的答案!帮助我解决了长期存在的问题。但是它对我来说并没有像你展示的那样完全奏效。 我已经为整个列(例如范围 $C:$C)设置了自动格式化,即使使用 =$A2<>OFFSET($A2; -1; 0),仍然会在任何行插入时中断。 我必须修改的是修复所有引用到第一行的引用,例如:=$A1<>OFFSET($A1; -1; 0)。当我使用不同于1的任何其他行时,它会在每一行操作上中断。 - Jarek C
1
请注意,在非美国环境中,使用 OFFSET() 函数时最好使用 ";" 而不是 ","。请注意,OFFSET() 函数在您的 Excel 中可能有不同的名称(我讨厌这个功能)。 - Jarek C
感谢@JarekC的编辑建议,现在已经批准。我在一个公式中混淆了;和,。 - CraZ

3
我在创建报告时遇到了这个问题 - 一旦它们完成,它们就不需要改变,但是在制作它们时,我不断添加新行,每个新行都会破坏条件格式设置。
这绝不是一个好的解决方案,但是这是我找到的最好的解决方案,而不必诉诸VBA - 那就是:
a)将条件格式规则应用于一整列或更多列
例如,不要在C2和C17上设置条件格式,而是添加一个额外的列,并在第2行和第17行中写入“this one”,然后将整个C列的格式设置为“如果其他列说' this one ',则应用此格式”
b)将“适用范围”更改为仅为$ C $ 1:$ C $ 2。
c)进行更改并插入行等
d)然后返回并将“适用范围”更改为$ C:$ C
这样,当您更改和添加内容时,条件格式就不在那里,然后稍后将其全部放回去。
如果以后需要添加几行,请先将其从$ C:$ C更改为$ C $ 1:$ C $ 2,然后进行更改,然后将其放回$ C:$ C。这样,您不必像以前那样完全从头开始重新编写所有格式设置规则,只需删除它们并重新开始即可;)
显然,如果您计划在第1或2行的顶部插入行,则无法使用此方法,但是您可以将其设置为其他一些您知道不会更改的行。

1

这对我来说运行得很好...

Sub ConditionalFormattingRefresh()
'
' ConditionalFormattingRefresh Macro
'

'Generales
Dim sh As Worksheet
Dim tbl As ListObject
Dim selectedCell As Range
Set sh = ActiveSheet
Set tbl = Range("Plan").ListObject
Set selectedCell = ActiveCell

'Rango a copiar
Dim copyRow As Range
Set copyRow = tbl.ListRows(1).Range

'Rango a restaurar
Dim startCell As Range
Dim finalCell As Range
Dim refreshRange As Range
Set startCell = tbl.DataBodyRange.Cells(2, 1)
Set finalCell = tbl.DataBodyRange.Cells(tbl.ListRows.Count, tbl.ListColumns.Count)
Set refreshRange = Range(startCell.Address, finalCell)

'Ocultar procesamiento
Application.ScreenUpdating = False
Application.EnableEvents = False

'Borrar formato corrupto
refreshRange.FormatConditions.Delete

'Copiar
copyRow.Copy
'Pegar formato
tbl.DataBodyRange.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

'Retornar a la normalidad
selectedCell.Select
    Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

1
当您插入一行时,不要从其他行复制格式,只需使用“特殊粘贴”功能复制公式。这样,条件格式就不会被分割。

1
我知道这是一篇旧文章,但我遇到了同样的问题,并且已经找到了不受分割条件格式规则影响的方法。
在我的Excel 2010电子表格中,我将日期输入到B列中。有时我会误输入日期,这就是为什么我想要有条件地进行格式化的原因。最初,我选择了一个范围(B2:B1960),所以我的条件格式规则中的公式为“=B2:B1960>TODAY()”。
嗯,这很好用,直到我想在现有行之间插入新行。规则会像OP描述的那样被拆分。我碰巧看了几个不同的网站,并找到了一个指向答案的Microsoft Office网站。它提到要突出显示您想要格式化的范围,但将公式更改为“=B2>TODAY()”。
自从更改了公式以后,我现在可以在现有行之间插入新行,而不会像以前那样被拆分规则。这是该网页的链接。 http://office.microsoft.com/en-us/excel-help/use-a-formula-to-apply-conditional-formatting-HA102809768.aspx

1
你需要做的是: 1) 插入一行新的数据 2) 复制需要克隆的行 3) 粘贴特殊格式“合并条件格式”
这不够直观,如果你想让其他人分享你创建的工作簿,那么需要进行大量用户培训。

按照确切的步骤操作对我无效。但是,先复制另一行,然后进行特殊粘贴合并条件会起作用。还可以节省一个步骤。 - Trashman

1

我对这个问题的解决方案是清除源副本的格式。

  1. 将源代码复制到剪贴板上
  2. 打开一个新的Excel文档
  3. 选择“粘贴特殊”,选择公式(复制值和公式,省略格式)
  4. 将其复制到剪贴板上
  5. 现在你可以将其粘贴回使用之前的源文件中,或者将空行插入具有条件格式的工作表中(注意,仅插入行不会更改条件格式规则的范围),然后将剪贴板内容粘贴到新行中。

这在我使用MS Excel 2016时有效。


1

我同意之前发布的内容;复制并粘贴数值(或粘贴公式)将完全有效,不会分割条件格式。

我有点懒。而且我不想让使用我的电子表格的人去做那些事情。我也不确定他们是否会记得复制并粘贴数值。 :(

我不知道这个解决方案是否适用于您的需求,但我采取了删除所有条件格式并在每次打开工作簿时重新应用正确的条件格式。

因为这个宏每次打开工作簿时都会运行,所以用户不需要改变复制和粘贴的方式。他们不需要知道宏甚至存在。他们不需要手动运行宏;它是自动的。我觉得这创造了更好的用户体验。

请记住,此代码需要复制并粘贴到“此工作簿”模块中,而不是常规模块中。

Private Sub Workbook_Open()
'This will delete all conditional formatting and reapply the conditional formatting properly.
'After copying and pasting the conditional formatting get split into two or more conditional formattings. After a few
'weeks there are so many conditional formattings that Excel crashes and has to recover.

Dim ws As Worksheet, starting_ws As Worksheet


Set starting_ws = ActiveSheet   'remember which worksheet is active in the beginning
Application.ScreenUpdating = False
For Each ws In ThisWorkbook.Worksheets
    If ws.Name <> "InvErr" Then
        ws.Activate
        Cells.FormatConditions.Delete
        ''Every Other Row Tan
        Range("A4:M203").FormatConditions.Add Type:=xlExpression, Formula1:="=ISODD(ROW(A4))"
        Range("A4:M203").FormatConditions(Range("A4:M203").FormatConditions.Count).SetFirstPriority
        Range("A4:M203").FormatConditions(1).Interior.PatternColorIndex = xlAutomatic
        Range("A4:M203").FormatConditions(1).Interior.ThemeColor = xlThemeColorDark2
        Range("A4:M203").FormatConditions(1).Interior.TintAndShade = 0
        Range("A4:M203").FormatConditions(1).StopIfTrue = False

        ''Highlight Duplicates Red
        Columns("B").FormatConditions.AddUniqueValues
        Columns("B").FormatConditions(Columns("B").FormatConditions.Count).SetFirstPriority
        Columns("B").FormatConditions(1).DupeUnique = xlDuplicate
        Columns("B").FormatConditions(1).Font.Color = -16383844
        Columns("B").FormatConditions(1).Font.TintAndShade = 0
        Columns("B").FormatConditions(1).Interior.PatternColorIndex = xlAutomatic
        Columns("B").FormatConditions(1).Interior.Color = 13551615
        Columns("B").FormatConditions(1).Interior.TintAndShade = 0
        Columns("B").FormatConditions(1).StopIfTrue = False
    End If
Next

starting_ws.Activate   'activate the worksheet that was originally active
Application.ScreenUpdating = True

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接