在VBA中应用单个条件格式--非常慢

在VBA中应用单个条件格式--非常慢,vba,excel,conditional-formatting,Vba,Excel,Conditional Formatting,由于数据库的局限性,即它们不能使用mins和maxes的相对引用,我添加了一个单独的,我添加了一个单独的条件格式规则到每个单元格选择中,810行中有13列宽 不幸的是,在i5 4670k上执行此操作大约需要35分钟。在我正在运行的宏中会发生许多其他操作,但我已将速度问题与条件格式的应用程序隔离开来 有人对加速代码有什么建议吗?这是该程序的精简版本 for RowCounter = FirstRow to Lastrow for i = 0 to 12 ' Add Databars Range

由于数据库的局限性,即它们不能使用mins和maxes的相对引用,我添加了一个单独的,我添加了一个单独的条件格式规则到每个单元格选择中,810行中有13列宽

不幸的是,在i5 4670k上执行此操作大约需要35分钟。在我正在运行的宏中会发生许多其他操作,但我已将速度问题与条件格式的应用程序隔离开来

有人对加速代码有什么建议吗?这是该程序的精简版本

for RowCounter = FirstRow to Lastrow

for i = 0 to 12

' Add Databars
Range(FirstColumn & RowCounter).Offset(0, 2 * i).FormatConditions.AddDatabar
With Range(FirstColumn & RowCounter).Offset(0, 2 * i).FormatConditions(1)
    .MinPoint.Modify xlConditionValueNumber, 0
    .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:= _
        Range(FirstColumn & RowCounter).Offset(0, 2 * i + 1).Value
End With

Next i

Next RowCounter
编辑2:根据要求,这里是一个屏幕截图

基本上,有两种类型的列。需要格式化为绿色的列,以及格式化将基于黄色的列。对于每一行,我将查看其他每一列。在本例中,我将仅对绿色列应用格式设置—因此I*2偏移量。有时,如果单元格中的值不为空或单元格中的日期不为空,我希望应用条件格式。如果我这样做了,我想应用一个基于单元格的最大值的数据库,该单元格位于黄色列的右侧。最终,黄色列将被隐藏


编辑3:我找到了解决方案,请参见下文。问题在于部分代码正在删除单元格。有了如此大量的条件格式规则,这会大大降低任何单元格删除的速度,导致程序运行非常非常缓慢。

我终于找到了解决方案

程序的第一步是删除一些单元格

第二步是对每个单元格应用5000条条件格式规则


在所有这些规则仍然适用的情况下,试图删除单元格的速度非常缓慢。因此,编写此代码的最佳方法是首先删除所有单元格,然后在程序末尾应用所有条件格式。

是否可以将第一行的格式复制到其他809行?此外,如果在执行宏之前关闭计算和屏幕更新,也会有所帮助。另外,请确保您事先清除了所有以前的格式条件。太多的垃圾格式条件可能1导致格式错误,2破坏工作簿。据我所知,您不能只复制格式,因为最大引用是绝对的。另外,我有一些适用的逻辑,所以不是13个单元格中的每一个都有条件格式。我已经关闭了计算和屏幕更新。在宏的完整版本中,我认为它太大了,无法包含整个内容。最后,每次宏运行时,我都从一个新的工作表开始。整个工作表都会被提前删除。这些单元格的刷新不会花费太长时间。问题似乎是别的。你可以发布一个屏幕截图和一个你最终想要的格式的非常简单的例子,例如,单元格i,B的数据库的最小值来自单元格i,C,最大值来自单元格i,D,等等。如果您需要任何其他信息,请告诉我。
for RowCounter = FirstRow to Lastrow

for i = 0 to 12

' Add Databars
Range(FirstColumn & RowCounter).Offset(0, 2 * i).FormatConditions.AddDatabar
With Range(FirstColumn & RowCounter).Offset(0, 2 * i).FormatConditions(1)
    .MinPoint.Modify xlConditionValueNumber, 0
    .MaxPoint.Modify newtype:=xlConditionValueNumber, newvalue:= _
        Range(FirstColumn & RowCounter).Offset(0, 2 * i + 1).Value
End With

Next i

Next RowCounter