如何制作一个 for 循环来应用条件格式?
Posted
技术标签:
【中文标题】如何制作一个 for 循环来应用条件格式?【英文标题】:How to make a for loop to apply conditional formating? 【发布时间】:2022-01-01 10:21:56 【问题描述】:我为第一组列 (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 循环,它应该应用于所有 12 个集合 - 每个集合有 3 列(参见图 2)。此外,它应该运行 3 次 - 从行 C6, C45,C84
开始 - 对应于我试图显示的三年(见图 1)。我正在为 for 循环而苦苦挣扎。以及条件格式中$D6
列的相对绝对引用以及如何使其成为$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'
【问题讨论】:
没有代码图片。请编辑帖子以将代码包含为文本。对于代码格式化,在代码块前后的单独行上使用代码围栏```。 手动复制前三列并三三粘贴不起作用吗? 【参考方案1】:您可以根据需要定义一个 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
【讨论】:
你用这个答案击败了我不到一分钟......荣誉!【参考方案2】:对于复制格式,我建议.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 行并再次执行此操作。
回应您的 cmets 关于为每个范围应用新/自定义格式:
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
采用每个范围并将地址用作应用于整个范围的新格式公式的一部分。
【讨论】:
这似乎在复制粘贴的意义上起作用。但它仍然引用原始集合——因为 $D6 的引用值。它不是动态的。 @Nathan Fleischman:请参阅我的答案,了解如何制作条件格式以便复制。 请参阅我的更新答案,了解如何将自定义公式应用于每个范围。【参考方案3】:这样会更简单:
-
创建条件格式,以便向下和横向复制
将格式复制并粘贴到其他位置
要做 1)
为每个单元格 C6、D6 和 E6 定义条件格式单独,使用公式:=OR(D6="Sat",D6="Sun")
。
您现在可以执行 2):
-
选择单元格 C6:E6 并复制
选择一个目标组(比如)F6:H36 并粘贴格式
现在复制 F6:H36 并将格式粘贴到其他每个列组
【讨论】:
这将仅突出显示中心列。我需要它应该突出显示集合的整行。这就是为什么我将其设为 $D6 而不是 D6。 呃……不,不会的。重新阅读“待办事项 1)”。关键是分别在每个单元格(C6、D6、E6)中定义条件,但在每种情况下使用相同的公式。以上是关于如何制作一个 for 循环来应用条件格式?的主要内容,如果未能解决你的问题,请参考以下文章
在java中,新循环,也就是增强for循环怎么用?是啥格式?