Операторы ветвления VBA: простой выбор. Методические указания и задания Условие в vba функция равна нулю

Условия являются очень полезными при программировании, поскольку позволяют нам выполнять действия, в зависимости от установленных критериев (используется такой же принцип как и в 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

3.5.1 Операторы условного и безусловного перехода . Оператор If… Then... Else

Проверка условий в VBA, оператор If...Then... Else, вложенные конструкции If

Операторы условного перехода - одни из самых важных и часто используемых элементов в языках программирования. Общий принцип их работы прост: проверяется соответствие каким-то условиям (истинность или ложность каких-либо выражений) и в зависимости от этого выполнение программы направляется по одной или другой ветви. В VBA предусмотрено два оператора условного перехода: If… Then... Else и Select Case.

Оператор If… Then ... Else - самый популярный у программистов. Полный его синтаксис выглядит так:

If Условие Then
Команды1

При этом:

  • Условие - выражение, которое проверяется на истинность. Если оно истинно, то выполняются Команды1, если ложно - Команды2;
  • УсловияN - дополнительные условия, которые также можно проверить. В случае, если они выполняются (выражение УсловияN истинно), то выполняются КомандыN.

Оператор If…Then... Else применяется:

  • когда нужно проверить на соответствие одному условию и в случае соответствия сделать какое-то действие:

If nTemperature < 10 Then

MsgBox "Одеть куртку"

  • когда нужно сделать то, же что и в предыдущем примере, а в случае несоответствия выполнить другое действие:

If nTemperature < 10 Then

MsgBox "Одеть куртку"

MsgBox "Одеть ветровку"

  • когда нужно проверить на соответствие нескольким условиям (обратите внимание на использование логических операторов):

If (nTemperature < 10) And (bRain = True) Then

MsgBox "Одеть куртку и взять зонтик"

  • когда в случае, если первая проверка вернула False, нужно проверить на соответствие еще нескольким условиям (в этом случае удобно использовать ElseIf):

If (bIGoInCar = True) Then

MsgBox "Одеться для машины"

ElseIf nTemperature < 10 Then

MsgBox "Одеть куртку"

MsgBox "Можно идти в рубашке"

В этом примере, поскольку bIGoInCar - переменная типа Boolean и сама по себе принимает значения True или False, первая строка может выглядеть так:

If bIGoInCar Then …

Некоторые замечания по использованию If…Then... Else:

  • ключевое слово Then должно находиться в одной строке с If и условием. Если вы перенесете его на следующую строку, будет выдано сообщение об ошибке;
  • если разместить команду, которую нужно выполнить при истинности проверяемого условия, на одной строке с If и Then, то End If можно не писать:

If nTemperature < 10 Then MsgBox "Одеть куртку"

  • если же вы используете несколько команд или конструкции Else/ElseIf, то End If в конце нужно писать обязательно - иначе возникнет синтаксическая ошибка.
  • для выражения If…Then настоятельно рекомендуется использовать отступы для выделения блоков команд. Иначе читать код будет трудно.
  • операторы If…Then можно вкладывать друг в друга:

If MyVar = 5 Then

MsgBox “MyVar = 5”

If MyVar = 10 Then

MsgBox “MyVar = 10”

Зачастую в определенном месте программы необходимо выполнять те или иные операторы, в зависимости от некоторых условий. Эта возможность в Visual Basic реализовать при помощи так называемых управляющих конструкций (или структур), которые в свою очередь состоят из структур принятий решений и циклов. Ниже приводится подробное описание двух существующих конструкций принятия решений.

Конструкция If:Then. Существует несколько разновидностей данной структуры. Если при выполнении какого-либо условия необходимо выполнять один оператор, то нужно использовать конструкцию следующего вида:

If условие Then оператор

В том случае, когда результатом проверки условия является значение True (истина), то выполняется оператор, находящийся после служебного слова Then. С другой стороны, если после проверки условия было получено значение False (ложь), то выполнить следующий по порядку оператор. Все описанные параметры данной структуры должны быть указаны в одной строке.

Если при выполнении условия требуется выполнить не один, а несколько операторов, то следует использовать такую конструкцию:

If условия Then Операторы End If

В случае истинности проверяемого условия будут выполнены операторы, расположенные после ключевого слова Then. С другой стороны, если условие является ложным, то выполняется следующий после данной конструкции оператор. В том случае, когда в блоке операторы находится только один оператор, то данная структура все равно должна заканчиваться служебным словосочетанием End If.

При необходимости выполнении того или иного оператора (или блока операторов) в зависимости от результата проверки определенного условия, в языке Visual Basic следует использовать такую конструкцию:

If условия Then Операторы1 Else Операторы2 End If

If условие Then Операторы1 Else: Операторы2 End If

Если результат проверки условия является значение True, то будет выполнен блок операторы1, находящийся после ключевого слова Then. С другой стороны, если проверка условия дала результат False, то будет выполнен блок операторы2, расположенный после служебного слова Else.

Во втором из приведенных вариантов в качестве блока операторы2 может использоваться как один оператор (тогда он записывается после знака ":" в той же строке, что и служебное слово Else), так и несколько (при этом каждый оператор, начинается со второго, записывается в отдельной строке).

В том случае, когда определенное действие (или набор действий) нужно выполнять после проверки не одного, а нескольких условий на языке Visual Basic следует использовать такую управляющую структуру:

If условие Then Операторы1 ElseIf условие2 Then Операторы2 . . End If

Если условие1, находящееся после ключевого слова If, истинно, то выполняется блок операторы1, расположенный после Then. Если же оно ложно, то осуществляется проверка условия2, находящегося после служебного слова ElseIf, в случае его истинности выполняется блок операторы2 и т.д. Если ни одно из условий не является истинным, то есть результатом всех проверок является значение False, то выполнятся блок операторыN, расположенный после ключевого слова Else (данный блок является необязательным).

В дополнение к приведенной выше структуре If:Then следует также рассмотреть функцию IIf, которая возвращает одно из двух значений, в зависимости от проверяемого условия.

Синтаксис данной функции имеет вид:

IIf(условие, значение1, значение2)

В том случае, когда результатом проверки условия является значение True, функция возвращает значение1, а когда проверка дает значение False, то возвращаемы результат - значение2. Например:

Dim intA As Integer, strA As String intA = 6 strA = IIf(intA Mod 2=0, "Четное", "Не четное")

Если число intA делится на 2 без остатка, то строке strA будет присвоено значение "Четное", в противном случае - "Не четное".

Конструкция Select:Case. Когда существует несколько операторов (или блоков операторов), которые необходимо выполнять в случае истинности того или иного условия, то запись конструкции If:Then окажется достаточно громоздкой. Поэтому в подобных случаях следует использовать структуру Select:Case, которая улучшает читаемость программы. Ее конструкция выглядит следующим образом:

Select Case переменная Case значения1 Операторы1 Case значения2 Операторы2 . . . End Select

Если переменная содержит значение1, расположенное после первого по порядка ключевого слова Case, то выполняется блок операторы1. С другой стороны, если содержимое переменной равно значению2, то выполняется блок операторы2 и т.д. Когда содержимое переменной не равно ни одному из приведенных значений, то выполняется блок операторыN, находящийся после служебного словосочетания Case:Else, которое является необязательным в рассматриваемой конструкции.

В том случае, когда при нескольких значениях переменной необходимо выполнять один и тот же оператор (блок операторов), то список этих значений нужно указать после ключевого слова Case, разделяя их запятыми.

Например:

Select Case x Case 1 x=x+1 Case 2, 3, 4 x=10 Case Else x=20 End Select

До сих пор рассматривались процедуры и функции, которые 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.

The IF function in VBA is one of the most frequently used of all statements. The IF function checks if the specified condition is being met or not. The IF function in VBA works in a slightly different manner from how it works in Excel. In Excel, the IF function does two things: It checks whether the given condition evaluates to TRUE or FALSE and then returns a value to use based on the evaluation i.e IF(condition, return_value_if_condition_true, return_value_if_condition_false ). However, the IF function in VBA does only the first part, i.e. check if the condition evaluates to TRUE or FALSE. The steps to take in either scenario as specified using the additional THEN statement.

Using a simple IF function in VBA

Here’s an example of the IF function . This piece of VBA code is simply checking whether the condition specified (i.e. 1 > 4) evaluates to TRUE or FALSE. In this case, we have only specified the steps to be completed when the condition evaluates to TRUE. In this case, the result will be a being displayed on the screen. If the function were to evaluate to FALSE, the VBA code will do nothing.

1
2
3
4
5

Sub IF_FUNCTION()
If 7 > 1 Then
MsgBox "7 is greater than 1"
End If
End Sub

The THEN statement is essentially a directive indicating that the steps immediately following it are to be executed if the condition just before if evaluate to TRUE.

The IF function typically ends with an END IF declaration which lets the application know that it is the last line of the IF function. Given below is a slightly shorter form of the IF function. Note that the END IF statement has been eliminated in this and thus three lines of code has been merged into one.

Sub IF_FUNCTION_SHORT()
If 7 > 1 Then MsgBox "7 is greater than 1"
End Sub

However this form should be used only when there are no ELSE or ELSE IF statements are needed. Let’s look at what they are and how they help enhance the IF function.

Using a IF function with ELSE in VBA

In the example given above, we saw that the IF function would be able to carry out steps only if the condition evaluated to TRUE. But what if we wanted to specify the steps to be carried out when either of the conditions were met. One way to achieve branching out of an IF function is to use the ELSE statement. Simply put, the ELSE statement causes the application to execute the steps mentioned in the ELSE block when the condition specified in the IF clause evaluates to FALSE.

In the VBA code example below, the condition in the IF function evaluates to false, the steps mentioned in the ELSE block are executed with the result that the message “1 is less than 4” gets displayed on the screen. Multiple steps can be added to the block to have them all execute one after another.

1
2
3
4
5
6
7

Sub IF_ELSEIF_FUNCTION()
If 1 > 4 Then

Else :
MsgBox "1 is less than 4"
End If
End Sub

Using a IF function with ELSEIF and ELSE: in VBA

The ELSE statement may be supported by ELSEIF statements. They are typically used to check for specific conditions and if all of them evaluate to FALSE, the steps specified in the ELSE condition will finally get executed. The IF statement will check for a given condition. If that condition turns out to be FALSE, the condition specified in the first ELSEIF statement will be checked. If that also turns out to be FALSE, the condition specified in the second ELSEIF statement will be checked, and so on and so forth. If all conditions specified in the IF and ELSEIF statements turn out to be FALSE, by default the steps mentioned under the final ELSE: block will get executed. Please remember that if there are multiple ELSEIF statements, the first one that evaluates to TRUE will get executed and once completed, the code execution will move to the END IF statement. Even if there are multiple ELSEIF conditions that evaluate to TRUE, only the first one that evaluates to TRUE will be executed.

1
2
3
4
5
6
7
8
9
10
11


If < > Then
MsgBox "1 is greater than 4"
ElseIf < > Then

ElseIf < > Then

Else < >:

End If
End Sub

In the example shown below, the IF condition is checked first. Since it evaluates to FALSE, the first ELSEIF condition is evaluated, followed by the second. Since none of them evaluate to TRUE, the steps mentioned in the ELSE: condition are executed.

1
2
3
4
5
6
7
8
9
10
11

Sub IF_ELSEIF_ELSE_FUNCTION()
If 1 > 4 Then
MsgBox "1 is greater than 4"
ElseIf 2 > 4 Then
MsgBox "2 is greater than 4"
ElseIf 3 > 4 Then
MsgBox "3 is greater than 4"
Else :
MsgBox "1, 2 or 3 are lesser than 4"
End If
End Sub

Quick Tip – How to make IF statements work faster

Both the pieces of code appear similar. The two ELSEIF conditions in the second function have been swapped. Which one of the following pieces of VBA code do you think executes faster?:
End If
Next i
MsgBox Timer - t
End Sub

The answer is that the second one executes much faster than the first. Why? Because the second one needs to application to go through lesser lines of code before it finds a condition that evaluates to TRUE. Remember that the first ELSEIF condition that if found TRUE gets executed and none of the other conditions are evaluated, even if they were to also evaluate to TRUE. In the first piece of the VBA code, the ELSEIF function on line 6 evaluates to TRUE while in the second, line 5 meets the criteria. In essence, the more likely the condition is to get evaluated to TRUE, the earlier it should be placed in the VBA code, all else being the same.

Похожие публикации