我想写一个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
正如BigBen在评论中所说,要设置单元格的颜色,你可以使用 Interior.Color
. 我想过用条件格式化,但我认为你是对的,在这种情况下是不可能的。
你在代码中使用的逻辑是有缺陷的。一旦将某行设置为白色,它就不会将任何行设置为蓝色。要么是下一行相等,然后你把它设置为白色,因为当前行是白色的;要么是它不相等,然后你把它设置为白色。
请看下面的代码片段。我声明了一个布尔变量 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