如何更快地将条件格式化公式应用于大范围

时间:2016-02-03 17:33:44

标签: excel vba excel-vba excel-formula conditional-formatting

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

=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 <> """")"

寻找&amp;根据多个条件突出显示重复的增加费用: 产品的XID(A列),上行标准1(列CT),上行标准2(列CU),上行类型(列CV)和上行电平(列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的一个建议 calcState = Application.Calculation,将它放在我过滤的行(通过vba)之前,希望它会在系统尝试显示过滤器框时停止计算运行,但它仍然需要永远。添加Application.ScreenUpdating = False时,处理时间略短(15000行的时间约为551秒)。我担心除非别人有任何建议,否则我能做到最好吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这对我之前没有帮助,但我希望它可以帮助你this link说:

  

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

ActiveSheet.EnableFormatConditionsCalculation = False

'.....

ActiveSheet.EnableFormatConditionsCalculation = True

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