Код для проверки и изменения строк при необходимости

#excel #vba #excel-formula

#excel #vba #excel-формула

Вопрос:

Этот код должен просматривать каждую строку в таблице и сравнивать значения B и C строки со строкой над ней, для строк, которые соответствуют требованиям, он ничего не делает, но каждая строка, которая не соответствует требованиям, будет выделена зеленым, если она не соответствует требованиям.

Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить диапазон или строки работать в строке 3 и 4.

 Sub IF_Loop()
Dim Row As Range
For Each Row In Range("A3:C155")
    If Row("B3").Value = "GR" And Row("B2").Value = 4 And Row("C3").Value = Row("C2").Value Then
        'Do nothing
    Else
        Row.Interior.Color = 9359529
    End If
Next Row
End Sub
  

Ответ №1:

Ваш инстинкт использовать For Each цикл был хорошим. При работе с объектами For Each цикл может быть в 27 раз быстрее, чем эквивалентный For i = ... цикл.

Недостающим звеном для вас было .Rows свойство Range объекта. Это позволяет вам перебирать строки вашего диапазона, и вы можете получить доступ к определенным ячейкам в этой строке с помощью .Cells . Например, Row.Cells(1,1) это ссылка на первую ячейку в строке.

Итак, вот другой способ, которым вы могли бы добиться того же:

 Sub IF_Loop()
    Dim row As Range

    For Each row In Range("B3:C20").Rows
        With row.Cells(1, 1)
            If Not (.Value = "GR" And .Offset(-1, 0).Value = 4 And .Offset(0, 1).Value = .Offset(-1, 1).Value) Then
                row.Interior.Color = 9359529
            End If
        End With
    Next
End Sub
  

Ответ №2:

For Each Row In Range("A3:C155")

Это не то, что вы думаете. Row это просто итеративный параметр — присвоение ему имени Row не делает его представляющим строку. For Each Row In Range("A3:C155") выполняется итерация по каждой отдельной ячейке в Range("A3:C155") .

Кроме того, ваш If будет только когда-либо тестировать B3 , B2 , C3 и C2 — вам нужно иметь что-то переменное, чтобы изменять его с каждой итерацией. Попробуйте это вместо:

 Sub IF_Loop()

    Dim i As Long

    For i = 3 To 155
        If Not (Range("B" amp; i).Value = "GR" And Range("B" amp; i - 1).Value = 4 And Range("C" amp; i).Value = Range("C" amp; i - 1).Value) Then
            Rows(i amp; ":" amp; i).Interior.Color = 9359529
        End If
    Next i

End Sub