【问题标题】:Change the color of a table rows with a condition使用条件更改表格行的颜色
【发布时间】:2020-06-12 16:00:08
【问题描述】:

如果单元格的内容与以前不同,我正在尝试编写 VBA 以更改表格行的颜色(在两个不同的颜色之间)。 第 n 行。 3必须有这个颜色:RGB(221,245,253),而另一种颜色是白色。 我无法弄清楚哪个是逻辑代码以及如何在不更改字体颜色的情况下更改单元格的背景颜色。

Public Sub Overview()

Dim Ovtask As String
Dim Ovn, Ovi As Integer

Ovn = Range("B2").CurrentRegion.Rows.Count

Range("B3:C3").Font.Color = RGB(221, 245, 253)
For Ovi = 3 To Ovn + 1
Ovtask = Range("B" & Ovi)
    If Range("B" & Ovi + 1) = Ovtask Then
        Range("B" & Ovi + 1 & ":" & "C" & Ovi + 1).Font.Color = Range("B" & Ovi & ":" & "C" & Ovi).Font.Color
        Else
        Range("B" & Ovi + 1 & ":" & "C" & Ovi + 1).Font.Color = RGB(0, 0, 0)
    End If
Next Ovi
End Sub

在链接的图像中,您可以看到所需的结果

【问题讨论】:

  • Range.Interior.Color?
  • 另外,请注意,您可以使用条件格式获取交替颜色,并且您不需要 VBA。
  • 没错,但结果不是我想要的:肯定代码有错误,结果颜色是黑色而不是白色
  • @user3561813 我试过没有成功。我在条件格式中的难点是如何分配颜色,因为当条件为真时颜色保持不变,当条件为假时必须改变,相对于前一行的颜色。例如:row1以蓝色开头,row2条件false->将颜色改为白色,row3条件false->将颜色改为蓝色,row4条件true->保持蓝色,row5条件false->将颜色改为白色, row6 条件为真->保持颜色为白色

标签: excel vba rows rgb conditional-formatting


【解决方案1】:

正如 BigBen 在 cmets 中所述,要设置单元格的颜色,请使用 Interior.Color。我考虑过条件格式,但我认为你是对的,在这种情况下是不可能的。

您在代码中使用的逻辑有缺陷:一旦将一行设置为白色,就永远不会将任何行设置为蓝色:要么下一行相等,然后将其设置为白色,因为当前行是白色的,或者它不相等,那么你无论如何都将它设置为白色。

看看下面的代码 sn-p:我声明了一个布尔变量 UseHighlightColor,它跟踪当前行是否需要被涂成蓝色,并相应地设置 Interior.Color。对颜色的一些说明:
- 白色是RGB(255, 255, 255)RGB(0, 0, 0) 结果为黑色。
- 有一个预定义的常量 vbWhite 您可以使用。
- 要将单元格设置为透明而不是白色,您可以使用ColorIndex = xlNone

对您的代码的注释:您使用的是不合格的Range,因此 VBA 会自动引用 ActiveSheet(当前具有焦点的工作表)。这并不总是您使用的工作表。在我的示例中,我编写了With ActiveSheet,但您可以轻松地更改它,以便代码使用您想要的工作表,例如ThisWorkbook.Sheets(1)。在With 中,我使用语法.Range(以. 开头),这告诉VBA 使用With 子句中定义的对象(工作表)。不要依赖 ActiveSheet(也不要使用Activate)。

With ActiveSheet
    Ovn = .Range("B2").CurrentRegion.Rows.Count

    Dim useHighLightColor As Boolean
    useHighLightColor = True

    For Ovi = 3 To Ovn + 1
        Dim currentCell As Range
        Set currentCell = .Range("B" & Ovi)
        If useHighLightColor Then
            currentCell.Resize(1, 2).Interior.Color = RGB(221, 245, 253)
        Else
            ' curentCell.Resize(1, 2).Interior.Color = vbWhite
            currentCell.Resize(1, 2).Interior.ColorIndex = xlNone
        End If

        If currentCell <> currentCell.Offset(1, 0) Then
            ' Switch color
            useHighLightColor = Not useHighLightColor
        End If
    Next Ovi
End With

【讨论】:

  • 非常感谢您的宝贵建议。我会尝试了解您的建议,我已经应用了您的代码,但是由于倒数第二行是蓝色而不是白色,因此需要进行一些调整。
  • 我回顾了我的尝试,现在脚本完美运行! (这是我的错)
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2013-03-23
  • 1970-01-01
  • 2014-05-03
  • 2013-08-28
相关资源
最近更新 更多