#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