#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