實例需求:數據總行數不確定,現需要將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 WorksheetDim rngData As RangeDim lastRow As Long, i As LongDim objFC As FormatConditionSet objSht = ThisWorkbook.Sheets("CSDN")With objSht.CellsFor i = .FormatConditions.Count To 1 Step -1.FormatConditions(i).DeleteNextEnd WithlastRow = objSht.Cells(objSht.Rows.Count, "A").End(xlUp).RowSet 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:=3End With
End Sub
【代碼解析】
第6行代碼獲取工作表對象。
第7~10行代碼循環遍歷刪除工作表中的全部條件格式,刪除對象時應使用倒序循環,否則可能會出現遺漏或者運行時錯誤。
第12行代碼獲取最后數據行的行號。
第15行代碼添加條件格式,使得無關單元格不會被填充顏色。
第16行代碼設置“如果為真則停止”,即后續條件格式不再有效。
第17行代碼添加色階條件格式。
運行代碼創建的條件格式如下所示。
擴展知識:
如果工作表中已經存在條件格式(例如本示例中的色階),使用代碼添加添加新的條件格式,新規則將被添加至原規則之下,那么可以使用如下代碼調整規則次序。
With rngData.FormatConditions.Add Type:=xlExpression, Formula1:="=NOT($B3+0.5=C$2)"End WithrngData.FormatConditions(rngData.FormatConditions.Count).SetFirstPriorityrngData.FormatConditions(1).StopIfTrue = True
微軟文檔:
FormatCondition.StopIfTrue property (Excel)
FormatCondition.SetFirstPriority method (Excel)
Range.FormatConditions property (Excel)