停止 Excel 中的任意填充颜色更改或使用 VBA 应用条件格式
Stop arbitrary fill color change in Excel or apply conditional formatting with VBA
我有一个应用了以下条件格式的电子表格,以提高可读性
但是我发现我时不时会丢失颜色 - Excel 将填充颜色的 RGB 值更改为与我最初使用的完全不同的值
为了解决这个问题(在我分发 excel 文件之前)我希望在 VBA 中重新创建上面的条件格式并将其附加到电子表格中的许多组合框
思路如下:
- 检查列 C2:c100 ,当值
- 如果单元格值为 1,
- 将 I8:K800、M8:M800 范围内的行设置为颜色 2
- 对 I8:K800、M8:M800
范围内的行应用轮廓 + 轮廓颜色
- 如果单元格值为 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 行;将 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
现在,格式规则不依赖于主题颜色,因此即使用户更改了主题,颜色仍然存在。 (上面的粉红色单元格不是条件格式,所以它会随着主题而改变,但蓝色单元格不会):
我有一个应用了以下条件格式的电子表格,以提高可读性
但是我发现我时不时会丢失颜色 - Excel 将填充颜色的 RGB 值更改为与我最初使用的完全不同的值
为了解决这个问题(在我分发 excel 文件之前)我希望在 VBA 中重新创建上面的条件格式并将其附加到电子表格中的许多组合框
思路如下:
- 检查列 C2:c100 ,当值
- 如果单元格值为 1,
- 将 I8:K800、M8:M800 范围内的行设置为颜色 2
- 对 I8:K800、M8:M800 范围内的行应用轮廓 + 轮廓颜色
- 如果单元格值为 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 行;将 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
现在,格式规则不依赖于主题颜色,因此即使用户更改了主题,颜色仍然存在。 (上面的粉红色单元格不是条件格式,所以它会随着主题而改变,但蓝色单元格不会):