【问题标题】:How to apply conditional formatting formula to large range faster如何更快地将条件格式公式应用于大范围
【发布时间】:2016-05-13 01:13:32
【问题描述】:

我创建了一个条件格式公式

=AND(SUMPRODUCT(($A$2:$A$" & lastRow & "=$A2)*($CT$2:$CT$" & lastRow & "=$CT2)*($CU$2:$CU$" & lastRow & "=$CU2)*($CV$2:$CV$" & lastRow & "=$CV2)*($CW$2:$CW$" & lastRow & "=$CW2))>1,$CT2 <> """")"

要根据多个条件查找并突出显示重复的附加费: 产品的 XID(A 列)、Upcharge 标准 1(CT 列)、Upcharge 标准 2(CU 列)、Upcharge 类型(CV 列)和 Upcharge 水平(CW 列)。这个公式就像一个突出重复的附加费的魅力。但是,大部分时间我必须将它应用于大量行(超过 15000 行),并且需要 10 多分钟才能应用条件格式公式。我很好奇是否有更快的方法将此公式应用于那么多单元格。我的整个参考代码是

'File Complete, highlights duplicate upcharges for products and skips over blank upcharge rows
Sub dupUpchargeCheck()

Dim lastRow As Integer
lastRow = ActiveSheet.Cells(Rows.Count, "CS").End(xlUp).Row
ActiveSheet.Range("CS2:CS" & lastRow).Select
With ActiveSheet.Range("CS2:CS" & lastRow)
    .FormatConditions.Add Type:=xlExpression, Formula1:="=AND(SUMPRODUCT(($A$2:$A$" & lastRow & "=$A2)*($CT$2:$CT$" & lastRow & "=$CT2)*($CU$2:$CU$" & lastRow & "=$CU2)*($CV$2:$CV$" & lastRow & "=$CV2)*($CW$2:$CW$" & lastRow & "=$CW2))>1,$CT2 <> """")"
    .FormatConditions(.FormatConditions.Count).Interior.ColorIndex = 3
End With

End Sub

感谢任何建议!

编辑:

玩弄了一下之后,我意识到我的问题不在于将条件格式公式应用于单元格范围,而是实际上当我单击下拉菜单以过滤颜色时(在代码为运行并应用条件格式)过滤器下拉框需要永远出现(我假设是因为当时所有的公式都在计算?)。知道如何解决这个问题吗?我已经尝试过@Nate 的建议之一 @ 987654323@,将它放在我过滤(通过vba)的行之前,希望它会在系统试图显示过滤器框时停止计算,但它仍然需要永远。加上Application.ScreenUpdating = False,处理时间会稍微减少(15000 行的时间约为 551 秒)。除非其他人有任何建议,否则恐怕这可能是我能得到的最好的了?

【问题讨论】:

  • 如果您使用的是 Excel 2007 或更高版本,请使用 COUNTIFS 而不是 SUMPRODUCT
  • 找到重复项并用颜色标记它们的最终目标是什么?你想删除它们或将它们存储在其他地方还是什么?它实际上可能会更优雅地解决。
  • 不,解决方案要复杂得多。基本上,必须在每对副本中的一个上更改某些内容(无论是更改 Upcharge 类型还是 Upcharge 级别等),因此它们并不完全相同。所有附加费必须保留。

标签: vba excel excel-formula conditional-formatting


【解决方案1】:

尝试在编写代码之前关闭一些 Excel 功能,然后在完成后重新打开它们。

' turn off unnecessary excel features, put before your code
screenUpdateState = Application.ScreenUpdating
statusBarState = Application.DisplayStatusBar
calcState = Application.Calculation
eventsState = Application.EnableEvents
displayPageBreakState = ActiveSheet.DisplayPageBreaks
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False

然后

' Turn features back on
Application.ScreenUpdating = screenUpdateState
Application.DisplayStatusBar = statusBarState
Application.Calculation = calcState
Application.EnableEvents = eventsState
ActiveSheet.DisplayPageBreaks = displayPageBreaksState

【讨论】:

  • 这不会加速实际计算;您将其转为 xlCalculationManual 并将其重新设置。 Excel 只会在发生这种情况时进行计算,然后仍然需要等待 10 分钟。确实,通常这会在引用单元格等时加快宏的执行速度。
  • 这对我来说仍然是有用的信息,因为我可以使用它来加速我的整体宏(一个更大的项目),所以谢谢。我已经意识到我的问题出在哪里,并且不在公式的应用过程中,而是在应用公式后的任何时候尝试过滤该列时。我已经更新了我的问题以反映这一点。
  • 我刚刚意识到我可能没有正确实现'calcstate = Application.Calculation'代码,因为我刚刚添加了那行代码并省略了第二部分'Application.Calculation = xlCalculationManual' .尽管@RikSportel 谈到在将条件格式公式应用于范围之前将其关闭是有道理的,但这在我的情况下是否真的有帮助,因为它有助于在条件格式格式应用于范围之后更快地过滤?
【解决方案2】:

这对我之前没有帮助,但我希望它对你有所帮助,正如this link 所说:

这在条件应用范围很大时特别有用,因为在这些情况下性能可能会很慢。

ActiveSheet.EnableFormatConditionsCalculation = False

'.....

ActiveSheet.EnableFormatConditionsCalculation = True

也许这不适用于 MAC。 ActiveSheet.EnableFormatConditionsCalculation Not Supported in VBA for Excel 2011 on the Mac

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多