Honey Пользователь Сообщений: 204 |
Всем добрый день! Если честно, даже не знаю как правильно сформулировать вопрос… Да и корректное ли название у темы. Заранее всем спасибо! С уважением, |
Astroid1 Пользователь Сообщений: 54 |
Справка developer на сайте майкрософт или google.ru Изменено: Astroid1 — 25.08.2016 12:13:17 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#3 25.08.2016 12:16:31
|
||
Honey Пользователь Сообщений: 204 |
#4 25.08.2016 12:18:10 Юрий М,
Изменено: Honey — 25.08.2016 12:18:29 |
||
dred_fk Пользователь Сообщений: 8 |
#5 25.08.2016 12:20:46 Надо бы проверить, но думаю что как-то так.
долго пишу Изменено: dred_fk — 25.08.2016 12:23:05 |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Ещё можно использовать ElseIf или конструкцию Select Case. |
Honey Пользователь Сообщений: 204 |
dred_fk, Спасибо))) |
Hugo Пользователь Сообщений: 23253 |
Select Case удобнее. И в ячейку не нужно лазить много раз. |
dred_fk Пользователь Сообщений: 8 |
#9 25.08.2016 12:29:08
Имхо ничем. Elseif вместо Or по сути. А селект, если я правильно понимаю, обращаться в сиквелу? В данной задаче вообще не рентабельно. Опять же ИМХО. |
||
Hugo Пользователь Сообщений: 23253 |
#10 25.08.2016 12:33:32
|
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#11 25.08.2016 12:36:41
Удобны тем, что при выполнения условия дальнейшие проверки не выполняются.
|
||||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#12 25.08.2016 12:37:57
Это почему? )) |
||
Honey Пользователь Сообщений: 204 |
Юрий М, dred_fk, Hugo, спасибо) Даже и не знала, что и так можно)) |
dred_fk Пользователь Сообщений: 8 |
#14 25.08.2016 12:44:11
а потому что я с ума сошел со своей задачкой и вообще не о том подумал. Я ТАКОЕ решение в голове придумал, где без кейсов надо почему-то искать. Короче в голове дошел до маразма и поставил клеймо: можно, но не рентабельно. Подтверждаю. Кейсом тоже можно Можно еще на каждый чих отдельный иф. Но вот это будет совсем некрасиво |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#15 25.08.2016 12:44:37
Конечно! Чем меньше проверок, тем меньше требуется времени )) |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
dred_fk, посмотрите, как с Select Case компактно получается, а Вы говорите… )) |
Honey Пользователь Сообщений: 204 |
#17 25.08.2016 12:45:23
Выдает ошибку… Я только свои значения подставила и все… Block if without End If… Изменено: Honey — 25.08.2016 12:45:32 |
||
Hugo Пользователь Сообщений: 23253 |
Если вариантов действительно много — то можно их предварительно собрать в словарь (или словари) и затем сверяться с ним. Например проверять наличие в словаре, или проверять значение по ключу. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#19 25.08.2016 12:46:33
Срочно отдохнуть! )) |
||
Honey Пользователь Сообщений: 204 |
Hugo, Не уловила) Можно поподробней?… |
Honey Пользователь Сообщений: 204 |
dred_fk, |
dred_fk Пользователь Сообщений: 8 |
#22 25.08.2016 12:49:50 Ну он и говорит, что не закрыт иф. В вашем случае
|
||
Honey Пользователь Сообщений: 204 |
#23 25.08.2016 12:53:05 dred_fk, ааа… А я думала можно и так… Опять-таки из опыта формул:
Ох, почему они такие разные в строении конструкций(( Изменено: Honey — 25.08.2016 12:53:23 |
||
Hugo Пользователь Сообщений: 23253 |
#24 25.08.2016 12:56:09
Если значений сколько в примере +3 — то не парьтесь, это не много. |
||
Honey Пользователь Сообщений: 204 |
#25 25.08.2016 13:10:40 Hugo, Спасибо! |
Home / VBA / VBA IF OR (Test Multiple Conditions)
You can use the OR operator with the VBA IF statement to test multiple conditions. When you use it, it allows you to test two or more conditions simultaneously and returns true if any of those conditions are true. But if all the conditions are false only then it returns false in the result.
Use OR with IF
- First, start the IF statement with the “IF” keyword.
- After that, specify the first condition that you want to test.
- Next, use the OR keyword to specify the second condition.
- In the end, specify the second condition that you want to test.
To have a better understanding let’s see an example.
Sub myMacro()
'two conditions to test using OR
If 1 = 1 Or 2 < 1 Then
MsgBox "One of the conditions is true."
Else
MsgBox "None of the conditions are true."
End If
End Sub
If you look at the above example, we have specified two conditions one if (1 = 1) and the second is (2 < 1), and here only the first condition is true, and even though it has executed the line of code that we have specified if the result is true.
Now let’s see if both conditions are false, let me use a different code here.
Sub myMacro()
'two conditions to test using OR
If 1 = 2 Or 2 < 1 Then
MsgBox "One of the conditions is true."
Else
MsgBox "None of the conditions are true."
End If
End Sub
In the above code, both conditions are false, and when you run this code, it executes the line of code that we have specified if the result is false.
In the same way, you can also test more than two conditions at the same time. Let’s continue the above example and add the third condition to it.
Sub myMacro()
'three conditions to test using OR
If 1 = 1 And 2 > 1 And 1 - 1 = 0 Then
MsgBox "one of the conditions is true."
Else
MsgBox "none of the conditions are true."
End If
End Sub
Now we have three conditions to test, and we have used the OR after the second condition to specify the third condition. As you learned above that when you use OR, any of the conditions need to be true to get true in the result. When you run this code, it executes the line of code that we have specified for the true.
And if all the conditions are false, just like you have in the following code, it returns false.
Sub myMacro()
'three conditions to test using OR
If 1 < 1 And 2 < 1 And 1 + 1 = 0 Then
MsgBox "one of the conditions is true."
Else
MsgBox "none of the conditions are true."
End If
End Sub
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Excel для Mac 2011 Excel Starter 2010 Еще…Меньше
ИЛИ — одна из логических функций, с помощью которой можно определить наличие условий, которые принимают значение ИСТИНА.
Пример
Функция ИЛИ возвращает значение ИСТИНА, если в результате вычисления хотя бы одного из ее аргументов получается значение ИСТИНА, и значение ЛОЖЬ, если в результате вычисления всех ее аргументов получается значение ЛОЖЬ.
Обычно функция ИЛИ используется для расширения возможностей других функций, выполняющих логическую проверку. Например, функция ЕСЛИ выполняет логическую проверку и возвращает одно значение, если при проверке получается значение ИСТИНА, и другое значение, если при проверке получается значение ЛОЖЬ. Использование функции ИЛИ в качестве аргумента «лог_выражение» функции ЕСЛИ позволяет проверять несколько различных условий вместо одного.
Синтаксис
ИЛИ(логическое_значение1;[логическое значение2];…)
Аргументы функции ИЛИ описаны ниже.
Аргумент |
Описание |
---|---|
Логическое_значение1 |
Обязательный аргумент. Первое проверяемое условие, вычисление которого дает значение ИСТИНА или ЛОЖЬ. |
Логическое_значение2;… |
Необязательные аргументы. Дополнительные проверяемые условия, вычисление которых дает значение ИСТИНА или ЛОЖЬ. Условий может быть не более 255. |
Примечания
-
Аргументы должны принимать логические значения (ИСТИНА или ЛОЖЬ) либо быть массивами либо ссылками, содержащими логические значения.
-
Если аргумент, который является ссылкой или массивом, содержит текст или пустые ячейки, то такие значения игнорируются.
-
Если заданный диапазон не содержит логических значений, функция ИЛИ возвращает значение ошибки #ЗНАЧ!.
-
Можно воспользоваться функцией ИЛИ в качестве формулы массива, чтобы проверить, имеется ли в нем то или иное значение. Чтобы ввести формулу массива, нажмите клавиши CTRL+SHIFT+ВВОД.
Примеры
Ниже представлено несколько общих примеров использования функции ИЛИ как отдельно, так и в сочетании с функцией ЕСЛИ.
Формула |
Описание |
---|---|
=ИЛИ(A2>1;A2<100) |
Возвращает значение ИСТИНА, если число в ячейке A2 больше 1 ИЛИ меньше 100. В противном случае возвращает значение ЛОЖЬ. |
=ЕСЛИ(ИЛИ(A3>1;A3<100);A3;»Значение вне допустимого диапазона») |
Возвращает значение ячейки A3, если оно меньше 100 ИЛИ больше 1. В противном случае возвращает сообщение «Значение вне допустимого диапазона». |
=ЕСЛИ(ИЛИ(A2<0;A2>50);A2;»Значение вне допустимого диапазона») |
Возвращает значение ячейки A2, если оно меньше 0 ИЛИ превышает 50. В противном случае возвращает сообщение «Значение вне допустимого диапазона». |
Расчет комиссионных
Ниже приводится решение довольно распространенной задачи: с помощью функций ЕСЛИ и ИЛИ определяется, заработал ли торговый сотрудник комиссионные, а также вычисляется их размер.
-
=ЕСЛИ(ИЛИ(B14>=$B$4;C14>=$B$5);B14*$B$6;0) — ЕСЛИ общие продажи больше целевых продаж или равны им (>=) ИЛИ число договоров больше целевого или равно ему (>=), общие продажи умножаются на процент комиссионных. В противном случае возвращается значение 0.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Статьи по теме
Видео: расширенные функции ЕСЛИ
Узнайте, как использовать вложенные функции в формуле
Функция ЕСЛИ
Функция И
Функция НЕ
Общие сведения о формулах в Excel
Как избежать ошибок в формулах
Обнаружение ошибок в формулах
Сочетания клавиш в Excel
Логические функции (справка)
Excel (по алфавиту)
Excel (по категориям)
Нужна дополнительная помощь?
На чтение 19 мин. Просмотров 24.7k.
Пьер Корнель
Угадай, если сможешь, и выбери, если посмеешь
Содержание
- Краткое руководство по VBA If Statement
- Что такое IF и зачем оно тебе?
- Тестовые данные
- Формат операторов VBA If Then
- Простой пример If Then
- Условия IF
- Использование If ElseIf
- Использование If Else
- Используя If And/If Or
- Функция IIF
- Использование Select Case
- Попробуйте это упражнение
Краткое руководство по VBA If Statement
Описание | Формат | Пример |
If Then | If [условие верно] Then [действие] End If |
If score = 100 Then Debug.Print «Отлично» End If |
If Else | If [условие верно] Then [действие] Else [действие] End If |
If score = 100 Then Debug.Print «Отлично» Else Debug.Print «Попробуй снова» End If |
If ElseIf | If [1 условие верно] Then [действие] ElseIf [2 условие верно] Then [действие] End If |
If score = 100 Then Debug.Print «Отлично» ElseIf score > 50 Then Debug.Print «Пройдено» ElseIf score <= 50 Then Debug.Print «Попробуй снова» End If |
Else и ElseIf (Else должно идти после ElseIf’s) |
If [1 условие верно] Then [действие] ElseIf [2 условие верно] Then [действие] Else [действие] End If |
If score = 100 Then Debug.Print «Отлично» ElseIf score > 50 Then Debug.Print «Пройдено» ElseIf score > 30 Then Debug.Print «Попробуй снова» Else Debug.Print «Ой» End If |
If без Endif (Только одна строка) |
If [условие верно] Then [действие] |
If value <= 0 Then value = 0 |
В следующем коде показан простой пример использования
оператора VBA If
If Sheet1.Range("A1").Value > 5 Then Debug.Print "Значение больше 5." ElseIf Sheet1.Range("A1").Value < 5 Then Debug.Print "Значение меньше 5." Else Debug.Print "Значение равно 5." End If
Что такое IF и зачем оно тебе?
Оператор VBA If используется, чтобы позволить вашему коду
делать выбор, когда он выполняется.
Вам часто захочется сделать выбор на основе данных, которые
читает ваш макрос.
Например, вы можете захотеть читать только тех учеников, у
которых оценки выше 70. Когда вы читаете каждого учащегося, вы можете
использовать инструкцию If для проверки отметок каждого учащегося.
Важным словом в последнем предложении является проверка. Оператор
If используется для проверки значения, а затем для выполнения задачи на основе
результатов этой проверки.
Тестовые данные
Мы собираемся использовать следующие тестовые данные для
примеров кода в этом посте.
Формат операторов VBA If Then
Формат оператора If Then следующий
За ключевым словом If следуют условие и ключевое слово Then
Каждый раз, когда вы используете оператор If Then, вы должны использовать соответствующий оператор End If.
Когда условие оценивается как истинное, обрабатываются все
строки между If Then и End If.
If [условие верно] Then [строки кода] [строки кода] [строки кода] End If
Чтобы сделать ваш код более читабельным, рекомендуется
делать отступы между операторами If Then и End If.
Отступ между If и End If
Отступ означает просто переместить строку кода на одну вкладку вправо. Правило большого пальца состоит в том, чтобы сделать отступ между начальным и конечным операторами, такими как:
Sub … End Sub
If Then … End If
If Then… ElseIf … Else … Endif
For … Next
Do While … Loop
Select Case … End Case
Для отступа в коде вы можете выделить строки для отступа и нажать клавишу Tab. Нажатие клавиш Shift + Tab сделает отступ кода, т.е. переместит его на одну вкладку влево.
Вы также можете использовать значки на панели инструментов Visual Basic для отступа кода.
Если вы посмотрите на примеры кода на этом сайте, вы увидите, что код имеет отступ.
Простой пример If Then
Следующий код выводит имена всех студентов с баллами более 50.
Sub ChitatOcenki() Dim i As Long ' Пройдите столбцы отметок For i = 2 To 11 ' Проверьте, больше ли баллов,чем 50 If Sheet1.Range("C" & i).Value > 50 Then ' Напечатайте имя студента в «Immediate Window» (Ctrl + G) Debug.Print Sheet1.Range("A" & i).Value & " " & Sheet1.Range("B" & i).Value End If Next End Sub
Результаты:
- Василий Кочин
- Максим Бородин
- Дмитрий Маренин
- Олеся Клюева
- Евгений Яшин
Поэкспериментируйте с этим примером и проверьте значение или знак > и посмотрите, как изменились результаты.
Условия IF
Часть кода между ключевыми словами If и Then называется условием. Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как «>, <, <>,> =, <=, =».
Ниже приведены примеры условий:
Условие | Это верно, когда |
x < 5 | x меньше,чем 5 |
x <= 5 | x меньше, либо равен 5 |
x > 5 | x больше, чем 5 |
x >= 5 | x больше, либо равен 5 |
x = 5 | x равен 5 |
x <> 5 | x не равен 5 |
x > 5 And x < 10 | x больше, чем 5 И x меньше, чем 10 |
x = 2 Or x >10 | x равен 2 ИЛИ x больше,чем 10 |
Range(«A1») = «Иван» | Ячейка A1 содержит текст «Иван» |
Range(«A1») <> «Иван» | Ячейка A1 не содержит текст «Иван» |
Вы могли заметить x = 5, как условие. Не стоит путать с х = 5, при использовании в качестве назначения.
Когда в условии используется «=», это означает, что «левая сторона равна правой стороне».
В следующей таблице показано, как знак равенства используется
в условиях и присваиваниях.
Использование «=» | Тип | Значение |
Loop Until x = 5 | Условие | Равен ли x пяти |
Do While x = 5 | Условие | Равен ли x пяти |
If x = 5 Then | Условие | Равен ли x пяти |
For x = 1 To 5 | Присваивание | Установите значение х = 1, потом = 2 и т.д. |
x = 5 | Присваивание | Установите х до 5 |
b = 6 = 5 | Присваивание и условие |
Присвойте b результату условия 6 = 5 |
x = MyFunc(5,6) | Присваивание | Присвойте х значение, возвращаемое функцией |
Последняя запись в приведенной выше таблице показывает
оператор с двумя равными. Первый знак равенства — это присвоение, а любые
последующие знаки равенства — это условия.
Поначалу это может показаться странным, но подумайте об этом
так. Любое утверждение, начинающееся с переменной и равно, имеет следующий
формат
[переменная] [=] [оценить эту часть]
Поэтому все, что находится справа от знака равенства, оценивается и результат помещается в переменную. Посмотрите на последние три строки таблицы, как:
[x] [=] [5]
[b] [=] [6 = 5]
[x] [=] [MyFunc (5,6)]
Использование If ElseIf
Инструкция ElseIf позволяет вам выбирать из нескольких вариантов. В следующем примере мы печатаем баллы, которые находятся в диапазоне.
Sub IspElseIf() If Marks >= 85 Then Debug.Print "Высший балл" ElseIf Marks >= 75 Then Debug.Print "Отлично" End If End Sub
Важно понимать, что порядок важен. Условие If проверяется
первым.
Если это правда, то печатается «Высший балл», и оператор If заканчивается.
Если оно ложно, то код переходит к следующему ElseIf и
проверяет его состояние.
Давайте поменяемся местами If и ElseIf из последнего
примера. Код теперь выглядит так
Sub IspElseIfNeverno() ' Этот код неверен, так как ElseIf никогда не будет верным If Marks >= 75 Then Debug.Print "Отлично" ElseIf Marks >= 85 Then ' код никогда не достигнет здесь Debug.Print "Высший балл" End If End Sub
В этом случае мы сначала проверяем значение более 75. Мы никогда не будем печатать «Высший балл», потому что, если значение больше 85, это вызовет первый оператор if.
Чтобы избежать подобных проблем, мы должны использовать два
условия. Они помогают точно указать, что вы ищете, чтобы избежать путаницы.
Пример ниже показывает, как их использовать. Мы рассмотрим более многочисленные
условия в разделе ниже.
If marks >= 75 And marks < 85 Then Debug.Print "Отлично" ElseIf marks >= 85 And marks <= 100 Then Debug.Print "Высший балл" End If
Давайте расширим оригинальный код. Вы можете использовать столько операторов ElseIf, сколько захотите. Мы добавим еще несколько, чтобы учесть все наши классификации баллов.
Использование If Else
Утверждение Else используется, как ловушка для всех. Это в основном означает «если бы не было условий» или «все остальное». В предыдущем примере кода мы не включили оператор печати для метки сбоя. Мы можем добавить это, используя Else.
Sub IspElse() If Marks >= 85 Then Debug.Print "Высший балл" ElseIf Marks >= 75 Then Debug.Print "Отлично" ElseIf Marks >= 55 Then Debug.Print "Хорошо" ElseIf Marks >= 40 Then Debug.Print "Удовлетворительно" Else ' Для всех других оценок Debug.Print "Незачет" End If End Sub
Так что, если это не один из других типов, то это провал.
Давайте напишем некоторый код с помощью наших примеров
данных и распечатаем студента и его классификацию.
Sub DobClass() ' получить последнюю строку Dim startRow As Long, lastRow As Long startRow = 2 lastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row Dim i As Long, Marks As Long Dim sClass As String ' Пройдите столбцы отметок For i = startRow To lastRow Marks = Sheet1.Range("C" & i).Value ' Проверьте отметки и классифицируйте соответственно If Marks >= 85 Then sClass = "Высший балл" ElseIf Marks >= 75 Then sClass = "Отлично" ElseIf Marks >= 55 Then sClass = "Хорошо" ElseIf Marks >= 40 Then sClass = "Удовлетворительно" Else ' Для всех других оценок sClass = "Незачет" End If ' Запишите класс в столбец E Sheet1.Range("E" & i).Value = sClass Next End Sub
Результаты выглядят так: в столбце E — классификация баллов
Используя If And/If Or
В выражении If может быть несколько условий. Ключевые слова VBA And и Or позволяют использовать несколько условий.
Эти слова работают так же, как вы используете их на
английском языке.
Давайте снова посмотрим на наши примеры данных. Теперь мы
хотим напечатать всех студентов, которые набрали от 50 до 80 баллов.
Мы используем Аnd, чтобы добавить дополнительное условие. Код гласит: если оценка больше или равна 50 и меньше 75, напечатайте имя студента.
Sub ProverkaStrokiOcenok() Dim i As Long, marks As Long For i = 2 To 11 ' Хранить оценки для текущего студента marks = Sheet1.Range("C" & i).Value ' Проверьте, если отметки больше 50 и меньше 75 If marks >= 50 And marks < 80 Then ' Напечатайте имя и фамилию в Immediate window (Ctrl+G) Debug.Print Sheet1.Range("A" & i).Value & Sheet1.Range("B" & i).Value End If Next End Sub
Вывести имя и фамилию в результаты:
- Дмитрий Маренин
- Олеся Клюева
- Евгений Яшин
В нашем следующем примере мы хотим знать, кто из студентов сдавал историю или геометрию. Таким образом, в данном случае мы говорим, изучал ли студент «История» ИЛИ изучал ли он «Геометрия» (Ctrl+G).
Sub ChitatObektOcenki() Dim i As Long, marks As Long ' Пройдите столбцы отметок For i = 2 To 11 marks = Sheet1.Range("D" & i).Value ' Проверьте, если отметки больше 50 и меньше 80 If marks = "История" Or marks = "Геометрия" Then ' Напечатайте имя и фамилию в Immediate window (Ctrl+G) Debug.Print Sheet1.Range("A" & i).Value & " " & Sheet1.Range("B" & i).Value End If Next End Sub
Результаты:
- Василий Кочин
- Александр Грохотов
- Дмитрий Маренин
- Николай Куликов
- Олеся Клюева
- Наталия Теплых
- Дмитрий Андреев
Использование нескольких таких условий часто является
источником ошибок. Эмпирическое правило, которое нужно помнить, должно быть
максимально простым.
Использование IF AND
And работает следующим образом:
Условие 1 | Условие 2 | Результат |
ИСТИНА | ИСТИНА | ИСТИНА |
ИСТИНА | ЛОЖЬ | ЛОЖЬ |
ЛОЖЬ | ИСТИНА | ЛОЖЬ |
ЛОЖЬ | ЛОЖЬ | ЛОЖЬ |
Что вы заметите, так это то, что And верно только тогда, когда все условия выполняются.
Использование IF OR
Ключевое слово OR работает следующим образом
Условие 1 | Условие 2 | Результат |
ИСТИНА | ИСТИНА | ИСТИНА |
ИСТИНА | ЛОЖЬ | ИСТИНА |
ЛОЖЬ | ИСТИНА | ИСТИНА |
ЛОЖЬ | ЛОЖЬ | ЛОЖЬ |
Что вы заметите, так это то, что OR ложно, только когда все условия ложны.
Смешивание And и Or может затруднить чтение кода и привести к ошибкам. Использование скобок может сделать условия более понятными.
Sub OrSAnd() Dim subject As String, marks As Long subject = "История" marks = 5 If (subject = "Геометрия" Or subject = "История") And marks >= 6 Then Debug.Print "ИСТИНА" Else Debug.Print "ЛОЖЬ" End If End Sub
Использование IF NOT
Также есть оператор NOT. Он возвращает противоположный результат условия.
Условие | Результат |
ИСТИНА | ЛОЖЬ |
ЛОЖЬ | ИСТИНА |
Следующие две строки кода эквивалентны.
If marks < 40 Then If Not marks >= 40 Then
так же, как и
If True Then If Not False Then
и
If False Then If Not True Then
Помещение условия в круглые скобки облегчает чтение кода
If Not (marks >= 40) Then
Распространенное использование Not — при проверке, был ли установлен объект. Возьмите Worksheet для примера. Здесь мы объявляем рабочий лист.
Dim mySheet As Worksheet ' Некоторый код здесь
Мы хотим проверить действительность mySheet перед его использованием. Мы можем проверить, если это Nothing.
If mySheet Is Nothing Then
Нет способа проверить, является ли это чем-то, поскольку есть много разных способов, которым это может быть что-то. Поэтому мы используем NOT с Nothing.
If Not mySheet Is Nothing Then
Если вы находите это немного запутанным, вы можете использовать круглые скобки, как здесь
If Not (mySheet Is Nothing) Then
Функция IIF
VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто используете функцию If следующим образом:
= ЕСЛИ (F2 =»»,»», F1 / F2)
Формат
= If (условие, действие, если ИСТИНА, действие, если ЛОЖЬ).
VBA имеет функцию IIf, которая работает так же. Давайте посмотрим на примере. В следующем коде мы используем IIf для проверки значения переменной val. Если значение больше 10, мы печатаем ИСТИНА, в противном случае мы печатаем ЛОЖЬ.
Sub ProveritVal() Dim result As Boolean Dim val As Long ' Печатает ИСТИНА val = 11 result = IIf(val > 10, ИСТИНА, ЛОЖЬ) Debug.Print result ' печатает ЛОЖЬ val = 5 result = IIf(val > 10, ИСТИНА, ЛОЖЬ) Debug.Print result End Sub
В нашем следующем примере мы хотим распечатать «Удовлетворитеьно» или «Незачет» рядом с каждым студентом в зависимости от их баллов. В первом фрагменте кода мы будем использовать обычный оператор VBA If, чтобы сделать это.
Sub ProveritDiapazonOcenok() Dim i As Long, marks As Long For i = 2 To 11 ' Хранить оценки для текущего студента marks = Sheet1.Range("C" & i).Value ' Проверьте, прошел ли студент или нет If marks >= 40 Then ' Запишите имена для столбца F Sheet1.Range("E" & i) = "Удовлетворительно" Else Sheet1.Range("E" & i) = "Незачет" End If Next End Sub
В следующем фрагменте кода мы будем использовать функцию IIf. Код здесь намного аккуратнее.
Sub ProveritDiapazonOcenok () Dim i As Long, marks As Long For i = 2 To 11 ' Хранить оценки для текущего студента marks = Sheet1.Range("C" & i) ' Проверьте, прошел ли студент или нет Sheet1.Range("E" & i).Value = IIf(marks >= 40,"Удовлетворительно","Незачет") Next End Sub
Функция IIf очень полезна для простых случаев, когда вы имеете дело с двумя возможными вариантами.
Использование Nested IIf
Вы также можете вкладывать IIf-операторы, как в Excel. Это означает использование результата одного IIf с другим. Давайте добавим еще один тип результата в наши предыдущие примеры. Теперь мы хотим напечатать «Отлично», «Удовлетворительно» или «Незачетт» для каждого студента.
Используя обычный VBA, мы сделали бы это так
Sub ProveritRezultatiTip2() Dim i As Long, marks As Long For i = 2 To 11 ' Хранить оценки для текущего студента marks = Sheet1.Range("C" & i).Value If marks >= 75 Then Sheet1.Range("E" & i).Value = "Отлично" ElseIf marks >= 40 Then ' Запишите имена для столбца F Sheet1.Range("E" & i).Value = "Удовлетворительно" Else Sheet1.Range("E" & i).Value = "Незачет" End If Next End Sub
Используя вложенные IIfs, мы могли бы сделать это так
Sub IspNestedIIF() Dim i As Long, marks As Long, result As String For i = 2 To 11 marks = Sheet1.Range("C" & i).Value result = IIf(marks >= 55,"Хорошо",IIf(marks >= 40,"Удовлетворительно","Незачет")) Sheet1.Range("E" & i).Value = result Next End Sub
Использование вложенного IIf хорошо в простых случаях, подобных этому. Код прост для чтения и, следовательно, вряд ли вызовет ошибки.
Чего нужно остерегаться
Важно понимать, что функция IIf всегда оценивает как
Истинную, так и Ложную части выражения независимо от условия.
В следующем примере мы хотим разделить по баллам, когда он не равен нулю. Если он равен нулю, мы хотим вернуть ноль.
marks = 0 total = IIf(marks = 0, 0, 60 / marks)
Однако, когда отметки равны нулю, код выдаст ошибку «Делить на ноль». Это потому, что он оценивает как Истинные, так и Ложные утверждения. Здесь ложное утверждение, т.е. (60 / Marks), оценивается как ошибка, потому что отметки равны нулю.
Если мы используем нормальный оператор IF, он будет
запускать только соответствующую строку.
marks = 0 If marks = 0 Then 'Выполняет эту строку только когда отметки равны нулю total = 0 Else 'Выполняет только эту строку, когда отметки не равны нулю total = 60 / marks End If
Это также означает, что если у вас есть функции для ИСТИНА и ЛОЖЬ, то обе будут выполнены. Таким образом, IIF будет запускать обе функции, даже если он использует только одно возвращаемое значение. Например:
' Обе функции будут выполняться каждый раз total = IIf(marks = 0, Func1, Func2)
IF против IIf
Так что лучше?
В этом случае вы можете видеть, что IIf короче для написания и аккуратнее. Однако если условия усложняются, вам лучше использовать обычное выражение If. Недостатком IIf является то, что он недостаточно известен, поэтому другие пользователи могут не понимать его так же, как и код, написанный с помощью обычного оператора if.
Кроме того, как мы обсуждали в последнем разделе, IIF всегда оценивает части ИСТИНА и ЛОЖЬ, поэтому, если вы имеете дело с большим количеством данных, оператор IF будет быстрее.
Мое эмпирическое правило заключается в том, чтобы
использовать IIf, когда
он будет прост для чтения и не требует вызовов функций. Для более сложных
случаев используйте обычный оператор If.
Использование Select Case
Оператор Select Case
— это альтернативный способ написания статистики If с большим количеством ElseIf. Этот тип операторов
вы найдете в большинстве популярных языков программирования, где он называется
оператором Switch. Например,
Java, C #, C ++ и Javascript
имеют оператор switch.
Формат
Select Case [переменная] Case [условие 1] Case [условие 2] Case [условие n] Case Else End Select
Давайте возьмем наш пример DobClass сверху и перепишем его с помощью оператора Select Case.
Sub DobavitClass() ' получить последнюю строку Dim startRow As Long, lastRow As Long startRow = 2 lastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row Dim i As Long, Marks As Long Dim sClass As String ' Пройдите столбцы отметок For i = startRow To lastRow Marks = Sheet1.Range("C" & i).Value ' Проверьте отметки и классифицируйте соответственно If Marks >= 85 Then sClass = "Высший балл" ElseIf Marks >= 75 Then sClass = "Отлично" ElseIf Marks >= 55 Then sClass = "Хорошо" ElseIf Marks >= 40 Then sClass = "Удовлетворительно" Else ' Для всех других оценок sClass = "Незачет" End If ' Запишите класс в столбец E Sheet1.Range("E" & i).Value = sClass Next End Sub
Ниже приведен тот же код с использованием оператора Select Case. Главное, что вы заметите, это то, что мы используем “Case 85 to 100” rather than “marks >=85 And marks <=100”. , а не “marks >=85 And marks <=100”.
Sub DobavitClassSSelect() ' получить первую и последнюю строки Dim firstRow As Long, lastRow As Long firstRow = 2 lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row Dim i As Long, marks As Long Dim sClass As String ' Пройдите столбцы отметок For i = firstRow To lastRow marks = Sheet1.Range("C" & i).Value ' Проверьте отметки и классифицируйте соответственно Select Case marks Case 85 To 100 sClass = "Высший балл" Case 75 To 84 sClass = "Отлично" Case 55 To 74 sClass = "Хорошо" Case 40 To 54 sClass = "Удовлетворительно" Case Else ' Для всех других оценок sClass = "Незачет" End Select ' Запишите класс в столбец E Sheet1.Range("E" & i).Value = sClass Next End Sub
Использование Case Is
Вы можете переписать оператор select в том же формате, что и оригинальный ElseIf. Вы можете использовать Is с Case.
Select Case marks Case Is >= 85 sClass = "Высший балл" Case Is >= 75 sClass = "Отлично" Case Is >= 55 sClass = "Хорошо" Case Is >= 40 sClass = "Удовлетворительно" Case Else ' Для всех других оценок sClass = "Незачет" End Select
Вы можете использовать Is для проверки нескольких значений.
В следующем коде мы проверяем, равны ли оценки 5, 7 или 9.
Sub TestNeskZnach() Dim marks As Long marks = 7 Select Case marks Case Is = 5, 7, 9 Debug.Print True Case Else Debug.Print False End Select End Sub
Попробуйте это упражнение
В этой статье много рассказывали о выражении If. Хороший способ помочь вам понять — это попытаться написать код, используя темы, которые мы рассмотрели. В следующем упражнении используются тестовые данные из этой статьи. Ответ на упражнение ниже.
Мы будем использовать ячейку G1, чтобы написать имя
субъекта.
В колонках от H до L запишите всех студентов, которые имеют оценки по этому предмету. Мы хотим классифицировать их результат как успешный или неудачный. Оценка ниже 40 — неудача, оценка 40 или выше — Зачет.
Колонка H: Имя
Колонка I: Фамилия
Колонка J: Баллы
Колонка H: Предмет
Столбец I: Тип результата — Зачет или Незачет
Если ячейка G1 содержит «Геометрия», то ваш результат должен выглядеть следующим образом:
Ответ на упражнение
Следующий код показывает, как выполнить вышеупомянутое упражнение.
Примечание: есть много способов выполнить задачу, поэтому не расстраивайтесь, если ваш код отличается.
Sub ZapisatRezultat() ' Получить тему Dim subject As String subject = Sheet1.Range("G1").Value If subject = "" Then Exit Sub End If ' Получить первый и последний ряд Dim firstRow As Long, lastRow As Long firstRow = 2 lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row ' Очистить любой существующий вывод Sheet1.Range("H:L").ClearContents ' Отслеживать выходной ряд Dim outRow As Long outRow = 1 Dim i As Long, marks As Long, rowSubject As String ' Прочитать данные For i = firstRow To lastRow marks = Sheet1.Range("C" & i).Value rowSubject = Sheet1.Range("D" & i).Value If rowSubject = subject Then ' Запишите данные студента, если предмет Геометрия Sheet1.Range("A" & i & ":" & "D" & i).Copy Sheet1.Range("H" & outRow).PasteSpecial xlPasteValues ' Запишите Зачет или Незачет If marks < 40 Then Sheet1.Range("L" & outRow).Value = "Незачет" ElseIf marks >= 40 Then Sheet1.Range("L" & outRow).Value = "Зачет" End If ' Переместить вывод в следующую строку outRow = outRow + 1 End If Next i End Sub
Содержание
- Оператор Or
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- Логические операторы VBA
- Логический оператор AND
- Логический оператор OR
- Логический оператор NOT
- Логический оператор XOR
- Логический оператор EQV
- Логический оператор IMP
- Операторы и встроенные функции VBA
- Операторы Excel VBA
- Математические операторы
- Строковые операторы
- Операторы сравнения
- Логические операторы
- Встроенные функции
Оператор Or
Используется для выполнения логической дизъюнкции двух выражений.
Синтаксис
Результат = expression1Илиexpression2
Синтаксис оператора Or содержит следующие части:
Part | Описание |
---|---|
result | Обязательный элемент; любая числовая переменная. |
выражение1 | Обязательный элемент, любое допустимое выражение. |
выражение2 | Обязательный элемент, любое допустимое выражение. |
Замечания
Если хотя бы одно выражение имеет значение True, переменная результат принимает значение True. В следующей таблице показано, как определяется результат .
Если expression1 равняется | И expression2 равняется | То результат равняется |
---|---|---|
True | True | True |
True | False | True |
True | Null | True |
False | True | True |
False | False | False |
False | Null | Null |
Null | True | True |
Null | False | Null |
Null | Null | Null |
Оператор Or также выполняет побитовое сравнение одинаково расположенных битов в двух числовых выражениях и задает соответствующий бит в результате в соответствии со следующей таблицей.
Если бит в expression1 равняется | И бит в expression2 равняется | То результат равняется |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Пример
В этом примере оператор Or используется для выполнения логической дизъюнкции двух выражений.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Логические операторы VBA
Оператор | Синтаксис | Описание |
AND | A AND B | Конъюнкция: Если А и В имеют значение True, то — True. Иначе — False |
OR | A OR B | Дизъюнкция: Если любой из операндов имеет значение True, то — True. Иначе — False |
NOT | NOT A | Отрицание: Если А имеет значение False, то — True. Иначе — False |
XOR | A XOR B | Исключение: Если А имеет значение True или В имеет значение True, то — True. Иначе — False |
EQV | A EQV B | Эквивалентность: Если А имеет такое же значение что и В, то — True. Иначе — False |
IMP | A IMP B | Импликация: Если А имеет значение True и В имеет значение False, то — False. Иначе — True |
В качестве операнда для логического оператора можно использовать любое действительное выражение, имеющее результат типа Boolean, а также число, которое может быть преобразовано в значение типа Boolean.
Результатом логической операции является значение типа Boolean (или Null, если хотя бы один из операндов имеет значение Null).
Логический оператор AND
Синтаксис:
Операнд_1 AND Операнд_2
Оператор AND выполняет логическую конъюнкцию.
Результатом данной операции является значение True, только когда оба операнда имеют значение True, иначе — False.
Операнд_1 | Операнд_2 | Результат |
True | True | True |
True | False | False |
False | True | False |
False | False | False |
Оператор AND можно использовать для нескольких операндов:
(5 3) AND (5=6) результатом будет False
Независимо от количества операндов результатом логической операции AND будет True только в том случае, когда все операнды выражения будут иметь значение True. В любом другом случае результатом будет False. Обратите внимание, что операнды заключаются в круглые скобки. VBA сначала вычисляет значение каждого операнда внутри скобок, а затем уже все выражение полностью.
Логический оператор OR
Синтаксис:
Операнд_1 OR Операнд_2
Оператор OR выполняет логическую дизъюнкцию.
Результатом данной операции является значение True, если хотя бы один из операндов имеет значение True, иначе — False.
Операнд_1 | Операнд_2 | Результат |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
Оператор OR можно использовать для нескольких операндов:
(5 3) OR (5=6) результатом будет True
Независимо от количества операндов результатом логической операции OR будет всегда True в том случае, если хотя бы один из операндов выражения будет иметь значение True. Иначе результатом будет False.
Операторы AND и OR можно комбинировать:
((5 3)) OR (5=6) результатом будет True
Логический оператор NOT
Синтаксис:
NOT Операнд
Оператор NOT выполняет логическое отрицание.
Оператор NOT использует только один операнд.
Операнд | Результат |
True | False |
False | True |
Операторы AND OR NOT можно комбинировать:
((5 3)) OR NOT (5=6) результатом будет True
Логический оператор XOR
Синтаксис:
Операнд_1 XOR Операнд_2
Оператор XOR выполняет логическое исключение.
Результатом данной операции является значение True, если операнды имеют разные значения, иначе — False.
Операнд_1 | Операнд_2 | Результат |
True | True | False |
True | False | True |
False | True | True |
False | False | False |
((5 3)) OR NOT (5=6) XOR (5=5) результатом будет False
Логический оператор EQV
Синтаксис:
Операнд_1 EQV Операнд_2
Оператор EQV — это оператор логической эквивалентности.
Результатом данной операции является значение True, если операнды имеют одинаковые значения, иначе — False.
Операнд_1 | Операнд_2 | Результат |
True | True | True |
True | False | False |
False | True | False |
False | False | True |
((5 3)) OR NOT (5=6) EQV (5=5) результатом будет True
Логический оператор IMP
Синтаксис:
Операнд_1 IMP Операнд_2
Оператор IMP выполняет логическую операцию импликации.
Операнд_1 | Операнд_2 | Результат |
True | True | True |
True | False | False |
False | True | True |
False | False | True |
((5 3)) OR NOT (5=6) IMP (5=5) результатом будет True
Логический оператор IMP наименее интуитивно понятный из всех логических операторов. К счастью, необходимость в его применении возникает довольно редко.
В начало страницы
В начало страницы
Источник
Операторы и встроенные функции VBA
Операторы Excel VBA
При написании кода VBA в Excel набор встроенных операторов используют на каждом шагу. Эти операторы делятся на математические, строковые, операторы сравнения и логические. Далее мы подробно рассмотрим каждую группу операторов.
Математические операторы
Основные математические операторы VBA перечислены в таблице ниже.
В правом столбце таблицы указан приоритет операторов, принятый по умолчанию при отсутствии скобок. Добавляя в выражение скобки, можно изменять порядок выполнения операторов VBA по своему желанию.
Оператор | Действие | Приоритет (1 — высший; 5 — низший) |
---|---|---|
^ | Оператор возведения в степень | 1 |
* | Оператор умножения | 2 |
/ | Оператор деления | 2 |
Оператор деления без остатка – возвращает результат деления двух чисел без остатка. Например, 74 возвратит результат 1 | 3 | |
Mod | Оператор модуля (остатка) – возвращает остаток от деления двух чисел. Например, 8 Mod 3 возвратит результат 2. | 4 |
+ | Оператор сложения | 5 |
— | Оператор вычитания | 5 |
Строковые операторы
Основной строковый оператор в Excel VBA – это оператор конкатенации & (слияние):
Оператор | Действие |
---|---|
& | Оператор конкатенации. К примеру, выражение «A» & «B» возвратит результат AB. |
Операторы сравнения
Операторы сравнения используются для сравнения двух чисел или строк и возвращают логическое значение типа Boolean (True или False). Основные операторы сравнения Excel VBA перечислены в этой таблице:
Оператор | Действие |
---|---|
= | Равно |
<> | Не равно |
Больше | |
= | Больше либо равно |
Логические операторы
Логические операторы, как и операторы сравнения, возвращают логическое значение типа Boolean (True или False). Основные логические операторы Excel VBA перечислены в таблице ниже:
Оператор | Действие |
---|---|
And | Операция конъюнкции, логический оператор И. Например, выражение A And B возвратит True, если A и B оба равны True, в противном случае возвратит False. |
Or | Операция дизъюнкции, логический оператор ИЛИ. Например, выражение A Or B возвратит True, если A или B равны True, и возвратит False, если A и B оба равны False. |
Not | Операция отрицания, логический оператор НЕ. Например, выражение Not A возвратит True, если A равно False, или возвратит False, если A равно True. |
В приведённой выше таблице перечислены не все логические операторы, доступные в VBA. Полный список логических операторов можно найти на сайте Visual Basic Developer Center.
Встроенные функции
В VBA доступно множество встроенных функций, которые могут быть использованы при написании кода. Ниже перечислены некоторые из наиболее часто используемых:
Функция | Действие | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Abs | Возвращает абсолютную величину заданного числа.
|
||||||||||||||||||||||
Chr | Возвращает символ ANSI, соответствующий числовому значению параметра.
|
||||||||||||||||||||||
Date | Возвращает текущую системную дату. | ||||||||||||||||||||||
DateAdd | Добавляет определённый временной интервал к заданной дате. Синтаксис функции:
Где аргумент интервал определяет тип временного интервала, добавляемого к заданной дате в количестве, указанном в аргументе число . Аргумент интервал может принимать одно из следующих значений:
|
||||||||||||||||||||||
DateDiff | Вычисляет количество определённых временных интервалов между двумя заданными датами.
|
||||||||||||||||||||||
Day | Возвращает целое число, соответствующее дню месяца в заданной дате.
Пример: Day(«29/01/2015») возвращает число 29. |
||||||||||||||||||||||
Hour | Возвращает целое число, соответствующее количеству часов в заданном времени.
Пример: Hour(«22:45:00») возвращает число 22. |
||||||||||||||||||||||
InStr | Принимает в качестве аргументов целое число и две строки. Возвращает позицию вхождения второй строки внутри первой, начиная поиск с позиции, заданной целым числом.
Примечание: Аргумент-число может быть не задан, в таком случае поиск начинается с первого символа строки, заданной во втором аргументе функции. |
||||||||||||||||||||||
Int | Возвращает целую часть заданного числа.
Пример: Int(5.79) возвращает результат 5. |
||||||||||||||||||||||
Isdate | Возвращает True, если заданное значение является датой, или False – если датой не является.
|
||||||||||||||||||||||
IsError | Возвращает True, если заданное значение является ошибкой, или False – если ошибкой не является. | ||||||||||||||||||||||
IsMissing | В качестве аргумента функции передаётся имя необязательного аргумента процедуры. IsMissing возвращает True, если для рассматриваемого аргумента процедуры не передано значение. | ||||||||||||||||||||||
IsNumeric | Возвращает True, если заданное значение может быть рассмотрено как число, в противном случае возвращает False. | ||||||||||||||||||||||
Left | Возвращает заданное количество символов от начала переданной строки. Синтаксис функции вот такой:
где строка – это исходная строка, а длина – количество возвращаемых символов, считая от начала строки.
|
||||||||||||||||||||||
Len | Возвращает количество символов в строке.
Пример: Len(«абвгдеж») возвращает число 7. |
||||||||||||||||||||||
Month | Возвращает целое число, соответствующее месяцу в заданной дате.
Пример: Month(«29/01/2015») возвращает значение 1. |
||||||||||||||||||||||
Mid | Возвращает заданное количество символов из середины переданной строки. Синтаксис функции:
где строка – это исходная строка, начало – позиция начала извлекаемой строки, длина – количество символов, которые требуется извлечь.
|
||||||||||||||||||||||
Minute | Возвращает целое число, соответствующее количеству минут в заданном времени.Пример: Minute(«22:45:15») возвращает значение 45. | ||||||||||||||||||||||
Now | Возвращает текущую системную дату и время. | ||||||||||||||||||||||
Right | Возвращает заданное количество символов от конца переданной строки. Синтаксис функции:
Где строка – это исходная строка, а длина – это количество символов, которые надо извлечь, считая от конца заданной строки.
|
||||||||||||||||||||||
Second | Возвращает целое число, соответствующее количеству секунд в заданном времени.
Пример: Second(«22:45:15») возвращает значение 15. |
||||||||||||||||||||||
Sqr | Возвращает квадратный корень числовой величины, переданной в аргументе.
|
||||||||||||||||||||||
Time | Возвращает текущее системное время. | ||||||||||||||||||||||
Ubound | Возвращает верхний индекс измерения заданного массива.
Примечание: Для многомерных массивов в качестве необязательного аргумента может быть указано, индекс какого именно измерения нужо возвратить. Если не указано, то по умолчанию равно 1. |
||||||||||||||||||||||
Year | Возвращает целое число, соответствующее году в заданной дате.Пример: Year(«29/01/2015») возвращает значение 2015. |
Данный список включает в себя только избранные наиболее часто употребляемые встроенные функции Excel Visual Basic. Исчерпывающий список функций VBA, доступных для использования в макросах Excel, можно найти на сайте Visual Basic Developer Center.
Источник