【问题标题】:Excel VBA- How do I create conditional formatting without duplicates?Excel VBA-如何创建不重复的条件格式?
【发布时间】:2015-12-08 17:51:06
【问题描述】:

基本上,我正在尝试制作适用于我工作簿中所有工作表的条件格式,因为我不知道有什么方法可以做到这一点,我想我会制作一个 VBA 脚本来为每个工作表创建它。它可以工作,但是如果它们已经具有格式,则会创建重复项,有什么办法可以防止这种情况发生吗?请参阅下图有多个相同条件格式的副本,因为我多次运行 VBA 脚本,我想检查是否存在具有特定公式的条件格式以防止这种情况,但没有找到如何做到这一点的运气。

重复的条件格式:

Sub Macro1()

Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets   
    If ws.Name = "macrotest" Then
        ws.Activate

        Dim myRange As Range
            Set myRange = Range("A1:GJH5000")

        Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
            "=AND(Sheet2!$A$1=TRUE, OR(CELL(""col"") - 5 > CELL(""col"",A1), CELL(""col"") + 1 
              <CELL(""col"",A1), CELL(""row"") - 1 > CELL(""row"",A1), CELL(""row"") + 3 
              <CELL(""row"",A1)))"

        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority

        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
        End With

        Selection.FormatConditions(1).StopIfTrue = False
        With Selection.FormatConditions(1).ModifyAppliesToRange(myRange)
        End With
    End If
Next ws
End Sub

我可以使用 formatconditions.delete 删除任何现有的条件格式,但我不想删除其他条件格式。有什么想法吗?

【问题讨论】:

  • 只是脚本上的一个问题。为什么在使用工作表时使用 Set myRange 却使用 Selection
  • 我对 excel 和 vba 还很陌生,这是一个草稿,以后有机会我会修复它。

标签: vba excel conditional-formatting


【解决方案1】:

由于您已将新添加的FormatCondition 设置为SetFirstPriority 的优先级,因此它变为FormatConditions(1)

了解这一点后,您可以使用FormatConditions(1).delete 删除该条件,并且重置将保留。

您也可以使用Select Case 方法,但这将循环遍历单元格范围,并且需要很长时间才能遍历工作表中的每个单元格。

它适用于较小的范围。见以下代码:

Sub SomeSub()

    Dim myCell
    Dim Range1 As Range
    Dim ws As Worksheet

    Set ws = ActiveWorkbook.ActiveSheet

    Set Range1 = ws.Range("A1:GJH5000")

    For Each cell In Range1

        'Build your Formaul here
        'First OR Function
        OrFunc1 = Application.WorksheetFunction.Or(SomeFormula)
        'Second OR Function
        OrFunc2 = Application.WorksheetFunction.Or(SomeOtherFormula)
        'Cells(1,1) reference Cells(RowRef, ColRef)
        If ActiveWorkbook.Worksheets("Sheet2").Cells(1, 1).Value = True Then Func = True
        'Your AND Function
        TestFunc = Application.WorksheetFunction.And(Func, OrFunc1, OrFunc2)

        If TestFunc = False Then

            With cell.Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorLight1
                .TintAndShade = 0
            End With

        End If

    'Put a BreakPoint On Next cell to check that it does what you want
    Next cell

End Sub

【讨论】:

  • 下班后我会自己测试一下,但是如果用户创建新的条件格式会改变优先级吗?还是通过 vba 将其设置为优先级 1?
  • 当您使用FormatConditions.Add 时,它会添加一个新条件并将其添加到列表的底部。这就是为什么当您录制宏时,它会添加行Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority。这使得新创建的条件条件编号为 1。
  • 这个问题是如果我的条件格式还没有创建,那么它将删除用户最后创建的任何条件格式。我希望有一种更灵活的方法,但我能够做到这一点,因为我的脚本是一个切换效果,我会让它创建格式,然后一旦它被关闭,只需删除它以防止重复。如果您知道另一种更灵活的方法(这限制了他们在打开时可以执行的操作),那么我仍然对替代方案感兴趣,但我会接受您的回答,因为它确实导致了一个可行的解决方案。跨度>
  • @FF7Squirrelman 只需在 Sub 的末尾加上 FormatConditions(1).delete 行,就在 End Sub 之前,这样它将是要执行的最后一行,因此避免了删除错误行的可能性, 如果用户在使用文档的过程中创建一个新的FormatCondition 会很困难。您的ConditionalFormating 是在您使用Selection.FormatConditions.Add Type........ 行时创建的。如果你能给一个特定的FormatCondition 起个名字就好了。
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 2021-08-29
  • 1970-01-01
  • 2016-10-02
  • 2017-11-03
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多