Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2313

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.4 Mб
Скачать

Оператор if.. .Then.. .Else - стандартный оператор ветвления. Его использование позволяет проверить некоторое условие и, в зависимости от его истинности, выполнить ту или иную группу операторов. Для данного оператора есть два варианта синтаксиса - в одну строку и в несколько:

If условие Then [блокОператоров1] [Else блокОператоров2]

ИЛИ

If условие1 Then [блокОператоров1]

[Else If условиеN Then [блокОператopoвN]

[Else

[блокОператopoв_Else]

End If

Начнем по порядку. После ключевого слова if стоит условие. В качестве условия можно использовать логическое выражение, возвращающее значение True или False. Также можно использовать арифметическое выражение: в этом случае нулевое его значение эквивалентно False, ненулевое - True. Если условие возвращает True, то выполняется блокоператоров1, если False - блокОператоров2, где блок операторов - это последовательность разделенных двоеточием операторов. Причем необходимо наличие хотя бы одного из блоков операторов. Таким образом, описывается первая схема, являющаяся частным случаем второй. Вторая же представляет развернутую цепочку ветвления, когда приходится делать выбор одного из целой группы альтернативных действий на основе проверки нескольких различных условий. В подобном случае также необходимо наличие хотя бы одного из блоков операторов.

Вторая схема действует по следующему принципу. Проверяется условие1 и, если оно истинно, выполняется блокопе-

63

раторов1 и осуществляется переход к оператору, стоящему за ключевым словом End if. Если же оно ложно, то проверяется условие2 и т. д. Если проверка дошла до последнего оператора Elseif и условием тоже оказывается ложным (т. е. все вышестоящие условия ложны), выполняется блокОператоров_Еlse.

Влистинге инициализируются три переменные а, b и с. Далее показывается использование условного оператора в виде одной строки с использованием разделителя операторов - двоеточия. Поскольку проверяемое условие истинно, то выполняется присваивание (с = c+1) и вывод (с = 11).

Вследующей конструкции проверяется условие (с > 20),

ит. к. условие ложно, то не выполняется оператор присваивания (с = c+1). Далее проверяется условие (с = -а+b+1) - оно истинно, следовательно, выполняется вывод (с = 11). В противном случае вывелось бы "Не может быть" (чего не может быть).

Листинг. Использование оператора if. . .Then.. .Else Sub pr1()

Dim a As Integer, b As Integer, с As Integer a = -10

b = 0 с = 10

If с > a Then с = с + 1: MsgBox(c) Else a = a - 1: MsgBox(a) If с > 20 Then

с = с + 1

ElseIf с = -a + b + 1 Then MsBox(c)

Else

MsgBox("He может быть") End If

End Sub

Функция IIf

В случае с простым ветвлением бывает удобно использование функции IIf которая имеет следующий формат:

64

IIf(выражение, значениеЕслиДа, значениеЕслиНет)

Эта функция проверяет значение выражения выражение: если оно истинно, то функция возвращает значение значениеЕслиДа, в противном случае - значениеЕслиНет.

Функция IIf является встроенной функцией и, как всякая функция, используется в выражении. Таким образом, функцию IIf удобно использовать, когда ветвление требуется в программе не для того, чтобы выбрать ту или иную альтернативную последовательность действий, а для того, чтобы присвоить то или иное альтернативное значение.

Пример:

D2 = IIf (I < 10, 250, 50)

Оператор Select Case

Если выбор одной из нескольких возможностей все время основан на различных значениях одного и того же выражения - гораздо удобнее использовать предназначенный для этого оператор выбора select Case, имеющий следующий синтаксис:

Select Case выражение

Case списокЗначений1 [блокОператоров 1]

[ Case списокЗначенийN [блокОператоровN] ]

[ Case Else

[блокОператоров_ Else]]

End Select

Проверяемое выражение вычисляется в начале работы оператора Select case. Это выражение может возвращать значение любого типа - например, логическое, числовое или строковое. При выполнении оператора select case - значение проверяемого выражения вычисляется один раз и запоминается. Далее идет список альтернатив, начинающихся ключевым словом

65

case. В каждой альтернативе указан список значений, представляющий собой несколько возможных значений, разделенных запятой. При выполнении оператора select Case значение сравнивается со списками значений альтернатив.

Элементы списка значений могут иметь одну из следующих форм:

1. Значение (в этом случае проверяется, совпадает ли значение про-

веряемого выражения с указанным значением); 2. Значение1 То Значение2

(в этом случае проверяется, находится ли значение проверяемого выражения в диапазоне указанных значений);

3. Is логическаяОперация значение

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

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

В следующем примере при помощи функции inputBox переменной t присваивается некое значение, после чего посредством оператора select Case проверяются положительность значения переменной.

Листинг. Использование оператора select Case

Sub procLine() Dim t As Variant

t = InputBox("Введите число")

Select Case t Case 0

MsgBox("Введен О")

Case 1 To 100

66

MsgBox("Введено число > 0")

Case -100 To -1

MsgBox("Введено число < 0")

Case Else

MsgBox("Число слишком большое")

End Select

End Sub

Подобная конструкция, как упоминалось, возможна и для строковых значений - в таком случае используется лексикографическое упорядочивание.

Оператор GoTo

Помимо условных операторов, в VBA существует оператор безусловного перехода, который также меняет порядок выполнения операторов в программе (безусловно).

GoTo имяМетки

После ключевого слова идет имя метки. Метка - это идентификатор, приписанный оператору программы и используемый в других частях программы для обращения к этому оператору. Метка может быть определена как до, так и после ключевого оператора GOTO, причем она должна отделятся от помеченного ею оператора двоеточием. Нижеприведенный пример, вообще говоря, будет выполняться бесконечно. Мы специально приводим семантически неверную программу, чтобы подчеркнуть, как легко можно ошибиться при использовании оператора GOTO.

Листинг. Использование оператора GOTO

Sub branchLabel ()

Labe11: MsgBox("Использование метки")

GoTo Labe11 End Sub

Применение оператора безусловного перехода является нежелательным, поскольку присутствие этого оператора в программе нарушает ее структурную целостность и наглядность.

67

Такую программу трудно читать, отлаживать и модифицировать.

4.3. Операторы цикла

Циклы позволяют многократно выполнять отдельный оператор или группу операторов. Операторы цикла VBA делятся на три группы:

1.Циклы со счетчиком (For.. .Next);

2.Циклы с условием (DO. . .Loop);

3.Циклы по структуре данных (For Each. . .Next).

Оператор For...Next

Данный оператор позволяет выполнять группу операторов (которая называется телом цикла) заранее определенное количество раз, при этом параметр цикла последовательно принимает ряд значений, определенный пользователем в заголовке цикла.

For счетчик = начало То конец [Step шаг] [блокОператоров1]

[Exit For]

[блокОператоров2] Next [счетчик]

Счетчик - это и есть тот числовой параметр цикла, который должен принимать ряд значений от значения начало до значения конец. Причем этот ряд может образовывать как возрастающую, так и убывающую арифметическую прогрессию. Необязательный параметр шаг указывает, с каким шагом следует пробегать заданный ряд значений (по умолчанию шаг равен 1).

блокОператоров1 и блокОператоров2 - это блоки операторов, которые выполняются, пока счетчик не пробежит ряд значений до конца. Прервать же данный пробег вправе только оператор Exit For, предназначенный для выхода из цикла не дожидаясь его завершения и передачи управления оператору,

68

следующему непосредственно за Next. Как правило, оператор используется в тех местах тела цикла, где требуется из него выйти по условию.

Вконце цикла ставится заключительный оператор Next, после которого указывается счетчик цикла. Хотя данное "указывание" необязательно, мы рекомендуем всегда его использовать, поскольку программа станет более понятной, особенно в случае большого количества вложенных циклов.

Строка, которая начинается ключевым словом For, называется заголовком цикла, а все, что находится между заголовком цикла и ключевым словом Next, - это тело цикла.

Итак, рассмотрим работу конструкции цикл со счетчиком

вцелом. Оператор For инициализирует переменную счетчик значением начало, после этого выполняется тело цикла, пока не встретится оператор Exit For (выход) или оператор Next (следующий). Далее оператор Next проверяет, не достигнуто ли значение конец - если нет, то прибавляется значение шага к счетчику и процедура повторяется, если да - работа оператора цикла завершается.

Влистинге мы рассмотрим три примера работы с циклом For.. .Next В первом примере мы запрограммировали решение задачи о вычислении' факториала числа 20 (20!=1х2хЗх...х20), причем значение счетчика явно используется в вычислениях. После чего вывели итоговый результат (около 2,432Е+18).

Во втором примере мы показываем, что помимо простых конструкций с циклами существуют более сложные - вложенные циклы. Характерным примером для вложенных циклов является инициализация матрицы (nхm). Мы проинициализировали все элементы матрицы (6x5) единицей.

Впоследнем примере мы продемонстрируем работу оператора Exit For и счетчика с отрицательным шагом. Допустим, у нас есть проинициализированный массив типа string. Необходимо найти элемент данного массива, равный строке "выход", причем проверка будет происходить с конца массива.

69

Листинг. Использование оператора For. . .Next Sub factorial()

Dim factorial As Variant: factorial = 1 For i = 1 To 20

factorial = factorial * i Next MsgBox(factorial) End Sub

Sub InitMatrix()

Dim matrix(5, 4) As Integer Dim i As Integer, j As Integer For i = 0 To 5

For j = 0 To 4 matrix (i, j) = 1 Next j

Next i End Sub

Sub VectorSearch() Dim Vector(7) As String 'Инициализация

For i = 7 To 0 Step -1

If Vector(i) = "Выход" Then MsgBox("i = " & i)

Exit For

End If

Next i End Sub

Оператор Do..Loop

Допустим, вы не знаете заранее, сколько раз должно выполниться тело цикла, как в случае с оператором For.. .Next, но знаете условие, при котором цикл должен продолжать или прекращать свою работу. В таком случае и следует употреблять циклы с условием. - оператор цикла DO ... Loop. Сущест-

70

вует два вида циклов с условием: с предусловием и с постусловием, соответственно и цикл DO ... Loop имеет две синтаксические конструкции, суть различия которых - во времени проверки условия.

Предусловие:

Do [{While | Until} условие] [блокОператоров1]

[Exit Do]

[блокОператоров2]

Loop

Постусловие:

Do

[блокОператоров1]

[Exit Do]

[блокОператоров2]

Loop [{While | until} условие]

Теперь о проверке условий. Если в конструкции стоит ключевое слово while, то блок операторов будет выполняться пока условие остается истинным, если же стоит until, то блок операторов будет выполняться пока условие остается ложным.

Вообще, исходя из синтаксиса, наличие условия не обязательно. Если его нет, то по умолчанию оно трактуется как False. Необязательный оператор Exit DO аналогичен оператору Exit For в цикле For.. .Next. Он также прекращает выполнение цикла и передает управление на оператор, следующий непосредственно за Loop.

Давайте на приведенном выше примере рассмотрим работу цикла с условием.

Наше условие выглядит так: "сумма > 5000", причем это условие выхода из нашего цикла, т. к. мы найдем искомое число элементов массива. Следовательно, вначале мы должны вычислить сумму (блокОператоров), а потом проверить, не

71

больше ли она 5000 (until sum > 5000). Помимо этого надо следить за тем, чтобы проверялись только допустимые элементы массива, для чего мы использовали оператор if.

Во втором примере мы решили ту же самую задачу, но несколько другим способом. Мы запустили, вообще говоря, бесконечный цикл, поскольку условие (while l) всегда истинно. Выходом же из цикла является выполнение условия sum >

5000.

Листинг. Использование оператора Do... Loop Sub exl()

Dim shops(1 То 25) As Integer, sum As Integer 'Инициализация 'Первый способ

i = 0 sum = 0 Do

If i = 25 Then Exit Do

End If i = i + 1

sum = sum + shops(i) Loop Until sum>5000 MsgBox i

'Второй способ i = 0

sum = 0 Do While 1

If i = 25 Then Exit Do i = i + 1

sum = sum + shops(i)

If sum > 5000 Then Exit Do Loop

MsgBox i

End Sub

72

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]