【问题标题】:Conditional Formatting based on cell color基于单元格颜色的条件格式
【发布时间】:2017-12-05 22:43:42
【问题描述】:

考虑一个包含 3 列的列表。

  • 第 1 列包含日期列表。
  • 第 2 列包含固定值、特殊日子(例如国定假日(复活节)和特殊日子(例如母亲节)。
  • 第 3 列包含用户定义的事件。

第 2 列通过 VBA 代码填充,国定假日用相同的代码涂成蓝色,但母亲节等特殊日子则不是。用户无法操作此列。

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

问题是,如果某个活动恰逢国定假日,蓝色会被覆盖。

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

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

如果满足这两个条件,则将设置图案颜色、图案样式和背景颜色,因此我将获得两种颜色的组合。

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

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

【问题讨论】:

    标签: excel conditional-formatting


    【解决方案1】:

    我认为您需要创建一个新的 VBA 函数来确定单元格是否是特定颜色。例如,以下代码可用于确定区域中的单元格是否为蓝色:

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

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

    =CheckIfBlue(B5)
    

    艾伦·怀亚特有一个good article on conditionally taking an action depending on a cell's color

    【讨论】:

    • 看来,为了实现我的目标,我可能需要完全放弃条件格式并添加一个检查条件的Worksheet_Change() 例程。然而问题是工作表本身是由代码添加和构建的。
    • @SilentRevolution - 如果您在添加新工作表时有一个完整的带有事件代码的隐藏工作表作为模板,则新工作表将带有一个新的工作表代码表。您还可以尝试涵盖各种工作表的 Workbook_SheetChange。
    • @Jeeped,这当然是一个选择,但目前我已经通过使用和更改 this solution 的版本解决了这个特定问题。
    【解决方案2】:

    您必须添加 3 条规则

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


    R2:and(not(user defined event); Holiday) > blue.


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


    在条件格式对话框中勾选R1、R2最右边的复选框。

    【讨论】:

    • 如果第二列只填充了国定假日,这将工作,所有这些都是蓝色的。然而,事实并非如此。第二列中只有一些(但不是全部)条目是公共假期,只有那些是蓝色的,如果它们与用户定义的事件相吻合,则需要混合颜色。
    【解决方案3】:

    我解决此问题的方法只是将条件格式全部丢弃并添加Worksheet_Change() 事件。相应地检查条件和格式。

    请注意,这是一种非常艰巨的方法,但它完成了工作。如果条件格式的构建包含一种将格式作为可能条件包含在内的方法,那就容易多了。

    作为旁注,由于工作表是通过代码添加的,因此它们本身不包含此代码,但它位于名为 clsEventsClassModule 中。

    ClassModule中的声明

    Public WithEvents chngSht As Worksheet
    

    Module 中的声明,其中 sub 是添加工作表的地方

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多