Краткое руководство по VBA If Statement
Описание | Формат | Пример |
Если так | Если [условие верно] Итак [действие] Конец о |
Если оценка = 100 Затем Отладка. Печать "Большой» Конец о |
Если иначе | Если [условие верно] Итак [действие] Остальное [действие] Конец о |
Если оценка = 100 Затем Отладка. Печать "Большой» Еще Отладка.Печать "Попробуйте еще раз» Конец о |
Если иначеЕсли | Если [1 условие верно] Итак [действие] ИначеЕсли [2 условие верно] Итак [действие] Конец о |
Если оценка = 100 Затем Отладка. Печать "Большой» ИначеЕсли оценка > 50 Затем Отладка. Печать "Прошедший» В противном случае оценка Затем Отладка. Печать "Попробуйте еще раз» Конец о |
Еще и еще если (В противном случае необходимо идти после ElseIf) |
Если [1 условие верно] Итак [действие] ИначеЕсли [2 условие верно] Итак [действие] Остальное [действие] Конец о |
Если оценка = 100 Затем Отладка. Печать "Большой» ИначеЕсли оценка > 50 Затем Отладка. Печать "Прошедший» ИначеЕсли оценка > 30 Затем Отладка. Печать "Попробуйте еще раз» Еще Отладка.Печать "Ой» Конец о |
Если без Endif (Только один линия) |
Если [условие верно] Итак [действие] |
Если значение Тогда значение = 0 |
В следующем коде показан простой пример использования оператора VBA If
Если Sheet1.Range("A1").Value > 5 Then Debug.Print "Значение больше 5." ElseIf Sheet1.Range("A1").Value Что такое IF и зачем оно тебе?
Оператор VBA If используется, чтобы позволить вашему коду сделать выбор при его выполнении.
Вы часто будете делать выбор на основе данных, которые читает макрос.
Например, вы можете захотеть прочитать только тех учащихся, у которых оценки выше 70. Когда вы читаете каждого учащегося, вы можете использовать оператор If для проверки оценок каждого учащегося.
Важным словом в последнем предложении является подтверждение. Оператор if используется для проверки значения, а затем выполнения задачи на основе результатов этой проверки.
Тестовые данные
Мы будем использовать следующие тестовые данные для примеров кода в этом посте.
Формат операторов VBA If Then
Формат оператора If Then следующий
Если [условие истинно] Тогда
За ключевым словом If следует условие, а затем ключевое слово
Всякий раз, когда вы используете оператор If Then, вы должны использовать соответствующий оператор End If.
Когда условие оценивается как истинное, обрабатываются все строки между If Then и End If.
Если [условие истинно] Тогда [строки кода] [строки кода] [строки кода] End If
Чтобы сделать код более читабельным, рекомендуется делать отступы в операторах If Then и End If.
Отступ между If и End If
Отступ просто означает перемещение строки кода на одну вкладку вправо. Эмпирическое правило заключается в том, чтобы делать отступ между начальным и заключительным предложениями, например:
Саб… Конец сабвуфера
Если То… Конец Если
Если то... ElseIf... Else... Endif
Для … Далее
Выполнить цикл while
Выбрать кейс… Закрыть кейс
Чтобы сделать отступ кода, вы можете выбрать строки, для которых нужно сделать отступ, и нажать клавишу 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 'Напечатать имя учащегося в " Немедленное окно" (Ctrl + G) Debug.Print Sheet1.Range("A" & i).Value & " " & Sheet1.Range("B" & i).Value End If Next End Sub
Полученные результаты:
- Василий Кочин
- Максим Бородин
- Дмитрий Маренин
- Олеся Клюева
- Евгений Яшин
Поэкспериментируйте с этим примером и проверьте значение или знак > и посмотрите, как изменятся результаты.
Условия IF
Часть кода между ключевыми словами If и Then называется условием. Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия используйте такие символы, как «>, ,> =,
Ниже приведены примеры условий:
Состояние | Это правда, когда |
х | х меньше 5 |
х | х меньше или равно 5 |
х > 5 | х больше 5 |
х >= 5 | х больше или равно 5 |
х=5 | х равно 5 |
х 5 | х не равно 5 |
х > 5 и х | х больше 5 И х меньше 10 |
х = 2 или х > 10 | x равно 2 ИЛИ x больше 10 |
Диапазон ("A1") = "Джон» | Ячейка A1 содержит текст «Джон» |
Диапазон("A1") "Джон» | Ячейка A1 не содержит текста «Джон» |
Возможно, вы заметили, что x = 5 является условием. Не путать с x=5 при использовании в качестве пункта назначения.
Когда в условии используется «=», это означает, что «левая сторона равна правой стороне».
В следующей таблице показано, как знак равенства используется в отношениях и назначениях.
Использование «=» | Тип | Важность |
Цикл до x = 5 | Состояние | Х равно пяти |
Делать пока х = 5 | Состояние | Х равно пяти |
Если х = 5 Тогда | Состояние | Х равно пяти |
Для х = от 1 до 5 | Назначение | Установите значение x = 1, затем = 2 и так далее |
х=5 | Назначение | Установите х на 5 |
б=6=5 | Задания и состояние |
Назначить б состояние результат 6 = 5 |
х = МояФункция(5,6) | Назначение | Назначить х важность, вернулся функция |
Последняя запись в таблице выше показывает оператор с двумя равными. Первый знак равенства — это задача, а все последующие знаки равенства — это условия.
Сначала это может показаться странным, но подумайте об этом так. Любой оператор, начинающийся с переменной и равный, имеет следующий формат
[переменная] [=] [оцените этот раздел]
Итак, оценивается то, что находится справа от знака равенства, и результат помещается в переменную. Посмотрите на последние три строки таблицы следующим образом:
[х] [=] [5]
[б] [=] [6 = 5]
[x][=][MyFunc(5,6)]
Использование If ElseIf
Оператор ElseIf позволяет выбрать один из нескольких вариантов. В следующем примере мы печатаем оценки, которые находятся в пределах диапазона.
Sub IspElseIf() If Marks >= 85 Then Debug.Print "Самый высокий" ElseIf Marks >= 75 Then Debug.Print "Excellent" End If End Sub
Важно понимать, что порядок важен. Сначала проверяется условие if.
Если оно истинно, печатается «Самый высокий балл», и оператор If заканчивается.
Если false, код переходит к следующему ElseIf и проверяет условие.
Поменяем местами If и ElseIf из последнего примера. Теперь код выглядит так
Sub IspElseIfNeverno() ' Этот код недействителен, потому что ElseIf никогда не будет истинным If Marks >= 75 Then Debug.Print "Отлично" ElseIf Marks >= 85 Then ' код никогда не достигнет этого места Debug.Print "High score" End If End Sub
В этом случае мы сначала проверяем значение больше 75. Мы никогда не будем печатать «Самый высокий балл», потому что, если значение больше 85, будет вызван первый оператор if.
Чтобы избежать таких проблем, мы должны использовать два условия. Они помогут вам точно указать, что вы ищете, чтобы избежать путаницы. Пример ниже показывает, как их использовать. Мы рассмотрим несколько условий в разделе ниже.
Если оценки >= 75 и оценки = 85 и оценки Давайте расширим исходный код. Вы можете использовать любое количество операторов ElseIf. Мы добавляем еще несколько, чтобы учесть все наши классификации очков.
Использование If Else
Оператор else используется как ловушка для всех. В основном это означает «если бы не было условий» или «все остальное». В предыдущем примере кода мы не включили оператор печати для метки ошибки. Мы можем добавить это с помощью Else.
Sub IspElse() Если метки >= 85, то Debug.Print "Наивысший" ElseIf метки >= 75, то Debug.Print "отлично" ElseIf метки >= 55, то Debug.Print "хорошо" ElseIf метки >= 40, то Debug.Print " Пройдено" Else ' Для всех остальных оценок Debug.Print "Failed" 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 = "Highest Score" ElseIf Marks >= 75 Then sClass = "Отлично" ElseIf Оценки >= 55 Then sClass = "Хорошо" ElseIf Оценки >= 40 Then sClass = "Удовлетворительно" Else ' Для всех остальных оценок sClass = "Неудовлетворительно" End If ' Записать класс в столбец E Sheet1 .Area («Е» и я). Значение = sClass Next End Sub
Результаты выглядят так: в столбце Е - классификация баллов
Используя If And/If Or
Выражение If может иметь несколько условий. Ключевые слова VBA And и Or позволяют применять несколько условий.
Эти слова работают так же, как вы используете их в английском языке.
Давайте еще раз посмотрим на данные нашего примера. Теперь мы хотим вывести всех студентов, набравших от 50 до 80 баллов.
Мы используем И, чтобы добавить дополнительное условие. Код говорит, что если оценка больше или равна 50 и меньше 75, выведите имя учащегося.
Sub ProverkaStrokiOcenok() Dim i As Long, Оценки As Long For i = 2 To 11 ' Сохранение оценок для текущих оценок учащихся = Sheet1.Range("C" & i). Значение 'Проверить, если оценки больше 50 и меньше 75 Если оценки >= 50 и оценки Показать имя и фамилию в результатах:
- Дмитрий Маренин
- Олеся Клюева
- Евгений Яшин
В нашем следующем примере мы хотим узнать, кто из студентов изучал историю или геометрию. Так что в этом случае мы говорим, изучал ли студент «Историю» ИЛИ изучал ли он «Геометрию» (Ctrl+G).
Sub ЧитатОбъектОценки() Dim i As Long, отметки As Long ' Перебрать столбцы оценок For i = от 2 до 11 отметок = Sheet1.Range("D" & i). Значение ' Проверяем, больше ли меток 50 и меньше 80 Если метки = "История" Или метки = "Геометрия" Тогда ' Напечатать имя и фамилию в непосредственном окне (Ctrl+G) Debug.Print Sheet1.Range("A " & i).Value & " " & Sheet1.Range("B" & i). Значение End If Next End Sub
Полученные результаты:
- Василий Кочин
- Александр Грохотов
- Дмитрий Маренин
- Николай Куликов
- Олеся Клюева
- Наталья Теплых
- Дмитрий Андреев
Использование нескольких таких условий часто является источником ошибки. Главное правило, которое следует запомнить, — быть максимально простым.
Используйте ЕСЛИ И
И работает так:
Условие 1 | Условие 2 | Результат |
ПОДЛИННЫЙ | ПОДЛИННЫЙ | ПОДЛИННЫЙ |
ПОДЛИННЫЙ | ЛОЖЬ | ЛОЖЬ |
ЛОЖЬ | ПОДЛИННЫЙ | ЛОЖЬ |
ЛОЖЬ | ЛОЖЬ | ЛОЖЬ |
Вы заметите, что И верно только при соблюдении всех условий.
Используйте ЕСЛИ ИЛИ
Ключевое слово OR работает следующим образом
Условие 1 | Условие 2 | Результат |
ПОДЛИННЫЙ | ПОДЛИННЫЙ | ПОДЛИННЫЙ |
ПОДЛИННЫЙ | ЛОЖЬ | ПОДЛИННЫЙ |
ЛОЖЬ | ПОДЛИННЫЙ | ПОДЛИННЫЙ |
ЛОЖЬ | ЛОЖЬ | ЛОЖЬ |
Вы заметите, что ИЛИ ложно только тогда, когда ложны все условия.
смешивание И и ИЛИ может затруднить чтение кода и привести к ошибкам. Использование скобок может сделать условия более понятными.
Sub OrSAnd() Dim subject As String Marks As Long subject = "History" метки = 5 If (subject = "Geometry" Or subject = "History") И метки >= 6 Then Debug.Print "TRUE" Else Debug.Print " FALSE" End If End Sub
Пользователь, ЕСЛИ НЕ
Это также оператор НЕ. Он возвращает результат, противоположный условию.
Состояние | Результат |
ПОДЛИННЫЙ | ЛОЖЬ |
ЛОЖЬ | ПОДЛИННЫЙ |
Следующие две строки кода эквивалентны.
Если оценки = 40, то
в дополнение к
Если правда то если не ложь то
и
Если неверно, то если не верно, то
заключение условия в круглые скобки облегчает чтение кода
Если нет (отметки >= 40) Тогда
Обычно Not используется при проверке того, установлен ли объект. Возьмем, к примеру, рабочий лист. Здесь мы объявляем рабочий лист.
Dim mySheet As Worksheet 'Некоторый код здесь
Мы хотим проверить mySheet перед его использованием. Можем проверить, нет ли чего.
Если мой лист ничего тогда
Невозможно проверить, есть ли что-то, поскольку есть много разных способов, которыми это может быть что-то. Поэтому мы НЕ используем ни с чем.
Если нет, mySheet ничто
Если вы находите это немного запутанным, вы можете использовать круглые скобки, как здесь
Если нет (mySheet ничего не значит), то
Функция IIF
VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто используете функцию If следующим образом:
=ЕСЛИ(F2="","", F1/F2)
Формат
= Если(условие, действие, если ИСТИНА, действие, если ЛОЖЬ).
VBA имеет функцию IIf, которая работает аналогично. Давайте посмотрим на пример. В следующем коде мы используем IIf для проверки значения val. Если значение больше 10, мы пишем ИСТИНА, иначе мы пишем ЛОЖЬ.
Sub ProveritVal() Dim result As Boolean Dim val As Long ' Выводит TRUE val = 11 result = IIf(val > 10, TRUE, FALSE) Debug.Print result ' выводит FALSE val = 5 result = IIf(val > 10, TRUE, FALSE) Результат Debug.Print End Sub
В нашем следующем примере мы хотим напечатать «сдал» или «не сдал» рядом с каждым учащимся в зависимости от его оценки. В первом фрагменте кода мы будем использовать для этого обычный оператор VBA If.
Sub ProveritDiapazonOcenok() Dim i As Long, Grades As Long For i = 2 To 11 ' Сохраняет оценки для текущих оценок учащихся = Sheet1.Range("C" & i). Значение ' Проверить, сдал ли учащийся или нет Если оценки >= 40 Затем запишите имена для столбца F Sheet1.Range("E" & i) = "Fair" Else Sheet1.Range("E" & i) = " Fail" End If Next End Sub
В следующем фрагменте кода мы будем использовать функцию IIf. Код здесь намного аккуратнее.
Sub ProveritDiapazonOcenok () Dim i As Long, Grades As Long For i = 2 To 11 ' Сохранение оценок для текущих оценок учащегося = Sheet1.Range("C" & i) ' Проверяем, сдал ли учащийся Sheet1.Range(" Е" и я). Значение = IIf(отметки >= 40,"Пройдено","Не") Next End Sub
Функция IIf очень полезна для простых случаев, когда вы имеете дело с двумя возможностями.
Использование вложенного IIf
Вы также можете использовать следующие операторы IIf, как в Excel. Это означает использование результата одного IIf с другим. Давайте добавим еще один тип результата к нашим предыдущим примерам. Теперь мы хотим напечатать «Отлично», «Удовлетворительно» или «Неудовлетворительно» для каждого ученика.
Используя простой VBA, мы бы сделали это так
Sub ProveritResultatiTip2() Dim i As Long, Labels As Long For i = 2 To 11 ' Сохранение оценок для текущих оценок учащихся = Sheet1.Range("C" & i).Value Если оценки >= 75 Then Sheet1.Range(" E "и я). Value = "Отлично" ElseIf Marks >= 40 Then ' Запишите имена для столбца F Sheet1.Range("E" & i).Value = "Fair" Else Sheet1.Range("E" & i) Value = "Failed " Конец, если следующий End Sub
Используя вложенные IIfs, мы могли бы сделать это так
Sub IspNestedIIF() Dim i As Long, отметки As Long, результат As String For i = 2 To 11 отметок = Sheet1.Range("C" & i).Value result = IIf(marks >= 55,"OK",IIf (отметки >= 40, "Fair", "Fail")) Sheet1.Range("E" & i).Value = result Next End Sub
использование вложенного IIf прекрасно подходит для таких простых случаев, как этот. Код легко читается и поэтому вряд ли вызовет ошибки.
На что обратить внимание
Важно понимать, что функция IIf всегда оценивает как истинную, так и ложную части выражения, независимо от условия.
В следующем примере мы хотим разделить на счет, если он не равен нулю. Если это значение null, мы хотим вернуть значение null.
оценки = 0, всего = IIf (оценки = 0, 0, 60 / оценки)
Но когда отметки равны нулю, код выдаст ошибку «Делить на ноль». Это потому, что он оценивает как истинные, так и ложные утверждения. Здесь ложное утверждение, т.е. (60 / Баллы) считается ошибкой, потому что оценки равны нулю.
Если мы используем обычный оператор IF, он выполнит только соответствующую строку.
метки = 0 Если метки = 0 Then 'Выполнять эту строку, только когда метки равны нулю total = 0 Else 'Выполнять эту строку, только когда метки не равны нулю total = 60 / метки End If
Это также означает, что если у вас есть функции для TRUE и FALSE, будут выполнены обе. Таким образом, IIF будет запускать обе функции, хотя и использует только одно возвращаемое значение. Например:
' Обе функции будут выполняться каждый раз, когда total = IIf(marks = 0, Func1, Func2)
IF против IF
Так какой из них лучше?
В этом случае вы можете видеть, что IIf короче и аккуратнее. Однако, если условия усложняются, лучше использовать обычный оператор If. Недостатком IIf является то, что он малоизвестен, поэтому другие пользователи могут не понять его так же, как код, написанный с помощью обычного оператора if.
Кроме того, как мы обсуждали в предыдущем разделе, IIF всегда оценивает части TRUE и FALSE, поэтому, если вы имеете дело с большим количеством данных, оператор 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 = "Highest Score" ElseIf Marks >= 75 Then sClass = "Отлично" ElseIf Оценки >= 55 Then sClass = "Хорошо" ElseIf Оценки >= 40 Then sClass = "Удовлетворительно" Else ' Для всех остальных оценок sClass = "Неудовлетворительно" End If ' Записать класс в столбец E Sheet1 .Area («Е» и я). Значение = sClass Next End Sub
Ниже приведен тот же код, использующий оператор Select Case. Самое важное, что вы заметите, это то, что мы используем «Case 85 to 100» вместо «метки >=85 и отметки =85 и отметки Sub DobavitClassSSelect() ' получить первую и последнюю строку Dim firstRow As Long, lastRow As Long firstRow = 2 lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row Dim i As Long, отметки As Long Dim sClass As String ' Цикл по столбцам отметок For i = от первой строки до последней строки отметок = Sheet1.Range("C" & i). Значение ' Проверить, затем классифицировать Выбрать метки случая Вариант от 85 до 100 sClass = "Наивысший балл" Вариант от 75 до 84 sClass = "Отлично" Вариант от 55 до 74 sClass = "Хорошо" Вариант от 40 до 54 sClass = "Удовлетворительно" Вариант Остальное ' Для всех другие оценки sClass = "Not" End Select ' Записать класс в столбец E Sheet1.Range("E" & i). Значение = sClass Next End Sub
Вариант использования
Вы можете переписать оператор select в том же формате, что и исходный ElseIf. Вы можете использовать Is с случаем.
Выберите метки случая Case Is >= 85 sClass = "Отлично" Case Is >= 75 sClass = "Excellent" Case Is >= 55 sClass = "Хорошо" Case Is >= 40 sClass = "Fair" Case Else ' Для всех остальных оценок sClass = "Fail" Конец выбора
Вы можете использовать Is для проверки нескольких значений. В следующем коде мы проверяем, равен ли счет 5, 7 или 9.
Sub TestNeskZnach() Dim Marks As Long Marks = 7 Select Cases Marks Cases Are = 5, 7, 9 Debug.Print True Case Else Debug.Print False End Select End Sub
Попробуйте это упражнение
В этой статье много говорилось об операторе If. Хороший способ помочь вам понять — попробовать программировать, используя темы, которые мы рассмотрели. В следующем упражнении используются тестовые данные из этой статьи. Ответ на упражнение ниже.
Мы будем использовать ячейку G1, чтобы написать название темы.
В столбцах с H по L запишите всех учащихся, имеющих оценки по этому предмету. Мы хотим классифицировать их результат как успех или неудачу. Оценка ниже 40 — провал, оценка 40 и более — проход.
Столбец Н: Имя
Столбец I: Фамилия
Столбец J: Очки
Столбец H: Тема
Столбец I: Тип результата — Пройдено или Не пройдено
Если ячейка G1 содержит «Геометрию», результат должен выглядеть следующим образом:
Ответьте на упражнение
В следующем коде показано, как выполнить вышеуказанное упражнение.
Примечание. Есть много способов выполнить задачу, поэтому не расстраивайтесь, если ваш код отличается.
