使用OR函数的多个IF语句条件不起作用-VBA

时间:2019-02-19 21:15:08

标签: excel vba if-statement conditional-statements

我正在尝试获取代码,以检查是否满足多个条件,如果是,则更改单元格的颜色,但这不起作用,并突出显示了不必要的方式。我不确定代码为什么不能按预期工作:

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

1 个答案:

答案 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

这说:

  

如果您的案例状态为“已取消不适用”或案例状态为“已完成”或案例状态为任何值(非空),请继续测试程序状态是否为任何值(因为它不能(同时“已取消”和“已完成”),然后突出显示它。

所以这里确实有两个问题。

  1. 您的Or Cells(i, 8).value <> ""在这里说的是“如果此单元格为空,则将此IF行传递为true”,因为它是OR。这就像说:“如果这只鸡是红色的,或者这只鸡是黑色的,或者这只鸡存在”,那么,如果您正在测试一只蓝色的鸡,它将通过它的存在。

  2. 您的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