Краткое руководство по VBA If Statement
Описание | Формат | Пример |
Если тогда | Если [условие верно] Итак [действие] Это закончится, если |
Если оценка = 100 Затем Отладка. Печать «Штраф» Это закончится, если |
Если больше | Если [условие верно] Итак [действие] Больше [действий] Это закончится, если |
Если оценка = 100 Затем Отладка. Печать «Штраф» В противном случае Debug.Print «Попробуйте снова» Это закончится, если |
Если еще если | Если [1 условие верно] Итак [действие] ИначеЕсли [2 условия верно] Итак [действие] Это закончится, если |
Если оценка = 100 Затем Отладка. Печать «Штраф» ИначеЕсли оценка > 50 Затем Отладка. Печать «Прошедший» В противном случае оценка Затем Отладка. Печать «Попробуйте снова» Это закончится, если |
Еще и еще если (В противном случае вы должны идти после ElseIf) |
Если [1 условие верно] Итак [действие] ИначеЕсли [2 условия верно] Итак [действие] Больше[ действий] Это закончится, если |
Если оценка = 100 Затем Отладка. Печать «Штраф» ИначеЕсли оценка > 50 Затем Отладка. Печать «Прошедший» ИначеЕсли оценка > 30 Затем Отладка. Печать «Попробуйте снова» В противном случае Debug.Print «Ой» Это закончится, если |
Да без конца (Единственный линия) |
Если [условие верно] Итак [действие] |
Если значение Итак, значение = 0 |
В следующем коде показан простой пример использования оператора VBA If
Если Sheet1.Range(«A1»).Value > 5, то 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
Отступ просто означает перемещение строки кода на одну вкладку вправо. Общее правило состоит в том, чтобы делать отступ между начальными и конечными операторами, например:
Под… Конец Под
Да Тогда… Конец Да
Если Тогда… Иначе… Иначе… 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 называется условием. Условие — это утверждение, которое оценивается как истинное или ложное. В основном они используются с циклами и операторами If. При создании условия используйте такие символы, как «>, ,> =,
Ниже приведены примеры условий:
Условие | Это правда, когда |
х | х меньше 5 |
х | х меньше или равно 5 |
х > 5 | х больше 5 |
х >= 5 | х больше или равно 5 |
х=5 | х равно 5 |
х 5 | х не равно 5 |
х > 5 и х | х больше 5 И х меньше 10 |
х = 2 или х > 10 | x равно 2 ИЛИ x больше 10 |
Range(«A1») = «Джон» | Ячейка A1 содержит текст «Джон» |
Range(«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.
Если оно истинно, печатается «High Score» и оператор 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. Мы никогда не будем печатать «High Score», потому что, если значение больше 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 » Pass» Else ‘ Для всех остальных степеней Debug.Print «Fail» 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 Оценки >= 55 Then sClass = «Хорошо» ElseIf Оценки >= 40 Then sClass = «Fair» Else ‘ Для всех остальных оценок sClass = «Fail» End If ‘ Записать класс в столбец E Sheet1.Range («E» & i).Value = sClass Next End Sub
Результаты выглядят так: в колонке E — ранжирование по очкам
Используя If And/If Or
Выражение If может иметь несколько условий. Ключевые слова VBA And и Or позволяют использовать несколько условий.
Эти слова работают точно так же, как вы используете их в английском языке.
Давайте еще раз посмотрим на данные нашего примера. Теперь мы хотим вывести всех студентов, набравших от 50 до 80 баллов.
Мы используем И, чтобы добавить дополнительное условие. В коде сказано, что если оценка больше или равна 50 и меньше 75, пишется имя ученика.
Sub ProverkaStrokiOcenok() Dim i As Long,marks As Long For i = 2 To 11 ‘ Сохраняет оценки текущего учащегося = Sheet1.Range(«C» & i).Value ‘ Проверяет, выше ли оценки 50 и меньше 75 Если вы отметите >= 50 И отметите Показывать имя и фамилию в результатах:
- Дмитрий Маренин
- Олеся Клюева
- Евгений Яшин
В нашем следующем примере мы хотим узнать, кто из студентов изучал историю или геометрию. Итак, в этом случае мы говорим, изучал ли студент «Историю» ИЛИ изучал ли он «Геометрию» (Ctrl+G).
Sub ЧитатОбъектОценки() Размер i As Long, отметки As Long ‘ Проходим по столбцам оценок For i = 2 To 11 отметок = Sheet1.Range(«D» & i).Value ‘ Проверяем, больше ли оценок 50 и меньше 80 Если flags = «History» ИЛИ flags = «Geometry» Then ‘ Напечатать имя и фамилию в окне немедленного просмотра (Ctrl+G) Debug.Print Sheet1.Range(«A» & i).Value & » » & Sheet1.Range(«B» & i).Value End If Next End Sub
Результаты:
- Василий Кочин
- Александр Грохотов
- Дмитрий Маренин
- Николай Куликов
- Олеся Клюева
- Наталья теплых
- Дмитрий Андреев
Использование нескольких из этих условий часто является источником ошибок. Общее правило, которое следует помнить, — быть как можно более простым.
Использование ЕСЛИ И
И это работает так:
Условие 1 | Условие 2 | Результат |
ОПРЕДЕЛЕННЫЙ | ОПРЕДЕЛЕННЫЙ | ОПРЕДЕЛЕННЫЙ |
ОПРЕДЕЛЕННЫЙ | ПОДДЕЛКА | ПОДДЕЛКА |
ПОДДЕЛКА | ОПРЕДЕЛЕННЫЙ | ПОДДЕЛКА |
ПОДДЕЛКА | ПОДДЕЛКА | ПОДДЕЛКА |
Вы заметите, что И верно только при соблюдении всех условий.
Использование ЕСЛИ ИЛИ
Ключевое слово OR работает следующим образом
Условие 1 | Условие 2 | Результат |
ОПРЕДЕЛЕННЫЙ | ОПРЕДЕЛЕННЫЙ | ОПРЕДЕЛЕННЫЙ |
ОПРЕДЕЛЕННЫЙ | ПОДДЕЛКА | ОПРЕДЕЛЕННЫЙ |
ПОДДЕЛКА | ОПРЕДЕЛЕННЫЙ | ОПРЕДЕЛЕННЫЙ |
ПОДДЕЛКА | ПОДДЕЛКА | ПОДДЕЛКА |
Вы заметите, что ИЛИ ложно только тогда, когда ложны все условия.
Смешивание И и ИЛИ может затруднить чтение кода и привести к ошибкам. Использование круглых скобок может пояснить условия.
Sub OrSAnd() Затемнить тему как строку, пометки как длинную тему = «История» отметки = 5 Если (тема = «Геометрия» ИЛИ тема = «История») И отметки >= 6 Тогда Debug.Print «TRUE» Else Debug.Print «FALSE» End If End Sub
Использование ДА НЕТ
Также есть оператор НЕ. Возвращает противоположный результат условия.
Условие | Результат |
ОПРЕДЕЛЕННЫЙ | ПОДДЕЛКА |
ПОДДЕЛКА | ОПРЕДЕЛЕННЫЙ |
Следующие две строки кода эквивалентны.
Если он отмечает = 40 Тогда
подобно
Если правда то если не ложь то
а также
Если это ложь, то если это неправда, то
Помещение условия в круглые скобки облегчает чтение кода
Если нет (отметки >= 40) Тогда
Обычно Not используется при проверке того, установлен ли объект. Возьмем, к примеру, рабочий лист. Здесь мы объявляем рабочий лист.
Dim mySheet как рабочий лист ‘Некоторый код здесь
Мы хотим проверить mySheet перед его использованием. Мы можем проверить, если это Nothing.
Если мой клинок ничто, то
Невозможно проверить, является ли это чем-то, поскольку существует много разных способов, которыми это может быть что-то. Таким образом, мы используем НЕ с ничем.
Если не mySheet ничего, то
Если вы находите это немного запутанным, вы можете использовать круглые скобки, как здесь
Если нет (mySheet ничего), то
Функция IIF
VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто используете функцию If следующим образом:
=ЕСЛИ(F2=»»,»», F1/F2)
Формат
=Если(условие, действие, если ИСТИНА, действие, если ЛОЖЬ).
В VBA есть функция IIf, которая работает точно так же. Давайте посмотрим пример. В приведенном ниже коде мы используем IIf для проверки значения val. Если значение больше 10, мы печатаем TRUE, иначе мы печатаем FALSE.
Sub ProveritVal() Затемнение результата As Boolean Dim val As Long ‘ Печать TRUE val = 11 result = IIf(val > 10, TRUE, FALSE) Debug.Print result ‘ print FALSE val = 5 result = IIf(val > 10, TRUE, FALSE) Debug.Print Result End Sub
В нашем следующем примере мы хотим напечатать «сдал» или «не сдал» рядом с каждым учащимся в зависимости от его оценок. В первом фрагменте кода мы будем использовать для этого обычный оператор VBA If.
Sub ProveritDiapazonOcenok() Dim i As Long, отметки As Long For i = 2 To 11 ‘ Сохраняет оценки для текущих оценок учащегося = Sheet1.Range(«C» & i).Value ‘ Проверяет, сдал или не сдал учащийся Если оценки are >= 40 Then ‘ Запишите имена для столбца F Sheet1.Rank(«E» & i) = «Fair» Else Sheet1.Rank(«E» & i) = «Fail» End If Next End Sub
В следующем фрагменте кода мы будем использовать функцию IIf. Код здесь намного аккуратнее.
Sub ProveritDiapazonOcenok () Dim i As Long, отметки As Long For i = 2 To 11 ‘ Сохранение оценок для текущих оценок учащегося = Sheet1.Range(«C» & i) ‘ Проверяем, сдал ли учащийся Sheet1. Range(«E » & i).Value = IIf(marks >= 40,»Pass»,»Fail») Next End Sub
Функция IIf очень полезна для простых случаев, когда вы имеете дело с двумя возможностями.
Использование вложенного IIf
Вы также можете вкладывать операторы IIf, как в Excel. Это означает использование результата одного IIf с другим. Давайте добавим еще один тип результата к нашим предыдущим примерам. Теперь мы хотим вывести «Отлично», «Пассивно» или «Неудовлетворительно» для каждого ученика.
Используя обычный VBA, мы бы сделали это так
Sub ProveritRezultatiTip2() Dim i As Long, отметки As Long For i = от 2 до 11 ‘ Сохранение оценок для текущих оценок учащегося = Sheet1.Range(«C» & i).Value Если отметки >= 75, то Sheet1.Range(» E » & i).Value = «Отлично» ElseIf flags >= 40 Then ‘ Введите имена для столбца F Sheet1.Range(«E» & i).Value = «Fair» Else Sheet1.Range(«E» & i) Value = «Ошибка» End If Next End Sub
Используя вложенные IIfs, мы могли бы сделать это так
Sub IspNestedIIF() Dim i As Long, отметки As Long, результат As String For i = от 2 до 11 отметок = Sheet1.Range(«C» & i).Value result = IIf(marks >= 55,»OK»,IIf (флаги >= 40, «Пройдено», «Не пройдено»)) Sheet1.Range(«E» & i).Value = result Next End Sub
Использование вложенного IIf прекрасно подходит для таких простых случаев, как этот. Код легко читается и поэтому вряд ли вызовет ошибки.
Что учитывать
Важно понимать, что функция IIf всегда оценивает истинную и ложную части выражения, независимо от условия.
В приведенном ниже примере мы хотим разделить на счет, если он не равен нулю. Если это ноль, мы хотим вернуть ноль.
баллы = 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)
ДА против ДА
Так какой из них лучше?
В этом случае вы можете видеть, что IIf короче и аккуратнее. Однако, если условия становятся более сложными, вам может быть лучше использовать обычный оператор If. Недостатком IIf является то, что он не очень хорошо известен, поэтому другие пользователи могут не понять его так же, как код, написанный с помощью обычного оператора if.
Кроме того, как мы обсуждали в предыдущем разделе, IIF всегда оценивает части TRUE и FALSE, поэтому, если вы имеете дело с большим объемом данных, оператор IF будет быстрее.
Мое эмпирическое правило состоит в том, чтобы использовать IIf, когда он легко читается и не требует вызовов функций. Для более сложных случаев используйте обычный оператор If.
Использование Select Case
Оператор Select Case — это альтернативный способ записи статистики If с большим количеством ElseIf. Вы найдете этот тип инструкции в большинстве популярных языков программирования, где он называется командой переключения. Например, в 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 Оценки >= 55 Then sClass = «Хорошо» ElseIf Оценки >= 40 Then sClass = «Fair» Else ‘ Для всех остальных оценок sClass = «Fail» End If ‘ Записать класс в столбец E Sheet1.Range («E» & i).Value = 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, flags As Long Dim sClass As String ‘ Пройтись по столбцам оценок For i = firstRow To lastRowmarks = Sheet1.Range(«C» & i).Value ‘ Просмотреть оценки и ранжировать соответственно Выбрать отметки case 85–100 sClass = «High Score» Case 75–84 sClass = «Отлично» Вариант от 55 до 74 sClass = «Хорошо» Вариант от 40 до 54 sClass = «Удовлетворительно» Вариант Else ‘ Для всех остальных оценок sClass = «Неудовлетворительно» End Select ‘ Записать класс в столбец E Sheet1.Range(«E» & i).Value = sClass Next End Sub
Использование чехла
Вы можете переписать оператор select в том же формате, что и исходный ElseIf. Вы можете использовать Is с случаем.
Выбранные флаги случая Дело >= 85 sClass = «Отлично» Дело >= 75 sClass = «Отлично» Дело >= 55 sClass = «Хорошо» Дело >= 40 sClass = «Удовлетворительно» Случай Else ‘ Для всех остальных степеней sClass = «Failure» Конец выбора
Вы можете использовать Is для проверки нескольких значений. В приведенном ниже коде мы проверяем, равны ли оценки 5, 7 или 9.
Sub TestNeskZnach() Dim флаги как Long flags = 7 Выбраны флаги Case Case = 5, 7, 9 Debug.Print true Case Else Debug.Print false Finish Select Finish sub
Попробуйте это упражнение
В этой статье много говорилось о выражении If. Хороший способ помочь вам понять — попытаться написать код, используя темы, которые мы рассмотрели. В следующем упражнении используются тестовые данные из этой статьи. Ответ на упражнение ниже.
Мы будем использовать ячейку G1, чтобы написать название предмета.
В столбцах с H по L перечислите всех учащихся, имеющих оценки по этому предмету. Мы хотим классифицировать ваш результат как успех или неудачу. Оценка ниже 40 — это провал, оценка 40 и более — «пройдено.
Столбец Н: Имя
Столбец I: Фамилия
Столбец J: Очки
Столбец H: Тема
Столбец I: Тип результата: успешно или неуспешно
Если ячейка G1 содержит «Геометрию», ваш результат должен выглядеть так:
Ответ на упражнение
В следующем коде показано, как выполнить вышеуказанное упражнение.
Примечание. Есть много способов выполнить задачу, поэтому не расстраивайтесь, если ваш код отличается.