Страницы: 1
RSS
vba Логика проверки нескольких условий в IF .. THEN
 
Здравствуйте!
Просветите, пожалуйста, в блоке
Код
If a = 1 or b = 2 then
  Statements
End If
если выполнилось условие a = 1 (True), будет ли осуществляться проверка b = 2 или руль отдаётся сразу в statements?

А вообще у меня прикладная задачка: соотнести экземпляры текста к определённым, своим, группам. Делаю путём простой проверки через InStr (не использую RegExp - хочу добиться максимальной скорости проверки). Будет ли выигрышнее в варианте "А"?
Вариант "А":
Код
If InStr(1, t, "ааа", 1) Then
    ...
ElseIf InStr(1, t, "ббб", 1) Then
    ...
ElseIf InStr(1, t, "ввв", 1) Then
    ...
End If
Вариант "Б":
Код
If InStr(1, t, "ааа", 1) Or InStr(1, t, "ббб", 1) Or InStr(1, t, "ввв", 1) Then
    ...
End If
(заместо ... одинаковый блок операторов)

Или может другие методы/способы быстрой проверки текста подскажите?
 
Более дорогое в вычислении условие я просто загоняю во второй блок вот таким образом:
Код
if condition1 then
if condition2 then 
   statements go here
end if
end if

Понятно, что более дорогое условие должно быть вложенным.
А вообще т.н. short circuiting в VBA не поддерживается.
Изменено: Все_просто - 30.04.2017 16:45:38
С уважением,
Федор/Все_просто
 
Всё понятно, благодарю
 
Все_просто, ваш вариант соответствует
Код
If a = 1 and b = 2 then
  Statements
End If
но никак ни Or.
vladjuha, В вашем варианте проверяются все вложения Or, не зависимо, найдено ли совпадения или нет.
Вам лучше использовать Select Case, там проверка прекращается, как только найдено первое совпадение. Для примера два маленьких макроса:
Код
Sub test()
Dim a, s
a = 2
Select Case a
    Case 2, 3 / 0
    s = 5
End Select
End Sub

Код
Sub test1()
Dim a, s
a = 2
If a = 2 Or a = 3 / 0 Then
s = 5
End If
End Sub

3/0 - явная ошибка; первый ее в данном случае не видит, второй - видит.
 
Михаил С., да, с select case в моём случае наглядней и быстрее if eseif получается, спасибо.
Скрытый текст
 
строчку
Код
        Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 4 / 0
можно записать
Код
         Case 0 To 8, 4 / 0
 
Да, так ещё быстрее, согласен, но я с проверками InStr(1, t, "ааа", 1) возюкаться буду, посему тестовый  прогон был применителен к моему случаю  
Изменено: vladjuha - 01.05.2017 07:04:33
 
Цитата
vladjuha написал:
но я с проверками InStr(1, t, "ааа", 1) возюкаться буду,
Тогда
Код
Case Is >0
 
Цитата
Михаил С. написал:
Все_просто , ваш вариант соответствует
В общем-то все правильно. Но это скорее не ошибка, а не совсем корректный пример - общий смысл от того, конечно, не меняется. Пример альтернативы под ИЛИ может быть следующим:
Код
if condition1 then
statements go here
elseif condition2 then
statements go here
end if

Конечно же, выражения лучше загнать в функцию/процедуру, если количество строк>2, чтобы не повторять код.
Но это, как говорится, лирика. Спасибо за замечание.
С уважением,
Федор/Все_просто
Страницы: 1
Наверх