此代码应查看表中的每一行,并将其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
答案 0 :(得分:1)
您使用For Each
循环的本能很好。与对象一起使用时,For Each
循环比等效的For i = ...
循环要27x faster。
您缺少的链接是.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
答案 1 :(得分:0)
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" & i).Value = "GR" And Range("B" & i - 1).Value = 4 And Range("C" & i).Value = Range("C" & i - 1).Value) Then
Rows(i & ":" & i).Interior.Color = 9359529
End If
Next i
End Sub