基于单元格颜色的条件格式化

考虑一个有3列的列表。

  • 第1列包含date列表。
  • 第2栏为固定值,特殊日子如国定假日(复活节)和特殊日子如Mothersday。
  • 列3保存用户定义的事件。

第2列是通过VBA代码填充,国家法定节假日由相同的代码蓝色,但特殊的日子,如Mothersday不是。 用户不能操纵这个列。

第3列由工作表本身的用户填充。 如果用户在第三列中添加事件,则通过条件格式将该行标记为绿色。

问题是,如果一个事件与国定假日一致,则蓝颜色被覆盖。

我的目标是添加第二个条件格式规则,检查:

  1. 用户定义的事件被添加
  2. 该行的颜色是蓝色的

如果两个条件都满足,则将设置图案颜色,图案样式和背景颜色,以便获得两种颜色的组合。

如果只满足第一个条件,则只设置背景颜色。

简而言之:我需要一种方法来检查单元格颜色,并将其合并到条件格式规则中。

我认为你需要创build一个新的VBA函数来确定一个单元格是否是特定的颜色。 例如,下面的代码可以用来确定一个范围内的单元格是否是蓝色的:

If range.Interior.Color = RGB(0, 0, 256) Then colorAction = "Something" 

然后,从单元格的macros中调用VBA函数。

 =CheckIfBlue(B5) 

艾伦·怀亚特(Allen Wyatt)有一篇很好的文章,根据细胞的颜色有条件地采取行动 。

你必须添加3个规则

R1 :和(用户定义的事件;不(假日))>绿色。


R2 :和(不是(用户定义的事件);假日)>蓝色。


R3 :和(用户定义的事件;假日)>混合颜色。


在条件格式对话框中检查R1,R2最右边的checkbox。

我这样做的方式是把条件格式放在一起,并添加一个Worksheet_Change()事件。 其中检查相应的条件和格式。

请注意,这是一个非常艰巨的方法,但它完成了工作。 如果条件格式的构build将包含格式化作为可能条件的方式,那将会更容易。

作为旁注,因为这些表是由代码添加的,所以它们本身不包含这个代码,但是它们位于一个名为clsEventsClassModule

ClassModule声明

 Public WithEvents chngSht As Worksheet 

Module中声明添加工作表的子工具

 Dim arrShts() as New clsEvents 

添加工作表或打开工作簿时,调用该子工作表

 Sub shtEvents() Dim sht As Worksheet Erase arrShts ReDim arrShts(0) For Each sht In ThisWorkbook.Worksheets If Not sht.Name = "Menu" And Not sht.Name = "Tabellen" Then If UBound(arrShts) = 0 Then ReDim arrShts(1 To 1) Else ReDim Preserve arrShts(1 To UBound(arrShts) + 1) End If Set arrShts(UBound(arrShts)).chngSht = sht End If Next End Sub 

有条件格式的实际代码。

 Private Sub chngSht_Change(ByVal Target As Range) Dim sht As Worksheet Dim x As Long, y As Long Dim arrRange(1 To 4) As Range Dim blnWeekend As Boolean Set sht = Target.Parent With sht .Unprotect x = 1 For y = 1 To 13 Step 4 Set arrRange(x) = .Range(.Cells(4, y).Offset(0, 2), .Cells(.Rows.Count, y).End(xlUp).Offset(0, 2)) 'Gather the 4 quarters of the year in 4 seperate ranges in an array. x = x + 1 Next For x = 1 To 4 'Iterate through the quarters of the year If Not Intersect(Target, arrRange(x)) Is Nothing Then 'Check if the event changed is in Q1, Q2, Q3 or Q4, or not blnWeekend = fnblnWeekend(Target.Offset(0, -2)) 'Check if the date falls in a weekend With .Range(Target, Target.Offset(0, -2)).Interior Select Case True Case Target = Empty And Target.Offset(0, -1) = Empty And Not blnWeekend 'Event removed, no national holiday or other special day, and date is not a weekend .Color = RGB(255, 255, 255) .PatternColor = xlAutomatic .Pattern = xlNone Case Target = Empty And Target.Offset(0, -1) = Empty And blnWeekend 'Event removed, no national holiday or other special day, and date is in a weekend .Color = RGB(255, 255, 204) .PatternColor = xlAutomatic .Pattern = xlSolid Case Target = Empty And Not Target.Offset(0, -1) = Empty And Not blnWeekend 'Event removed, possibly national holiday or other special day, and dat is not in a weekend Select Case True Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday .Color = RGB(91, 155, 213) .PatternColor = xlAutomatic .Pattern = xlSolid Case Target.Offset(0, -1).Interior.Color = RGB(198, 239, 206) 'Color of changed date does not indicate a National Holiday .Color = RGB(255, 255, 255) .PatternColor = xlAutomatic .Pattern = xlNone End Select Case Target = Empty And Not Target.Offset(0, -1) = Empty And blnWeekend 'Event removed, possibly a national holiday or other special day, and the date is in a weekend Select Case True Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday .Color = RGB(91, 155, 213) .PatternColor = xlAutomatic .Pattern = xlSolid Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 204) 'Color of changed date does not indicate a National Holiday .Color = RGB(255, 255, 204) .PatternColor = xlAutomatic .Pattern = xlSolid End Select Case Not Target = Empty And Target.Offset(0, -1) = Empty And Not blnWeekend 'Event added, no National Holiday or other special day, and date is not a weekend .Color = RGB(198, 239, 206) .PatternColor = xlAutomatic .Pattern = xlSolid Case Not Target = Empty And Target.Offset(0, -1) = Empty And blnWeekend 'Event added, no National Holiday or other special day, and date is in a weekend .Color = RGB(255, 255, 204) .PatternColor = RGB(198, 239, 206) .Pattern = xlUp Case Not Target = Empty And Not Target.Offset(0, -1) = Empty And Not blnWeekend 'Event added, possibly National Holiday or other special day, and the date is not in a weekend Select Case True Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday .Color = RGB(91, 155, 213) .PatternColor = RGB(198, 239, 206) .Pattern = xlUp Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 255) 'Color of changed date does not indicate a National Holiday .Color = RGB(198, 239, 206) .PatternColor = xlAutomatic .Pattern = xlSolid End Select Case Not Target = Empty And Not Target.Offset(0, -1) = Empty And blnWeekend 'Event added, possibly National Holiday or otheer special day, and date is not a weekend Select Case True Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday .Color = RGB(91, 155, 213) .PatternColor = RGB(198, 239, 206) .Pattern = xlUp Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 204) 'Color of changed date does not indicate a National Holiday .Color = RGB(255, 255, 204) .PatternColor = RGB(198, 239, 206) .Pattern = xlUp End Select End Select End With Exit For End If Next .Protect End With End Sub