Добавление оператора OR в логическое значение - PullRequest
0 голосов
/ 14 декабря 2018

Следующий код дает мне 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 следующим образом ...

'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 голосов
/ 14 декабря 2018

Определенно возможно сделать то, что вы просите.Позвольте мне также предложить несколько поправок для оптимизации.

Это сравнение встречается в коде несколько раз:

'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 ​​не является необходимым.Как отметил Скотт Крейнер, будьте осторожны с круглыми скобками.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) 

Надеюсь, что вы на вашем пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...