我正在尝试获取代码,以检查是否满足多个条件,如果是,则更改单元格的颜色,但这不起作用,并突出显示了不必要的方式。我不确定代码为什么不能按预期工作:
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
答案 0 :(得分:2)
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
这说:
如果您的案例状态为“已取消不适用”或案例状态为“已完成”或案例状态为任何值(非空),请继续测试程序状态是否为任何值(因为它不能(同时“已取消”和“已完成”),然后突出显示它。
所以这里确实有两个问题。
您的Or Cells(i, 8).value <> ""
在这里说的是“如果此单元格为空,则将此IF行传递为true”,因为它是OR
。这就像说:“如果这只鸡是红色的,或者这只鸡是黑色的,或者这只鸡存在”,那么,如果您正在测试一只蓝色的鸡,它将通过它的存在。
您的Cells(i, 23) <> "Cancelled" Or Cells(i, 23) <> "Completed"
。如果单元格包含“已取消”,则您的第二个条件为true,因为它没有显示“已完成”,因此可以通过。如果您的单元格显示“已完成”,则您的第一个条件通过,因为它不是“已取消”。如果您的单元格显示“笨蛋放屁”,则两个条件都将通过,因为它既不是“已取消”,也不是“已完成”。因此,您真的想要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
(最终失败!)。
相反,您想说:
如果填写了案例状态,并且程序状态为“进行中”,“待审核”或“待审核”等,则案例状态无法取消或完成
所以:
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