我正在尝试获取代码以检查多个条件是否为真,如果是,则更改单元格的颜色但这不起作用并突出显示超出必要的方式。我不确定为什么代码不能按预期工作:
Sub ConditionCheck()
Dim wb As Workbook
Dim ws As Worksheet
Dim lastrow As Long
Dim rng1 As Range
Dim rng2 As Range
Dim c As Range
Dim d As Range
Set wb = ActiveWorkbook
Set ws = wb.Sheets("Source")
lastrow = Sheets("Source").Cells(Rows.Count, "A").End(xlUp).Row
i = 2
For i = 2 To lastrow
If Cells(i, 8) = "Cancelled Not Applicable" Or Cells(i, 8) = "Completed" Or Cells(i, 8) <> "" Then
If Cells(i, 23) <> "Cancelled" Or Cells(i, 23) <> "Completed" Then
Cells(i, 23).Interior.ColorIndex = 4
End If
End If
Next i
End Sub
样本数据:
CASE ID CASE STATUS PROGRAM STATUS
10001 Active Pending
10002 Completed Pending Review
10004 Cancelled Not Applicable Cancelled
If Cells(i, 8) = "Cancelled Not Applicable" Or Cells(i, 8) = "Completed" Or Cells(i, 8) <> "" Then
If Cells(i, 23) <> "Cancelled" Or Cells(i, 23) <> "Completed" Then
Cells(i, 23).Interior.ColorIndex = 4
End If
End If
这说:
如果您的案例状态为“已取消不适用”或案例状态为“已完成”或您的案例状态为任何值(非空),请继续测试您的程序状态是否为任何值(因为它不能同时为“取消“AND”同时“完成”然后继续并突出显示它。
所以这里真的有两个问题。
Or Cells(i, 8).value <> ""
在这里你说“如果这个单元格是空白的那么将这条IF线传递为真”,因为它是一个OR
。这就像是说“如果这只鸡是红色的,或者这只鸡是黑色的还是这只鸡存在的话”那么,如果你正在测试一只蓝色的鸡,那么它将会存在。Cells(i, 23) <> "Cancelled" Or Cells(i, 23) <> "Completed"
。如果单元格包含“已取消”,那么您的第二个条件为真,因为它没有说“已完成”,因此通过了。如果您的单元格显示“已完成”,那么您的第一个条件将通过,因为它不是“已取消”。如果你的细胞说“Booger放屁”,那么两种情况都会通过,因为它不是“已取消”,也不是“已完成”。所以你真的想要AND
。第二点很难掌握,因为“OR”不是我们如何使用英语。以这种方式思考它可能会有所帮助:如果我们有像IF condition1 OR condition2 OR condition3
这样的测试,那么只有其中一个条件需要为真才能通过。 If TRUE OR FALSE OR FALSE
通过。你在这里的条件是“不等于”,这增加了混乱,但你只需要专注于个别条件并确定它是否返回“TRUE”或“FALSE”并使你的陈述IF TRUE OR FALSE
(通过)或IF TRUE OR TRUE
(通过)或IF FALSE OR TRUE
(通过)或IF FALSE OR FALSE
(最后它失败!)。
相反,你想说:
如果填写了CASE STATUS,并且如果PROGRAM STATUS正在进行或正在等待或等待审核等,则CASE STATUS不能被取消或已完成
所以:
If Cells(i,8).value <> "" AND (Cells(i, 8).value = "Cancelled Not Applicable" OR Cells(i,8).value = "Completed") AND (Cells(i, 23).Value <> "Cancelled" AND Cells(i, 23).Value <> "Completed") Then
Cells(i, 23).Interior.ColorIndex = 4
End If