实例需求:数据总行数不确定,现需要将Category区域(即C列到J列)中第3行开始的区域设置条件格式,规则如下:
- 只对部分指定单元格应用色阶条件格式(3色)
- 指定单元格应满足条件:该行
B列+0.5
等于该列第2行的值(Category),例如对于第6行,B6+0.5
值为3,对应Category为3的列为E列,因此E6单元格应用色阶条件格式,该行其他单元格无填充色
效果如下所示。
首先想到的实现思路可能是:根据B列的值定位每行需要设置色阶的单元格,使用Union
组合为一个Range对象,然后设置色阶条件格式,这种方式可以实现,但是如果用户修改了B列数据,那么需要重现运行代码才能获取正确的条件格式。
下面用另外一种更通用的方法来实现这个需求,为整个数据区域创建两个条件格式规则
- 第一个规则筛选无需应用色阶条件格式的单元格,设置格式为无格式,并且启用“如果为真则停止”,避免受第二个规则的影响
- 第二个规则应用色阶条件格式
示例代码如下。
Sub HeatMapColorScale()
Dim objSht As Worksheet
Dim rngData As Range
Dim lastRow As Long, i As Long
Dim objFC As FormatCondition
Set objSht = ThisWorkbook.Sheets("CSDN")
With objSht.Cells
For i = .FormatConditions.Count To 1 Step -1
.FormatConditions(i).Delete
Next
End With
lastRow = objSht.Cells(objSht.Rows.Count, "A").End(xlUp).Row
Set rngData = objSht.Range("C3:I" & lastRow)
With rngData.FormatConditions
.Add Type:=xlExpression, Formula1:="=NOT($B3+0.5=C$2)"
.Item(1).StopIfTrue = True
.AddColorScale ColorScaleType:=3
End With
End Sub
【代码解析】
第6行代码获取工作表对象。
第7~10行代码循环遍历删除工作表中的全部条件格式,删除对象时应使用倒序循环,否则可能会出现遗漏或者运行时错误。
第12行代码获取最后数据行的行号。
第15行代码添加条件格式,使得无关单元格不会被填充颜色。
第16行代码设置“如果为真则停止”,即后续条件格式不再有效。
第17行代码添加色阶条件格式。
运行代码创建的条件格式如下所示。
扩展知识:
如果工作表中已经存在条件格式(例如本示例中的色阶),使用代码添加添加新的条件格式,新规则将被添加至原规则之下,那么可以使用如下代码调整规则次序。
With rngData.FormatConditions
.Add Type:=xlExpression, Formula1:="=NOT($B3+0.5=C$2)"
End With
rngData.FormatConditions(rngData.FormatConditions.Count).SetFirstPriority
rngData.FormatConditions(1).StopIfTrue = True
微软文档:
FormatCondition.StopIfTrue property (Excel)
FormatCondition.SetFirstPriority method (Excel)
Range.FormatConditions property (Excel)