Я новичок в VBA, а английский - не мой родной язык, поэтому приступим.

Я хочу условно форматировать строки / диапазон (давая им зеленый фон), если ячейка C в этой строке имеет повторяющееся значение в столбце C, а также если есть ячейка в столбце O, которая равна 0, но если ячейка в столбце C не имеет аналогичное значение, не применяйте условный формат к этой ячейке (хотя ячейки в столбце O имеют значение 0).

Примечание. Ячейки, имеющие одинаковые значения в столбце C, всегда будут располагаться друг над другом и ниже друг друга, например, возможно, что C1 = C2 = C3, но не C1 <> C2, C1 = C3.

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

Обновление (дополнительная информация): у меня может быть 3 или более строк с одинаковым значением столбца C выше и ниже друг друга, а нулевое значение в столбце O всегда будет нижней строкой.

Пример: если C1 = C2 = C3 = C4 = C5 и O5 = 0, строки 1 2 3 4 5 окрашиваются в зеленый цвет. Я предпочитаю использовать условный формат, даже если ему нужен код vba, поэтому мне не нужно запускать его каждый раз, когда в столбце O появляется новый 0.

Я использовал этот код, но он не работает (очевидно), но, возможно, мой вопрос немного отличается, потому что реальные данные сложнее, чем то, что я проиллюстрировал. Моя таблица данных начинается с 4-й строки (заголовок 3-й). Этот код форматирует только 1 строку (над строкой с нулевым значением столбца O), и мне нужно отформатировать все строки с одинаковым значением столбца C. Учтите, что я новичок в vba :(

With Range("A4:r8000").FormatConditions.Add( _ 
Type:=xlExpression, _
 Formula1:="=AND($C4=$C5,$O5=0,$F4<>0)")
 .Interior.Color = 13551615
 .Font.Color = -16383844
End With
-4
Kheuwnyuk 7 Сен 2016 в 19:03

3 ответа

Лучший ответ

Это будет проходить и выделять повторяющиеся ячейки, если какая-либо из строк повторяющихся ячеек имеет '0' в столбце O. Я все еще работаю над способом, который будет делать это автоматическое обновление всякий раз, когда происходит изменение в столбце O, но не могу выяснить это. Буду обновлять, когда сделаю.

Sub ConditionalFormatSE()

Application.ScreenUpdating = False

Dim lastRow As Long
Dim myCell As Range
Dim colCVals As Range

lastRow = Cells(Rows.Count, 3).End(xlUp).Row

Set colCVals = Range("C1", "C" & lastRow)

colCVals.clearformats

For Each myCell In colCVals
    If Cells(myCell.Row, 15).Value = "0" Then
        If WorksheetFunction.CountIf(colCVals, myCell.Value) > 1 Then
            Set c = colCVals.Find(myCell.Value)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    c.Interior.color = RGB(198, 239, 206)
                    c.Font.color = RGB(0, 97, 0)
                    Set c = colCVals.FindNext(c)
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End If
    End If
Next myCell

Set colCVals = Nothing
Set myCell = Nothing
Set c = Nothing

Application.ScreenUpdating = True

End Sub

Что касается автоматического запуска, поместите это в: Проект VBA ([имя книги] .xlsm) -> Объекты Microsoft Excel-> Лист1 ([имя листа]), и он должен запускаться всякий раз, когда значение в столбце «O» изменяется.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range

Set KeyCells = Columns(15)

If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
       Call ConditionalFormatSE
End If

Set KeyCells = Nothing
End Sub
-1
PartyHatPanda 7 Сен 2016 в 19:35

Если ячейки с одинаковыми значениями всегда сгруппированы (одна под другой), следующий код может делать то, что вы хотите.

Sub Test()
Dim lLastRow As Long
Dim i As Integer

lLastRow = Worksheets("Sheet1").Cells(Rows.Count, 3).End(xlUp).Row

For i = 1 To lLastRow
    If ((Worksheets("Sheet1").Cells(i + 1, 3).Value = Worksheets("Sheet1").Cells(i, 3).Value) And (Worksheets("Sheet1").Cells(i, 15).Value = "0")) Then
        Worksheets("Sheet1").Cells(i, 3).Interior.Color = vbGreen
    End If
Next i

End Sub
-1
CMArg 7 Сен 2016 в 16:44

Попробуйте это как формулу для CFR,

=and(countif(c:c, c1)>1, o1=0, len(o1))
'alternate for part that I am not sure I understand
=and(countif(c$1:c1, c1)>1, o1=0, len(o1))
0
user4039065user4039065 7 Сен 2016 в 16:38