До сих пор рассматривались процедуры и функции, которые VBA выполняет в линейном порядке - VBA начинает выполнение кода с первого оператора после строки объявления процедуры (функции) и продолжает выполнять каждый оператор построчно до тех пор, пока не будет достигнут оператор End Sub (End Function). Такой линейный алгоритм можно представить нижеследующей блок-схемой (рис.1):
ветвления). Автор24 — интернет-биржа студенческих работ">
Однако довольно часто встречаются ситуации, когда необходимо, чтобы процедуры или функции выполняли различные действия при разных условиях. Такую ситуацию иллюстрируют блок-схемы, представленные на рисунка 2 и 3.
Операторы, выполняющие роль ветвления программы на основании какого-либо условия, называются операторами условного перехода.
Операторы If..Then и If..Then..Else
Простейшими операторами условного перехода являются операторы If..Then и If..Then..Else. Первый оператор позволяет выбирать единственную ветвь процедуры (рис.2), тогда как второй дает возможность выбирать из двух альтернативных ветвей кода процедуры (рис.3) на основе оценки того, является ли условие равным True или False.
Синтаксис If..Then
Вариант 1: If Then
Вариант 2: If Then End If
Где:
- - логическое выражение;
- - один, несколько или ни одного оператора VBA.
Первый вариант требует написания оператора в одну строку, при этом в блоке можно указывать несколько операторов, разделяя их двоеточием.
Второй вариант позволяет указывать несколько операторов в разных строках.
Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в блоке . Если это логическое выражение равно True, то выполняется оператор (операторы) блока . Затем VBA продолжает выполнение кода следующего за строкой If..Then (вариант 1) или за ключевыми словами End If (вариант 2). Если же логическое выражение равно False, то операторы блока пропускаются и выполняется код, следующий за этой секцией.
Блоки Else If и Else - необязательны.
Синтаксис If..Then..Else
Вариант 1: If Then Else
Вариант 2: If Then Else End If
Где:
- - логическое выражение;
- , - один, несколько или ни одного оператора VBA.
По аналогии с If..Then - первый вариант требует написания оператора в одну строку, при этом в блоках , можно указывать несколько операторов, разделяя их двоеточием.
Второй вариант позволяет указывать несколько операторов в разных строках.
Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в блоке . Если это логическое выражение равно True, то выполняется оператор (операторы) блока . Затем VBA продолжает выполнение кода следующего за строкой If..Then (вариант 1) или за ключевыми словами End If (вариант 2). Если же логическое выражение равно False, то выполняются операторы блока .
Следует сказать, что блок операторов If..Then..Else (вариант 2) легче читать и понимать. Поэтому, советуют использовать именно этот вариант, даже если в блоках , будет находиться по одному оператору.
Оператор Select Case
Данный оператор служит альтернативой оператору If..Then. В переводе с английского "Select Case" можно перевести как "выбор ситуации". И если оператор If..Then в каждом своём Else If вынужден обращаться к проверяемым значениям снова и снова (допустим, выражение каждый раз одинаковое), то Select Case делает это только один раз, что позволяет последнему на больших массивах данных работать быстрее. Этот оператор позволяет удобно задать ветвление программы из одной точки в большое количество веток. То есть в основном применяется при множественных условиях проверки, когда проверяемых условий больше двух.
Давайте посмотрим, как выглядит обобщённая структура:
Select Case
Case
Case Else
End Select
В качестве блока можно вставить любую переменную или свойство, значение которой или которого вы можете проверить. Можно также проверять значение конкретной ячейки. При этом работать можно не только с числами, но и с текстами. И даже с булевыми значениями True/False (правда/ложь), о чем знают не все.
- это то, с чем сравнивается . И, если одно удовлетворяет другому, то выполняется. Есть несколько вариантов записи для блока . Для текстовых и числовых значений можно записывать разные значения через запятую:
Case 3, 4, 5, "да", "нет"
Для чисел можно выбирать диапазоны:
Case 3 to 10 'От 3-х до 10-ти, включая сами 3 и 10.
Также для чисел можно использовать логический оператор сравнения вместе с частицей Is:
Case Is
Case Is = 3 'Равно 3-м. Избыточная запись, достаточно Case 3
Case Is > = 4 'Больше либо равно 4
Case Is 0 'Не равно нулю
Допустимо использовать и логические операторы, что позволит предусматривать сложнейшие случаи и проводить параллельные сравнения с другими переменными. Кроме оператора Or, который заменяется обычной запятой.
Case ... And ...
Case Not ...
может быть абсолютно любым. Если вы его пропускаете - то для данного случая программа будет бездействовать. Case вместе с частью складываются в один блок:
Case
Таких блоков может быть любое количество, которое уложится в предельные размеры процедуры (она должна иметь объем не более 64 килобайт). Полезно знать, что VBA просматривает соответствие блоков и вдоль по блокам сверху вниз. То есть, у вас может быть 2 блока с одинаковым Case, но выполнится только тот, который будет раньше найден программой при просмотре кода сверху вниз.
Case Else - это все другие случаи, которые не подошли ни под одно другое во всех блоках оператора Select Case. Если блок Case Else отсутствует и ни один другой блок не подошёл, то программа делает логичное "ничего". Case Else должен быть последним проверяемым случаем среди всех блоков проверки в операторе. После него других блоков быть не должно, иначе получим синтаксическую ошибку "Case without Select Case".
В конце оператора должен стоять End Select, который служит "точкой" в "предложении" оператора.
Рассмотрим примеры использования кода и начнём с самого простого. В первом примере в зависимости от значения Х выводится сообщение.
Sub SelectCase_example_1()
Dim X As Long
X = 1 'Можете изменять эту цифру и смотреть, что получится.
Select Case X
Case 1
MsgBox "Один"
Case 2
MsgBox "Два"
Case 3
MsgBox "Три"
Case Else
MsgBox "Выбрано что-то другое"
End Select
End Sub
Второй пример показывает некоторые виды записи проверяемого значения. В зависимости от количества листов в книге с макросом выводится разное сообщение. Обратите внимание, что если листов в книге 7, то первым сработает “Case 7”, хотя условие “Case 5 to 12” тоже подходит, но стоит позже.
Sub SelectCase_example_2()
'Введём переменную и посчитаем количество листов в текущей книге:
Dim X As Long
X = ThisWorkbook.Sheets.Count
Select Case X 'В зависимости от количества листов в книге выведем сообщение.
Case 1 'Если 1 лист, то...
MsgBox "Один лист в книге"
Case 2, 3, 4 'Если листов 2 или 3 или 4
MsgBox "Несколько листов в книге"
Case 7 'Если листов 7
MsgBox "Красивое количество листов"
Case 5 To 12 'Если листов от 5 до 12
MsgBox "Почти брошюра"
Case Is >= 14 'Если листов больше либо равно 14
MsgBox "Листов как в фолианте"
Case Else 'Все остальные случаи, а именно 13
MsgBox "Чёртова дюжина листов"
End Select
End Sub