在布尔值

时间:2018-12-13 22:18:41

标签: excel vba excel-vba

以下代码为我提供了4个不同的布尔选项。

'Yes
b1 = CBool(ds.Cells(x, 1) = ds.Range("E1") And _
          ds.Cells(x, 40) >= fs.Range("C2") And _
          ds.Cells(x, 41) >= fs.Range("C2"))
'No
b2 = CBool(ds.Cells(x, 40) >= fs.Range("C2") And _
          ds.Cells(x, 41) >= fs.Range("C2"))

'Yes/No
b3 = CBool(ds.Cells(x, 40) >= fs.Range("C2") And _
          ds.Cells(x, 41) >= fs.Range("C2") And _
          Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2"))
'Yes/Yes
b4 = CBool(ds.Cells(x, 1) = ds.Range("E1") And _
         ds.Cells(x, 40) >= fs.Range("C2") And _
         ds.Cells(x, 41) >= fs.Range("C2") And _
         Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2"))

是否可以像这样向B3和B4添加一个OR ...

'Yes/No
b3 = CBool(ds.Cells(x, 40) >= fs.Range("C2") And _
          ds.Cells(x, 41) >= fs.Range("C2") And _
          Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2") 
          OR
          Abs(ds.Cells(x, 83) - ds.Cells(x, 93)) >= fs.Range("F2"))

1 个答案:

答案 0 :(得分:1)

绝对可以按照您的要求去做。让我还提出一些优化调整。

此比较在代码中出现了几次:

'No
b2 = CBool(ds.Cells(x, 40) >= fs.Range("C2") And _
           ds.Cells(x, 41) >= fs.Range("C2"))

因此,请先执行该任务。一旦分配,就可以重复使用。例如:

'Yes
b1 = CBool(ds.Cells(x, 1) = ds.Range("E1") And _
           ds.Cells(x, 40) >= fs.Range("C2") And _
           ds.Cells(x, 41) >= fs.Range("C2"))

成为:

'Yes
b1 = CBool(ds.Cells(x, 1) = ds.Range("E1") And b2)

b3变为:

'Yes/No
b3 = CBool(b2 And Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2"))

最后,b4只是具有其他条件的b1,因此变为:

'Yes/Yes
b4 = CBool(b1 And Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2"))

现在,如果b3和b4都将添加相同的条件,则可以添加第五个变量b5,即:

b5 = Abs(ds.Cells(x, 83) - ds.Cells(x, 93)) >= fs.Range("F2")

新的OR如下所示:

b3 = b2 AND Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2") And b5

正如BigBen所指出的那样,CBool​​不是必需的。正如Scott Craner指出的那样,请注意括号。 A And B And C Or D(A And B) And (C Or D)不同。逻辑运算符的优先级顺序表示A And B And C Or D将被评估为(A And B And C) Or D。确保这就是您想要的。

摘要

我已对您的代码进行了更改,以帮助将来的某些开发人员了解。我使用了您的变量名,但我不喜欢它们。最好是更具描述性。

' No
b2 = ds.Cells(x, 40) >= fs.Range("C2") And _
     ds.Cells(x, 41) >= fs.Range("C2")

' Yes
b1 = b2 And ds.Cells(x, 1) = ds.Range("E1")

diff1 = Abs(ds.Cells(x, 82) - ds.Cells(x, 92)) >= fs.Range("F2")
diff2 = Abs(ds.Cells(x, 83) - ds.Cells(x, 93)) >= fs.Range("F2") 

' Yes/No
b3 = b2 And diff1 Or diff2  ' Possibly should be b2 And (diff1 Or diff2)

' Yes/Yes
b4 = b1 And diff1 Or diff2  ' Possibly should be b1 And (diff1 Or diff2) 

希望能带您上路。