Иллюстрированный самоучитель по Microsoft Outlook 2002

Операторы

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

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

Программа 20.12. Использование оператора Do… Loop

Sub ShopCalculate()
Dim bookshops(1 To 25) As Integer, sum As Integer
Инициализация booksShops
Первый способ
sumOfBooks = 0
numOfShops = 0
Do
numOfShops = numOfShops + 1
If numOfShops > 25 Then Exit Do
End If
sumOfBooks = sumOfBooks + bookshops(numOfShops)
Loop Until sumOfBooks > 5000 MsgBox(numOfShops - 1)
Второй способ 
sumOfBooks = 0 numOfShops = 0 Do While 1
numOfShops = numOfShops + 1
If numOfShops > 25 Then Exit Do
sumOfBooks = sumOfBooks + bookshops(numOfShops)
If sumOfBooks > 5000 Then Exit Do Loop
MsgBox(numOfShops - 1) End Sub

Последний из рассматриваемых нами операторов – это оператор цикла по структуре. Сразу предупредим, что здесь рассматривается лишь урезанная возможность данного оператора, поскольку мы еще не рассматривали такой тип данных, как семейство. Но мы обязательно расскажем более подробно об этом операторе, когда придет время. Итак, как всегда, начнем с прагматики. Представьте, что необходимо вычислить сумму элементов массива, диапазон изменения индексов которого может со временем измениться, даже более того, может измениться его размерность, а программа содержит очень много процедур, в которые входит суммирование массива. Ни один из вышеприведенных циклов использовать нельзя, поскольку как только изменится размерность, вам придется переписывать эти циклы. Решением является использование оператора For Each…Next. В этом операторе отсутствует счетчик, а тело цикла выполняется для каждого элемента в массиве.

For Each элемент In группа
[блокОператоров1] [Exit For]
[блокОператоров2] Next [элемент]

Здесь элемент – это переменная, пробегающая в качестве значений элементы массива. Под группой мы пока будем понимать только массив. Элемент обязан быть переменой типа variant. А дальше все знакомо. Работа цикла происходит следующим образом: блок – операторов выполняется, пока переменная элемент не пробежит все элементы массива.

В следующем примере представим, что мы не знаем точного количества магазинов, они могут присоединиться или, наоборот, отказаться от услуг издательства, но (в данном случае) мы хотим подсчитать, сколько всего поступило заявок издательству. Тогда с использованием объявления динамических массивов и оператора For Each…Next данная проблема решается без затруднений. Заметьте, что не надо менять цикл, даже если вы исправите размерность массива, например на bookshops (25, 2) (заявки на две книги одновременно).

Программа 20.13. Использование оператора For Each…Next

Sub RecSum()
Dim bookshops() As Integer
Dim elem As Variant
ReDim bookshops(1 To 25)
Инициализация
sum = 0
For Each elem In bookshops
sum = sum + elem Next
MsgBox(sum) End Sub

На этом мы закончим описание операторов VBA и перейдем к рассмотрению структуры программы.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.