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

Stop arbitrary fill color change in Excel or apply conditional formatting with VBA

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

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

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

思路如下:

等等

我有这个代码

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 行;将 color/formatting 应用到我想要的范围内,很乐意提供任何帮助/有人可以指出我做错了什么

我更喜欢在这里使用条件格式,所以如果有人能透露颜色偏移的原因,我会更高兴。

这里的vbaRange("A" & Data.Row, "H" & Data.Row).Interior.ColorIndex = 10你用Data.Row,但你应该参考cell.Row

Range.Row returns 第一行的数字。所以在你的代码中你每次只改变第一行。

希望对您有所帮助。

干杯

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

可以执行 VBA 来创建格式条件,指定文字 RGB 值,这可能更适合您当前的方法,因为它仍然会像 "conditional formatting" 一样工作。

我的方法是使用宏记录器,并记录创建所有格式条件的操作。然后你可以用这样的方式修改它"hard-code"颜色值。

这是一个简单的例子;我录制了一个宏,然后稍微修改了输出代码以复制您的第一个格式条件(我不是 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=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=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

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