С помощью управляющих конструкций определяются последовательности выполнения программы. Без них все операторы программы будут выполняться слева направо и сверху вниз. Иногда случается, что нужно много раз выполнить определенный набор инструкций или же решить задачу другим способом, который будет зависеть от значений переменных или параметров, задаваемых пользователем в процессе выполнения. Именно в подобных случаях и помогают управляющие конструкции управления, а также циклы.
В VBA используются следующие конструкции принятия решений:
- If ... Then;
- If ... Then ... Else;
- Select Case.
Конструкция If . . . Then
Управляющую конструкцию If...Then используют в случаях, в которых требуется выполнить один или несколько операторов в зависимости от определенного условия. Синтаксис данной конструкции позволяет задавать ее двумя способами:
- В одной строке программы: If Then .
- В нескольких строках программы:
If Then
End If
Как правило, в качестве условия выступает простое сравнение, однако может использоваться любое выражение с вычисляемым значением. В случае истинности условия будут выполняться все выражения, которые находятся после ключевого слова Then.
Приведем два эквивалентных оператора, которые записаны разными способами:
- If A > = B Then A = A ∙ 2
- If A > = B Then
A = A ∙ 2
End If
Отметим, что синтаксис оператора If...Then для одной строки не использует оператор End If. В случае, когда условие истинно, для выполнения последовательности операторов будем использовать блоковую конструкцию If ... Then ... End If.
Приведем пример:
If A > = B Then
A = A ∙ 2
Sheets("Задача").Range("B2") = A
Rem На листе Задача в ячейку B2 поместить значение А
End If
При ложном условии операторы, стоящие после ключевого слова Then, не будут выполняться, а управление будет передано следующей строке (или строке, стоящей после оператора End If в блочной конструкции).
Конструкции If . . . Then . . . Else и If ... Then ... ElseIf
В управляющей конструкции If... Then ... Else используется несколько блоков операторов, причем выполняться будет только один в зависимости от условия:
If Then
...
Else
...
End If
В начале проверяется условие. В случае его истинности выполняется соответствующий блок операторов и затем передается управление инструкции, которая следует за оператором End If. В обратном случае будет выполняться блок операторов, стоящий после ключевого слова Else. Конструкция If...Then...ElseIf представляет собой частный случай конструкции If...Then...Else, который применяют в случае вложенности таких конструкций.
Рассмотрим пример сравнения двух чисел:
Sub Задача1()
Dim Rez As String
a = (InputBox("Введи a", "Ввод данных", 0))
Dim a As Single, b As Single
Ввод данных", 0))
b = (InputBox("Введи b", "Ввод данных", 0))
If a
Rez = "a
ElseIf a = b Then
Rez = "a = b"
Else Rez = "a > b"
End If
Msgbox Rez,64,"Информация"
End Sub
В управляющей конструкции If...Then может использоваться любое количество блоков ElseIf. Но если оно будет большим, то конструкция If...Then станет довольно громоздкой и неудобной. В таком случае рекомендуется применить другую конструкцию принятия решения — Select… Case.
Конструкция Select… Case
Управляющая конструкция Select…Case представляет собой альтернативный вариант управляющей конструкции If...Then...Else. С ее помощью можно сделать код легко читаемым при наличии нескольких вариантов выбора. В конструкции Select…Case используется единственное проверяемое выражение, вычисляемое лишь один раз при входе в эту конструкцию. В дальнейшем полученный результат сравнивается со значениями, которые задаются в операторах Case, до тех пор, пока они не совпадут. Данная управляющая конструкция имеет следующий синтаксис:
Select Case
[Case список_выражений 1
[блок_операторов 1]]
[Case список_выражений 2
[блок_операторов 2]]
...
[Case Else
[блок_операторов n]]
End Select
В каждом списке выражений может содержаться одно или несколько значений. В последнем случае они будут отделяться друг от друга запятыми. При этом в каждом блоке операторов может содержаться несколько операторов или же ни одного. В случае, когда проверяемое выражение будет соответствовать значениям нескольких операторов Case, то будут выполняться операторы, которые совпадут с первым оператором Case из всех найденных соответствий. Блок операторов Case…Else (он не является обязательным) будет выполняться в случае, когда не будет найдено ни одного соответствия проверяемого значения выражения и значений из всех списков операторов Case. Еще раз отметим, что управляющая конструкция Select…Case вычисляет выражение только один раз при входе в нее, тогда как в конструкции If...Then...Else вычисляются различные выражения для каждого оператора ElseIf. Конструкцию If...Then...Else можно заменить конструкцией Select…Case, только если оператор If и каждый оператор Elself вычисляют одно и то же выражение.
Операторы цикла
Операторы цикла используются при программировании повторяющихся фрагментов, т.е. при реализации циклических алгоритмов.
Имеются две разновидности данных операторов: оператор цикла с фиксированным числом повторений и оператор цикла с переменным числом повторений, которое зависит от условий.
Оператор цикла For (с фиксированным числом повторений)
Синтаксис:
For переменная = M1 To M2 [Step M3]
операторы
Next
Где M1, M2, M3 — выражения. Оператор цикла повторяет выполнение группы операторов до тех пор, пока переменная (счетчик) изменяется от начального значения М1 до конечного М2 с указанным шагом М3. Если шаг не указан, то подразумевается, что он равен 1.
Рассмотрим пример:
Sum = 0
For I = 1 To 31
Sum = Sum + Sheets("Температура").Cells(I,1)
Next
ST = Sum/31
В приведенном выше примере предполагается, что на листе «Температура» в первом столбце записаны показатели температур за июль месяц. Необходимо рассчитать среднюю температуру за месяц.
Оператор цикла While (с переменным числом повторений)
Синтаксис:
Do While
Loop
Все операторы будут выполняться между Do While и Loop до тех пор, пока условие будет истинным. Если при входе в цикл условие ложно, то операторы выполняться не будут.
Рассмотрим пример:
Rem - удвоение числовых переменных массива А с четными номерами индексов и вывод на лист «Цикл».
Dim A(10) As Byte, i As Byte, j As Byte
Rem Массив надо заполнить
i = 0
j = 0
Do While i
j = j + 1
i = i + 2
A(i) = A(i) * 2
Sheets("Цикл").Cells(j, 1) = A(i)
Loop
Оператор безусловного перехода GoTo
При использовании оператора безусловного перехода GoTo всегда изменяется порядок выполнения операторов в процедуре или функции VBA без проверки каких-либо условий. Синтаксис оператора GoTo:
GoTo , где – это любая допустимая метка в той же процедуре или функции, содержащая оператор GoTo.
Пример использования оператора GoTo:
'Программа запрашивает ввод значения пока не будет введено четное число
Sub sample6()
getValue: 'метка
value = InputBox(prompt:="Введите четное число")
If (value Mod 2 0) Then GoTo getValue
End Sub