【问题标题】:multiple IF statement conditions using OR function doesn't work - VBA使用 OR 函数的多个 IF 语句条件不起作用 - VBA
【发布时间】:2019-07-13 11:23:25
【问题描述】:

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

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

【问题讨论】:

  • 你能发布一些测试数据吗?我有一种感觉你需要做一个and 而不是or 你能张贴你的工作簿的图片,也许吗?这可能与数据有关,但很难说。
  • Or Cells(i, 8) &lt;&gt; "" 将输入任何非空单元格的第一个条件。
  • 那么代码“打算如何工作”?这里显然有一个业务规则,但在不知道的情况下,很难解开这个条件。
  • 更不用说,如果你有Cells(i, 8) &lt;&gt; "",这使得"Cancelled Not Applicable" Or "Completed" 的前两个条件完全不相关,因为它的意思是“如果一个单元格不是空白的,那就做点什么”
  • 我有一种永恒的预感,解释逻辑运算符和真值表的工作原理比为您提供正确实现您的要求的代码更有益。

标签: excel vba if-statement conditional-statements


【解决方案1】:
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 &lt;&gt; "" 在这里您说“如果此单元格为空白,则将此 IF 行作为真传递”,因为它是 OR。这就像说“如果这只鸡是红色的,或者这只鸡是黑色的,或者这只鸡存在”所以如果你正在测试一只蓝色的鸡,它会因为它存在而通过。

  2. 您的Cells(i, 23) &lt;&gt; "Cancelled" Or Cells(i, 23) &lt;&gt; "Completed"。如果单元格包含“已取消”,那么您的第二个条件为真,因为它没有说“已完成”,所以它通过了。如果您的单元格显示“已完成”,那么您的第一个条件将通过,因为它不是“已取消”。如果您的单元格显示“Booger farts”,那么这两个条件都会通过,因为它既不是“Cancelled”也不是“Completed”。所以你真的想在这里AND

第二点很难理解,因为“OR”不是我们在英语中使用它的方式。以这种方式思考可能会有所帮助:如果我们有一个像 IF condition1 OR condition2 OR condition3 这样的测试,那么只有其中一个条件需要为真才能通过。 If TRUE OR FALSE OR FALSE 通过。您在此处的条件是“不等于”,这增加了混乱,但您只需要专注于单个条件并确定它是返回“TRUE”还是“FALSE”,并做出声明IF TRUE OR FALSE(通过)或@987654329 @(通过)或IF FALSE OR TRUE(通过)或IF FALSE OR FALSE(最终失败!)。

相反,你想说:

如果 CASE STATUS 已填写且 PROGRAM STATUS 为 IN PROGRESS 或 PENDING 或 PENDING REVIEW 等,则 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

【讨论】:

  • 关于第 2 点:我喜欢将Or 逻辑运算解释为加法,将And 解释为乘法——将True 可视化为1False0 ,那么真值表就变得很容易理解了。
  • @MathieuGuindon 我知道我之前偶然发现了对这个NOT OR NOT 门的一些很好的解释,但我在回忆它(或找到它)时遇到了问题。 OR 很容易掌握,但 NOT OR NOT 因为它在这里令人困惑,因为它与英语“如果我的鸡不是橙色或我的鸡不是绿色”有很大不同,这显然不允许橙色鸡.但作为一个逻辑门,它会允许它作为橙色鸡显然不是绿色的。
  • 这就像 SQL 中的 WHERE NOT LIKE ALL (1,2,3)WHERE NOT LIKE ANY (1,2,3)。学习那个我已经掉了一些头发。
  • 似乎括号有助于澄清最终表达式中的操作顺序 - 或者更好的是,将每个单独的条件提取到局部变量中。 “不为空且等于某物”读起来仍然是多余的;-)
  • @JNevill 你的解释太棒了。除了代码,谢谢。
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2017-09-25
  • 2018-05-11
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多