Несколько условий условного форматирования VBA

#vba #excel #conditional-formatting #multiple-conditions

#vba #excel #условное форматирование #множественные условия

Вопрос:

Я новичок в мире VBA, и мне нужна некоторая помощь со стороной условного форматирования VBA.

1) Мне нужно, чтобы условное форматирование было применено к столбцу (M)

  • зеленый под 7
  • желтый с 7-20
  • красный больше 20

С переопределяющим условием, что если в столбце (N) указано NOPO, я не хочу, чтобы применялось условное форматирование.

Я разработал формулу для использования, которая указывает, какой цвет требуется, но не может преобразовать это в условное форматирование VBA (эта формула показывает, какой цвет и следует ли применять условное форматирование.

 =IF(N2="osno",IF(M2<=7,"green",IF(M2<7,IF(M2>20,"red","less than 20"),IF(M2>20,IF(M2>20,"red","less than 20"),"yellow"))),"no format")
  

Это мой текущий скрипт на VBA, как вы, без сомнения, видите, он очень запутанный и был взят из записанного скрипта.

     Sub Conditional()
'
' Notification_05 Macro
' Conditional Formatting
'

'
    Sheets("Final").Select
    Columns("M:M").Select

    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _
        Formula1:="=8"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5296274
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
        Formula1:="=8", Formula2:="=20"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 49407
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
        Formula1:="=20"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 470000
        .TintAndShade = 0
    ActiveWindow.SmallScroll Down:=-27
    Range("M2").Select
    With Range("M:M")
        .FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=LEN(TRIM(M1))=0"
        With .FormatConditions(.FormatConditions.Count)
            .SetFirstPriority
                End With
                   End With
                   End With
End Sub
  

Спасибо,

Блейк

Комментарии:

1. Ваше =IF(N2="osno",IF(M2<=7,"green",IF(M2<7,IF(M2>20,"red","less than 20"),IF(M2>20,IF(M2>20,"red","less than 20"),"yellow"))),"no format") эквивалентно =IF(N2="osno",IF(M2<=7,"green",IF(M2>20,"red","yellow")),"no format") , потому что M2<7 часть всегда будет оцениваться как False , а вторая M2>20 всегда будет True , если она превзойдет первую M2>20 . Это не поможет вам записать его как код VBA, но это может упростить то, что, по вашему мнению, вам нужно сделать.

Ответ №1:

Формула CF должна возвращать либо true, либо false: вы не можете использовать одну формулу для назначения одного из нескольких цветов, только для того, чтобы решить, следует ли применять цвет или нет. Вам понадобятся три правила, каждое с немного отличающейся формулой.

 Sub Tester()

    Dim rng As Range

    Set rng = Selection

    rng.FormatConditions.Delete 'clear any existing rules

    AddRule rng, "=AND(M2=""osno"", N2<7)", vbGreen
    AddRule rng, "=AND(M2=""osno"", N2>=7,N2<=20)", vbYellow
    AddRule rng, "=AND(M2=""osno"", N2>20)", vbRed

End Sub

'utility sub: add a CF rule given the formula and a fill color
Sub AddRule(rng, sFormula, lColor)
    With Selection.FormatConditions
        With .Add(Type:=xlExpression, Formula1:=sFormula)
            .Interior.Color = lColor
            .StopIfTrue = True
        End With
    End With
End Sub