Использование условного оператора неотъемлемая часть практически любого языка программирования. И фактически, все исходит от математики, так как изначально, языки программирования формировались как средства для решения различных задач. Скажу сразу, статья скучная и неинтересная Так как выжать что новое из программирования, в частности из описания операторов просто физически невозможно, но я что-то да придумаю. И так, в языке VBA для проверки условий используется оператор if, который может существовать в нескольких вариациях. Но сперва, немного юмора….
Бежит заяц по лесу и видим медведя, читающего книгу. Заяц спрашивает: “Косолапый, ты что читаешь?” Тот с умным видом отвечает: “Логику”. Косой с удивленным видом спрашивает “А что такое логика?” “Ну смотри” – говорит медведь:
- М: У тебя спички есть?
- З: Нет
- М: Значит, ты не куришь
- З: Да!
- М: Если ты не куришь, значит, нет лишних трат денег
- З: Верно!
- М: Значит, ты ходишь по девкам?
- З: Конечно!
- М: А раз ты ходишь по девкам, значит, ты не импотент!
- З: Снова верно!
Заяц обрадовался столь умной книге и попросил почитать ее у косолапого. Идет по лесу довольный и радуется, тут ему навстречу волк идет. Заяц решил испробовать логику на сером и спрашивает его:
- З: У тебя спички есть?
- В: Да
- З: Значит ты импотент!
Ну да, пересказал анекдот как помнил
Хорошо, теперь давайте приступим к теории…
Вариант 1 . Самый простой вариант использования условного оператора VBA if, это когда идет проверка условия, и если оно выполняется, то идет выполнение одного выражения:
If условие then выражение
Вариант 2 . Может возникнуть ситуация, когда после проверки условия надо выполнить несколько выражений, в таком случае оператор if принимает вид:
If условие then
Выражение 1
Выражение 2
Выражение N
Как видим, в данном случае используется закрывающий блок if … end if, он актуален и в том случае, когда операторы вложены.
Вариант 3 : Чтобы не создавать вложенных условных операторов, используется следующая конструкция:
If условие then
Выражение 1
Выражение 2
Тут все предельно просто, если условие истинно, выполняется первое выражение, если нет – второй. Стоит помнить, что после проверки условия могут следовать несколько операторов, как в варианте выше.
Вариант 4 : Проверка нескольких условий:
If условие 1 then
Выражения 1
ElseIf условие 2 then
Выражения 2
ElseIf условие 3 then
Выражения 3
Логика работы такова: сначала идет проверка первого условия, если оно истинно, то выполняются первые выражения и после происходит переход к оператору, что следует за End If. Если же первое условие не выполняется, происходит проверка второго и так далее, использование выражения Else в конце не является обязательным, за ним может следовать оператор, который должен выполниться, если ни одно из предыдущих условий не выполнилось.
Хорошо, теперь напишем простой пример использования конструкции VBA if then. Создайте форму в редакторе Visual Basic for Applications и добавьте на ее поверхность три текстовые метки () и одну кнопку (). В редакторе кодапропишем:
Private Sub GetSub() Dim MySumm As Integer Dim MyVar As Byte MyVar = 0 Do While MySumm <= 10000 MySumm = MySumm + 1 If MySumm = 10 Then Label1.Caption = "Сумма достигла значения 10" ElseIf MySumm = 100 Then Label2.Caption = "Сумма достигла значения 100" ElseIf MySumm = 1000 Then Label3.Caption = "Сумма достигла значения 1000" Else Label4.Caption = "Достигнуто значение " & MySumm End If Loop End Sub Private Sub CommandButton1_Click() Call GetSub End Sub Private Sub UserForm_Initialize() Label1.Caption = "" Label1.FontSize = 13 Label1.ForeColor = vbRed Label2.Caption = "" Label2.FontSize = 13 Label2.ForeColor = vbGreen Label3.Caption = "" Label3.FontSize = 13 Label3.ForeColor = vbBlue Label4.Caption = "" Label4.FontSize = 13 CommandButton1.Caption = "Выполнить" End Sub |
В процедуре GetSub происходит использование цикла , условие выполнение цикла – значение переменной MySumm должно быть меньше или ровно 10000. В теле самого цикла используются операторы VBA if then с несколькими вариантами. Происходит проверка условий: если сумма достигла значения 10, то записать в первое текстовое поле одну информацию, если 100 – другую информацию, если 1000 – третью информацию, в противном случае – записать данные в свойство Caption четвертого текстового поля.
Однострочная и многострочная конструкции оператора If...Then...Else и функция IIf, используемые в коде VBA Excel - синтаксис, компоненты, примеры.
Оператор If...Then...Else
Оператор If...Then...Else предназначен для передачи управления одному из блоков операторов в зависимости от результатов проверяемых условий.
Однострочная конструкция
Оператор If...Then...Else может использоваться в однострочной конструкции без ключевых слов Else , End If .
Синтаксис однострочной конструкции If...Then...
If [условие] Then [операторы]Компоненты однострочной конструкции If...Then...
- условие True или False ;
- операторы условие возвращает значение True ;
Если компонент условие возвращает значение False , блок операторов конструкции If...Then...
Пример 1
Sub primer1() Dim d As Integer, a As String d = InputBox("Введите число от 1 до 20", "Пример 1", 1) If d > 10 Then a = "Число " & d & " больше 10" MsgBox a End SubМногострочная конструкция
Синтаксис многострочной конструкции If...Then...Else
If [условие] Then [операторы] ElseIf [условие] Then [операторы] ---------------- Else [операторы] End IfКомпоненты многострочной конструкции If...Then...Else :
- условие - числовое или строковое выражение, следующее за ключевым словом If или ElseIf и возвращающее логическое значение True или False ;
- операторы - блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True .
- пунктирная линия обозначает дополнительные структурные блоки из строки ElseIf [условие] Then и строки [операторы] ;
- блок операторов после ключевого слова Else выполняется в любом случае, но структурный блок кода из строки Else и строки [операторы] не является обязательным и может быть пропущен.
Если компонент условие возвращает значение False , следующий за ним блок операторов конструкции If...Then...Else пропускается и управление программой передается следующей строке кода.
Самый простой вариант многострочной конструкции If...Then...Else :
If [условие] Then [операторы] Else [операторы] End IfПример 2
Sub primer2() Dim d As Integer, a As String d = InputBox("Введите число от 1 до 40", "Пример 2", 1) If d < 11 Then a = "Число " & d & " входит в первую десятку" ElseIf d > 10 And d < 21 Then a = "Число " & d & " входит во вторую десятку" ElseIf d > 20 And d < 31 Then a = "Число " & d & " входит в третью десятку" Else a = "Число " & d & " входит в четвертую десятку" End If MsgBox a End Sub
Функция IIf
Функция IIf проверяет заданное условие и возвращает значение в зависимости от результата проверки.
Синтаксис функции
IIf ([условие], [если True], [если False])Компоненты функции IIf
- условие - числовое или строковое выражение, возвращающее логическое значение True или False ;
- если True IIf , если условие возвратило значение True ;
- если False - значение, которое возвращает функция IIf , если условие возвратило значение False .
Пример 3
Sub primer3() Dim d As Integer, a As String d = InputBox("Введите число от 1 до 20", "Пример 3", 1) a = IIf(d < 10, d & " - число однозначное", _ d & " - число двузначное") MsgBox a End SubПри нажатии кнопки «Cancel» или закрытии крестиком диалогового окна InputBox из примеров, генерируется ошибка, так как в этих случаях возвращает пустую строку. Присвоение пустой строки переменной d типа Integer вызывает ошибку. При нажатии кнопки «OK» диалогового окна, числа, вписанные в поле ввода в текстовом формате, VBA Excel автоматически преобразует в числовой формат переменной d.
Условный оператор VBA позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор это средство ветвления вычислительного процесса.
В VBA существует 2 типа условного оператора: линейный и блочный.
1. Линейный условный оператор используется для того, чтобы выполнить какой-либо один оператор, если некоторое условие будет истинным.
Синтаксическая конструкция линейного оператора имеет две формы: безальтернативную, альтернативную.
Структура безальтернативного условного оператора (сокращенный вариант):
If <условие> Then <оператор 1>
Структура альтернативного условного оператора (полный вариант):
If <условие> Then <оператор 1> Else <оператор 2>
где
If , Then , Else - зарезервированные слова (если, то, иначе);
<условие> - произвольное выражение логического типа;
<оператор 1>, <оператор 2> - любые операторы языка VBA .
Работа. Вначале вычисляется условное выражение <условие>. Если результат есть True (истина), то выполняется <оператор 1>, а <оператор 2> пропускается. Если результат есть False (ложь), наоборот, <оператор 1> пропускается, а выполняется <оператор 2>.
2. Блочный условный оператор используется в случае истинности условия необходимо выполнить несколько программных операторов (блок операторов). Блочный оператор имеет две формы: безальтернативный, альтернативный.
Структура безальтернативного блочного оператора (сокращенный вариант )
If <условие> Then
<оператор1>
<оператор2>
…………….
<оператор n >
End If
где
End If - указывает на окончание блока оператора If .
Структура альтернативного блочного оператора:
If <условие> Then
<оператор1>
<оператор2>
…………….
<оператор n >
Else
<оператор1>
<оператор2>
…………….
<оператор n >
End If
Пример 1.
Постановка задачи. Создать в стандартном модуле пользовательскую процедуру вычисления уравнения вида ax 2 + bx + c = 0.
1. Исходные данные:
a , b , c R
Результат: х1, х2 R .
2.Набрать в стандартном модуле проекта следующую пользовательскую процедуру:
Private Sub yravnenie ()
a = InputBox("a=", a)
b = InputBox("b=", b)
c = InputBox("c=", c)
d = b ^ 2 - 4 * a * c
If d >= 0 Then
x1 = (-b + Sqr(d)) / (2 * a)
x2 = (-b - Sqr(d)) / (2 * a)
MsgBox (x1)
MsgBox (x2)
Else
MsgBox (" Решений нет ")
End If
End Sub
Альтернативный блочный оператор If применяется в тех случаях, когда при выполнении условия необходимо осуществить один набор программных операторов, а при невыполнении другой.
Операторы IF могут быть вложенными друг в друга. Такое вложение операторов применяется, если нужно проверить какое-либо условие при другом условии, которое является истинным.
Формат вложенного оператора If :
If <условие1> Then
If <условие2> Then
<оператор1>
<оператор2>
…………….
<оператор n >
Else
<оператор1>
<оператор2>
…………….
< оператор n>
End If
End If
Пример 2.
Постановка задачи. Создать в стандартном модуле пользовательскую функцию нахождения максимального среди трех заданных чисел y 1 = a +2* b ; y 2 = a * b + c ; y 3 = c 2 + 1.
Технология выполнения задания:
1. Исходные данные:
a , b , c R
Результат: Max R.
2.Набрать в стандартном модуле проекта следующую пользовательскую функцию:
Function y (a,b,c)
y1 = a+2*b
y2 = a*b+c
y3 = c^2+1
If y1 > y2 Then
If y1 > y3 Then y = y1 Else y = y3
Else
If y2 > y3 Then y = y2 Else y = y3
End If
End Function
3.Вычислить корни квадратного уравнения при произвольных исходных данных.
При использовании вложенных операторов If важно не перепутать варианты сочетания условий. Нужно помнить правило: альтернатива Else считается принадлежащей ближайшему оператору If , не имеющему ветви Else .
В VBA предусмотрена конструкция для работы с несколькими операторами If . Эти операторы применяются в случаях, когда необходимо рассмотреть еще несколько условий в дополнение к исходному. Для этого служит конструкция: If … Then … ElseIf . В отличие от вложенных операторов конструкция с несколькими операторами If позволяет проверить дополнительное условие, если исходное условие принимает значение False .
Формат записи:
If <условие1> Then
<оператор1>
ElseIf <условие2> Then
<оператор2>
Else
<.оператор3>
EndIf
Пример 3.
Постановка задачи. Менеджеру по продажам необходимо разработать функцию, позволяющую рассчитывать комиссионные. Процент комиссионных зависит от объема проданного товара и начисляется по следующему правилу, представленному в таблице 15.
Правила расчета комиссионных
Объем продаж за неделю, р. |
Комиссионные, % |
От 0 до 9999 |
|
От 10000 до 19999 |
|
От 20000 до 39999 |
|
Более 40000 |
Технология выполнения задания:
1. Исходные данные:
Продажи Z .
Результат: Комиссионные R .
2. Построить для расчета комиссионных в стандартном модуле пользовательскую функцию:
Function Комиссионные (Продажи)
If Продажи <= 9999 Then
Комиссионные = Продажи * 0.08
ElseIf Продажи <= 19999 Then
Комиссионные = Продажи * 0.1
ElseIf Продажи <= 39999 Then
Комиссионные = Продажи * 0.12
Else
Комиссионные = Продажи * 0.14
End If
End Function
3. Вычислить.
До сих пор рассматривались процедуры и функции, которые VBA выполняет в линейном порядке - VBA начинает выполнение кода с первого оператора после строки объявления процедуры (функции) и продолжает выполнять каждый оператор построчно до тех пор, пока не будет достигнут оператор End Sub (End Function). Такой линейный алгоритм можно представить нижеследующей блок-схемой:
Однако довольно часто встречаются ситуации, когда необходимо, чтобы процедуры или функции выполняли различные действия при разных условиях. Такую ситуацию иллюстрируют следующие блок-схемы:
Операторы, выполняющие роль ветвления программы на основании какого-либо условия, называются операторами условного перехода .
Простейшими операторами условного перехода являются операторы If..Then; If..Then..Else . Первый оператор позволяет выбирать единственную ветвь процедуры (левая блок-схема), тогда как второй дает возможность выбирать из двух альтернативных ветвей кода процедуры (правая блок-схема) на основе оценки того, является ли условие равным True или False.
Синтаксис If..Then
Вариант 1:
If Condition
Then Statements
Вариант 2:
If Condition
Then
Statements
End If
Condition - логическое выражение;
Statements
Первый вариант требует написания оператора в одну строку, при этом в секции Statements можно указывать несколько операторов, разделяя их двоеточием.
Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в секции Condition; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements; затем VBA продолжает выполнение кода следующего за строкой If..Then (Вариант 1) или за ключевыми словами End If (Вариант 2). Если же логическое выражение равно False, то операторы секции Statements пропускаются и выполняется код, следующий за этой секцией.
Ниже приведен листинг элементарного использования первого варианта написания If..Then:
А теперь - второй вариант:
Обратите внимание, что операторы секции Statements написаны с использованием отступа (используется табуляция). Это важный момент. Следует сразу приучать себя к подобному оформлению программного кода - это повышает его удобочитаемость и значительно облегчает поиск ошибок.
Синтаксис If..Then..Else
Вариант 1:
If Condition
Then Statements
Else ElseStatements
Вариант 2:
If Condition
Then
Statements
Else
ElseStatements
End If
Condition - логическое выражение;
Statements, ElseStatements - один, несколько или ни одного оператора VBA.
По аналогии с If..Then - первый вариант требует написания оператора в одну строку, при этом в секциях Statements и ElseStatements можно указывать несколько операторов, разделяя их двоеточием.
Второй вариант позволяет указывать несколько операторов в разных строках.
Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в секции Condition; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements; затем VBA продолжает выполнение кода следующего за строкой If..Then (Вариант 1) или за ключевыми словами End If (Вариант 2). Если же логическое выражение равно False, то выполняются операторы секции ElseStatements.
Условия являются очень полезными при программировании, поскольку позволяют нам выполнять действия, в зависимости от установленных критериев (используется такой же принцип как и в IF функции Excel).
Наиболее важной функцией, которая задает условие является IF и сейчас мы посмотрим, как она работает:
If [УСЛОВИЕ ЗДЕСЬ] Then "=> ЕСЛИ условие верно, ТОГДА "Инструкции, если "правда" Else "=> В ПРОТИВНОМ СЛУЧАЕ "Инструкции, если "ложь" End If
Давайте перейдем к практике и вернемся к примеру, который мы использовали в уроке с переменными. Цель этой процедуры была в том, чтобы открыть диалоговое окно, которое бы содержало значение из строки, указанного в ячейке F5 :
Если вы введете букву в ячейку F5 , это повлечет ошибку. Мы хотим предотвратить это.
Sub variables () "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" End Sub
Давайте добавим условие, которое будет проверять - является ли введенное значение в ячейку F5 числом, перед тем, как код будет выполнен.
Мы воспользуемся функцией IsNumeric для проверки условия:
Sub variables () "Если значение в скобках (ячейка F5) является числовым (И ПОЭТОМУ УСЛОВИЕ IF ЕСТЬ ВЕРНЫМ) тогда "выполнить инструкции, которые следуют после THEN If IsNumeric (Range ("F5")) Then "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range ("F5") + 1 last_name = Cells (row_number, 1) first_name = Cells (row_number, 2) age = Cells (row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" End If End Sub
Нам также нужно прописать инструкции, если поставленное нами условие не выполнится:
Sub variables () If IsNumeric (Range ("F5")) Then "Если условие выполняется "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range ("F5") + 1 last_name = Cells (row_number, 1) first_name = Cells (row_number, 2) age = Cells (row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" Else "Если условие не выполняется "Диалоговое окно: предупреждение MsgBox "Введенное значение " & Range ("F5") & " не является верным!" "Удаление содержимого ячейки F5 Range ("F5").ClearContents End If End Sub
Теперь нечисловое значения не повлечет никаких проблем.
Работая с нашим массивом, который содержит 16 строк данных, наш следующий шаг будет в проверке является ли переменная row_number: "больше чем или равно 2" и "меньше чем или равно 17".
Но сначала взглянем на операторы сравнения:
и эти полезные операторы:
Теперь давайте добавим одно из выше указанных условий AND между операторов сравнения:
Sub variables () If IsNumeric (Range ("F5")) Then "Если числовое значение Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range ("F5") + 1 If row_number> = 2 And row_number
Если мы хотим сделать наш макрос более практичным, мы можем заменить 17 на переменную, которая бы содержала количество строк. Это бы позволило нам добавлять и удалять строки из массива без необходимости изменять этот лимит каждый раз.
Для того, чтобы сделать это, мы должны создать переменную nb_rows и добавить эту функцию.
В этом случае, мы используем функцию WorksheetFunction.CountA , которая является аналогом функции COUNTA в самом Excel.
Мы хотим, чтобы эта функция подсчитала количество непустых ячеек в первой колонке по записала полученное значение в переменную nb_rows :
Sub variables () If IsNumeric (Range ("F5")) Then "ЕСЛИ ЧИСЛО Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range ("F5") + 1 nb_rows = WorksheetFunction.CountA (Range ("A:A")) "Функция подсчета количества строк If row_number > = 2 And row_number
ElseIf
ElseIf дает возможность добавлять дополнительные условия после IF команды:
If [УСЛОВИЕ 1] Then "=> ЕСЛИ условие 1 верно, ТОГДА "Инструкции 1 ElseIf [УСЛОВИЕ 2] Then "=> ЕСЛИ условие 1 неверно, но условие 2 верно, ТОГДА "Инструкции 2 Else "=> ИНАЧЕ "Инструкции 3 End If
Если УСЛОВИЕ 1 выполняется, Инструкция 1 будет выполнена и покинет оператор IF (который начинается с IF и заканчивается End If). Если УСЛОВИЕ 2 принимает значение " ложь ", тогда будет выполнена Инструкция 2 , и если она в свою очередь возвращает " ложь ", тогда Инструкция 3 (под Else ) будет выполнена.
Sub scores_comment () "Переменные Dim note As Integer, score_comment As String note = Range ("A1") "Комментарии, основанные на полученной оценке If note = 6 Then score_comment = "Великолепный бал!" ElseIf note = 5 Then score_comment = "Хороший бал" ElseIf note = 4 Then score_comment = "Удовлетворительный бал" ElseIf note = 3 Then score_comment = "Неудовлетворительный бал" ElseIf note = 2 Then score_comment = "Плохой бал" ElseIf note = 1 Then score_comment = "Ужасный бал" Else score_comment = "Нулевой бал" End If "Комментарий в ячейке B1 Range ("B1") = score_comment End Sub
Select
Существует альтернатива использованию If со многими ElseIf инструкциями, а именно команда Select , которая больше подходит к такого рода ситуаций.
Рассмотрим пример макроса с оператором Select :
Sub scores_comment () "Переменные Dim note As Integer , score_comment As String note = Range ("A1") "Комментарии, основанные на полученной оценке Select Case note "
Стоит отметить, что мы также могли использовать и другие операторы сравнения:
Case Is > = 6 "если значение> = 6
Примеры с различными значениями:
Case Is = 6, 7 "если значение = 6 или 7 Case Is 6, 7 "если значение не равно 6 или 7 Case 6 To 10 "если значение = любому числу от 6 до 10
Работа с Андроидом