在Excel中停止任意填充颜色更改或使用VBA应用条件格式

时间:2016-07-01 12:58:34

标签: vba excel-vba conditional-formatting excel

我有一个电子表格,我将以下条件格式应用于,以提高可读性

Conditional formating

然而我发现我偶尔会丢失颜色 - Excel会将填充颜色的RGB值更改为与我最初使用的颜色完全不同的颜色

要解决此问题(在分发excel文件之前),我希望在VBA中重新创建上面的条件格式并将其附加到电子表格中的许多组合框

这个想法如下:

  • 检查列C2:c100,当值
  • 如果cellvalue为1,
    • 在范围I8中设置行:K800,M8:M800到颜色2
    • 将轮廓+轮廓颜色应用于范围I8:K800,M8:M800
    • 中的行
  • 如果cellvalue是2
    • 在范围I8中设置行:K800,M8:M800到颜色2
    • 将轮廓+轮廓颜色应用于范围I8:K800,M8:M800
    • 中的行

我有这段代码

Sub ColorCells()
Dim Data As Range
Dim cell As Range
Set currentsheet = ActiveWorkbook.Sheets("Sheet1")
Set Data = currentsheet.Range("C2:C200")

For Each cell In Data

If cell.Value = "1" Then
Range("A" & Data.Row, "H" & Data.Row).Interior.ColorIndex = 10

End If
Next

End Sub

我在第8行挣扎;将颜色/格式应用到我想要的范围,并乐意为任何帮助/有人可以指出我做错了什么

我更喜欢在这里使用条件格式化,所以如果有人能够揭示变色的原因会更快乐。

2 个答案:

答案 0 :(得分:2)

对于Range("A" & Data.Row, "H" & Data.Row).Interior.ColorIndex = 10这里的vba,您使用的是Data.Row,但您应该参考cell.Row

Range.Row返回第一行的编号。因此,在您的代码中,您每次只更改第一行。

希望这有帮助。

干杯

答案 1 :(得分:1)

颜色变化的一个可能原因是用户可能正在更改主题颜色。分配ThemeColor的任何颜色都是动态的,并且可以响应更改的主题颜色,例如:

enter image description here

enter image description here

可以通过VBA创建格式条件,指定文字RGB值,这可能最好是当前的方法,因为它仍然可以作为"条件格式化"。

我的方法是使用宏记录器,并记录创建所有格式条件的操作。然后你可以通过这样一种方式修改它来硬编码"颜色值。

这是一个简短的例子;我记录了一个宏,然后稍微修改了输出代码以复制你的第一个格式条件(我不是100%确定我有相同的颜色,但这应该给你结构):

Sub ConditionalFormats()

    Dim rng As Range
    Dim cFormat As FormatCondition
    Set rng = Range("E8:G802")

    Set cFormat = rng.FormatConditions.Add(Type:=xlExpression, Formula1:="=$C$8=4")
    cFormat.SetFirstPriority
    cFormat.StopIfTrue = False
    With cFormat.Interior
        .PatternColorIndex = xlAutomatic
        ' ### This was the original output using ThemeColor property
        ' .ThemeColor = xlThemeColorLight2
        ' ### Modify using Color property instead:
        .Color = 15849925
        ' ### TintAndShade is not needed if we're using the literal color value
        '.TintAndShade = 0.799981688894314
    End With

    '## To add another condition, redefine the rng and add a new condition as needed:
    Set rng = Range("I8:O802")
    Set cFormat = rng.FormatConditions.Add(Type:=xlExpression, Formula1:="=$C$8=4")
    With cFormat.Interior
        .PatternColorIndex = xlAutomatic
        .Color = 15849925
    End With
    '## Add code for borders, etc.
    With cFormat.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Color = vbBlack
        .Weight = xlThin
    End With
    With cFormat.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Color = vbBlack
        .Weight = xlThin
    End With
End Sub

现在,格式规则并不依赖于主题颜色,因此即使用户更改主题,颜色仍然存在。 (上面的粉红色单元格有条件地格式化,所以它确实随主题而改变,但蓝色单元格没有改变):

enter image description here