如何制作 for 循环以应用条件格式?
How to make a for loop to apply conditional formating?
我为第一组列创建了条件格式 (C:E)
(见图 3)。
Range("C1:E36").Select
Selection. Format Conditions. Add Type:=xlExpression, Formulal:="=$D6=""Sun"""
Selection. Format Conditions (Selection. FormatConditions. Count).SetFirstPriority
with Selection. Format Conditions (1). Interior
.Pattern = xlLightVertical
. PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
我正在尝试创建一个 for 循环,它应该应用于所有十二个集合 - 每个集合有 3 列(见图 2)。此外,它应该 运行 3 次 - 从行 C6, C45,C84
开始 - 对应于我要显示的三年(见图 1)。我正在为 for 循环而苦苦挣扎。以及条件格式中 $D6
列的相对 abs 引用以及如何使其成为 $G6, $J6, $D84, $G84
.
For o = 1 TO 3 Step 1
For I = 1 To 12 Step 1
Range (.Cells(6, I * 3), .Cells (36, I * 3 + 2)).Select
Selection. Format Conditions. Add Type:=xlExpressionFormulal:="=$D6=""Sun"""
Selection. Format Conditions (Selection. Format Conditions. Count).SetFirstPriority
With Selection. Format Conditions (1). Interior
.Pattern = xlLightvertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
Next I
Next o
End Sub'
对于复制格式,我建议 .Copy
和 .PasteSpecial
使用 xlPasteFormats
。至于动态确定范围,因为您的范围有规则的大小和可预测的位置,最简单的方法是编写静态 For Loop
来迭代行和列号。
Sub Example()
Dim r As Long, c As Long
For r = 6 To 84 Step 39
For c = 3 To 36 Step 3
Cells(r, "C").Resize(38, 3).Copy
Cells(r, c).Resize(38, 3).PasteSpecial xlPasteFormats
Next
Next
End Sub
此代码将格式从“C6:E44”复制到相邻列。 12 组,每组 3 列宽(例如“F6:H44”、“I6:K44”)。然后它将行号从 6 增加到 45 并再次执行此操作,将“C45:E83”复制到“F45:H83”和其他 11 个列集。然后它从第 45 行前进到第 84 行并再次执行此操作。
回应您关于为每个范围应用 new/custom 格式的评论:
Sub Example()
For r = 6 To 84 Step 39
For c = 3 To 36 Step 3
ApplyFormatting Cells(r, c).Resize(38, 3)
Next
Next
End Sub
Sub ApplyFormatting(InRange As Range)
InRange.FormatConditions.Add Type:=xlExpression, Formula1:="=" & InRange.Cells(1, 2).Address(False, True) & "=""Sun"""
InRange.FormatConditions(InRange.FormatConditions.Count).SetFirstPriority
With InRange.FormatConditions(1).Interior
.Pattern = xlLightVertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
End Sub
此过程 ApplyFormatting
获取每个范围并将地址用作应用于整个范围的新格式公式的一部分。
这样做会简单得多:
- 创建条件格式,以便上下复制
- 将格式复制并粘贴到其他位置
要做 1)
为每个单元格 C6、D6 和 E6 分别定义条件格式 ,使用公式:=OR(D6="Sat",D6="Sun")
.
您现在可以执行 2):
- Select 个单元格 C6:E6 和复制
- Select 目标组(比如)F6:H36 和粘贴格式
- 现在将格式复制F6:H36并粘贴到每个其他列组
您可以根据需要定义一个 CF 作为传递范围的 Sub。然后根据需要多次调用它,以设置所有列
设置条件格式
Sub SetCF(r As Range)
Dim rw As Long
r.FormatConditions.Add Type:=xlExpression, Formula1:="=" & r.Cells(1, 2).Address(False, True) & "=""Sun"""
r.FormatConditions(r.FormatConditions.Count).SetFirstPriority
With r.FormatConditions(1).Interior
.Pattern = xlLightVertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
End Sub
为一个范围调用它
Sub Demo1()
SetCF ActiveSheet.Range("C1:E36")
End Sub
为多个偏移范围调用它
Sub Demo2()
Dim r As Range
Dim i As Long
Set r = ActiveSheet.Range("C1:E36")
For i = 0 To 11
SetCF r.Offset(, i * 3)
Next
End Sub
我为第一组列创建了条件格式 (C:E)
(见图 3)。
Range("C1:E36").Select
Selection. Format Conditions. Add Type:=xlExpression, Formulal:="=$D6=""Sun"""
Selection. Format Conditions (Selection. FormatConditions. Count).SetFirstPriority
with Selection. Format Conditions (1). Interior
.Pattern = xlLightVertical
. PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
我正在尝试创建一个 for 循环,它应该应用于所有十二个集合 - 每个集合有 3 列(见图 2)。此外,它应该 运行 3 次 - 从行 C6, C45,C84
开始 - 对应于我要显示的三年(见图 1)。我正在为 for 循环而苦苦挣扎。以及条件格式中 $D6
列的相对 abs 引用以及如何使其成为 $G6, $J6, $D84, $G84
.
For o = 1 TO 3 Step 1
For I = 1 To 12 Step 1
Range (.Cells(6, I * 3), .Cells (36, I * 3 + 2)).Select
Selection. Format Conditions. Add Type:=xlExpressionFormulal:="=$D6=""Sun"""
Selection. Format Conditions (Selection. Format Conditions. Count).SetFirstPriority
With Selection. Format Conditions (1). Interior
.Pattern = xlLightvertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
Next I
Next o
End Sub'
对于复制格式,我建议 .Copy
和 .PasteSpecial
使用 xlPasteFormats
。至于动态确定范围,因为您的范围有规则的大小和可预测的位置,最简单的方法是编写静态 For Loop
来迭代行和列号。
Sub Example()
Dim r As Long, c As Long
For r = 6 To 84 Step 39
For c = 3 To 36 Step 3
Cells(r, "C").Resize(38, 3).Copy
Cells(r, c).Resize(38, 3).PasteSpecial xlPasteFormats
Next
Next
End Sub
此代码将格式从“C6:E44”复制到相邻列。 12 组,每组 3 列宽(例如“F6:H44”、“I6:K44”)。然后它将行号从 6 增加到 45 并再次执行此操作,将“C45:E83”复制到“F45:H83”和其他 11 个列集。然后它从第 45 行前进到第 84 行并再次执行此操作。
回应您关于为每个范围应用 new/custom 格式的评论:
Sub Example()
For r = 6 To 84 Step 39
For c = 3 To 36 Step 3
ApplyFormatting Cells(r, c).Resize(38, 3)
Next
Next
End Sub
Sub ApplyFormatting(InRange As Range)
InRange.FormatConditions.Add Type:=xlExpression, Formula1:="=" & InRange.Cells(1, 2).Address(False, True) & "=""Sun"""
InRange.FormatConditions(InRange.FormatConditions.Count).SetFirstPriority
With InRange.FormatConditions(1).Interior
.Pattern = xlLightVertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
End Sub
此过程 ApplyFormatting
获取每个范围并将地址用作应用于整个范围的新格式公式的一部分。
这样做会简单得多:
- 创建条件格式,以便上下复制
- 将格式复制并粘贴到其他位置
要做 1)
为每个单元格 C6、D6 和 E6 分别定义条件格式 ,使用公式:=OR(D6="Sat",D6="Sun")
.
您现在可以执行 2):
- Select 个单元格 C6:E6 和复制
- Select 目标组(比如)F6:H36 和粘贴格式
- 现在将格式复制F6:H36并粘贴到每个其他列组
您可以根据需要定义一个 CF 作为传递范围的 Sub。然后根据需要多次调用它,以设置所有列
设置条件格式
Sub SetCF(r As Range)
Dim rw As Long
r.FormatConditions.Add Type:=xlExpression, Formula1:="=" & r.Cells(1, 2).Address(False, True) & "=""Sun"""
r.FormatConditions(r.FormatConditions.Count).SetFirstPriority
With r.FormatConditions(1).Interior
.Pattern = xlLightVertical
.PatternColor = 65535
.ColorIndex = xlAutomatic
.PatternTintAndShade = 0
End With
End Sub
为一个范围调用它
Sub Demo1()
SetCF ActiveSheet.Range("C1:E36")
End Sub
为多个偏移范围调用它
Sub Demo2()
Dim r As Range
Dim i As Long
Set r = ActiveSheet.Range("C1:E36")
For i = 0 To 11
SetCF r.Offset(, i * 3)
Next
End Sub