Страницы: 1
RSS
Почему If при наличии нескольких условий, связанных через Or, обрабатывает только первое?
 
Здравствуйте.
     У меня есть код:
                   
Код
 If Rng.Offset(0, 5).Value <> "Да" Or Rng.Offset(0, 5).Value <> "ДА" Then
                     MsgBox "Значение ячейки " & Rng.Offset(0, 5).Value, vbInformation, "Конец"
                     Exit Sub
                     End If
, где Rng - переменная, значение которой задаётся ранее в коде при выполнении поиска. И в принципе всё работает, кроме: в первой строке указанного кода If проверяет только первое условие. Всё, что после Or, почему-то игнорируется. Подскажите, пожалуйста, почему? И как это исправить?
Изменено: Неопытный_Экселист - 29.06.2021 11:09:32
 
Неопытный_Экселист, здравствуйте
А вы, простите, не попутали условия "И" и "ИЛИ"???
И вообще зачем 2 раза проверять одну и ту же ячейку на одно и то же  :D
В подобных проверках ВСЕГДА рассчитываются ОБА условия (пример вызовет ошибку в обоих случаях)
А вот такая конструкция отработает нормально, так как ветвления рассчитываются по очереди и до второй ошибочной ветки расчёт просто не доходит
Изменено: Jack Famous - 29.06.2021 13:16:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вот я - лошара!  :D  Действительно, через И надо. Протупил - так протупил! Большое спасибо.
Цитата
Jack Famous написал:
И вообще зачем 2 раза проверять одну и ту же ячейку на одно и то же
Ибо разный регистр. Помогите, пожалуйста.
Изменено: vikttur - 29.06.2021 12:33:02
 
Цитата
Неопытный_Экселист: разный регистр
Код
If LCase(Rng.Offset(0, 5).Value) <> "да" Then MsgBox "Значение ячейки " & Rng.Offset(0, 5).Value, vbInformation, "Конец": Exit Sub
+ добавил нюанс по обработке условий в посте выше  ;)
Изменено: Jack Famous - 29.06.2021 11:30:28
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
Большое спасибо.
 
Джек, а с какого числа разрешили деление на ноль? ))
Изменено: Юрий М - 29.06.2021 12:55:50
 
Неопытный_Экселист, большое пожалуйста   :)  

Юрий М, привет)) так не с какого, вроде - у тебя что-ли отработало?  :D
Я как раз для демонстрации вычисления ОБОИХ условий ошибку и получал (лень было писать и уж тем более объяснять про Err.Raise xlErrNA)
Добавил в описание спойлера, что решение не просто отработает нормально, а до ошибочной ветки расчёт не дойдёт  ;)
Изменено: Jack Famous - 29.06.2021 13:17:05
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Добрый день! Указанная особенность называется Short-circuit evaluation (Short-circuit  - короткое замыкание) и является одной из важных особенностей синтаксиса любого языка программирования. Рекомендую также проверить функции рабочего листа OR (ИЛИ) и AND (И).
Владимир
 
А так не проще:
Код
If UCase(Rng.Offset(0, 5).Value) <> "ДА" Then
 
Всем Огромнейшее спасибо!
Изменено: Неопытный_Экселист - 29.06.2021 13:48:06
 
msi2102, #4
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
УПС, проглядел
Страницы: 1
Наверх