Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в Excel.doc
Скачиваний:
21
Добавлен:
03.05.2019
Размер:
1.48 Mб
Скачать

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

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

Чтобы:

Используйте:

Проверить условие в начале цикла, если оно True, перейти к выполнению цикла и продолжать, пока условие не станет False

Do While...Loop

Проверить условие в начале цикла, если оно False, перейти к выполнению цикла и продолжать, пока условие не станет True

Do Until..Loop

Выполнить цикл один раз, проверить условие в конце цикла и, если оно True, продолжать, пока условие не станет False

Do...Loop While

Выполнить цикл один раз, проверить условие в конце цикла и, если оно False, продолжать, пока условие не станет True

Do...Loop Until

Выполнить цикл заданное число раз, используя счетчик цикла с определенными начальным и конечным значениями, а также шагом приращения

For...Next

Выполнить цикл по разу для каждого объекта из набора(collection)

For Each...Next

Примечание: В Visual Basic есть и оператор While...Wend, но вместо него лучше использовать более гибкие варианты оператора Do...Loop — например, Do While...Loop или Do...Loop While.

1.3.2.1. Do...Loop

Позволяет выполнять блок операторов неопределенное число раз, — когда Вам заранее не известно, сколько понадобится итераций. Существует несколько вариантов этого оператора, но в каждом из них проверяется условие и по результатам проверки определяется, надо ли продолжать цикл. Как и в операторе lf...Then, условие должно быть значением или выражением, которое можно вычислить как True или False. Далее мы рассмотрим все вариации Do...Loop. Подробнее на эту тему см. описание оператора Do...Loop в справочной системе.

1.3.2.2. Do While...Loop

Оператор Do While...Loop позволяет проверить условие перед началом цикла и выполнять цикл до тех пор, пока оно True.

Проверяемое в цикле Do While...Loop условие рано или поздно должно стать False, иначе цикл будет бесконечным. Чтобы остановить бесконечный цикл, нажмите клавиши Ctrl + Break.

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

Function CountStrings( longstring, target) position = 1 Do While lnStr(position, longstring, target) ' возвращает True или False position = lnStr(position, longstring, target) + 1 Count = Count + 1 Loop CountStrings = Count End Function

1.3.2.3. Do Until...Loop

Позволяет проверять условие в начале цикла и выполнять цикл, пока оно не станет True. Если проверка с самого начала даст True, операторы в теле цикла пропускаются. Благодаря этому цикл в следующем примере не выполняется, если Response равна vbNo.

Response = MsgBox("Do you want to process more data?", vbYesNo) Do Until Response = vbNo ProcessUserData ' вызываем процедуру для обработки данных Response = MsgBox("Do you want to process more data?", vbYesNo) Loop

1.3.2.4. Do … Loop While

Если операторы цикла следует выполнить хотя бы раз, используйте Do...Loop While, чтобы проверять условие в конце цикла. Операторы выполняются, пока условие истинно. В следующем примере для Microsoft Excel цикл повторяется, только если метод Find находит ячейку со строкой “test”. Если текст найден, ячейка закрашивается синим цветом, и продолжается поиск следующей строки “test”. Если таких строк больше нет, цикл завершается.

Sub MakeBlue() Set rSearch = Worksheets("Sheet1").Range("a1:a10") Set с = rSearch.Find(“test”) If Not с Is Nothing Then first = c.Address Do c.Font.Colorindex = 5 Set c = rSearch.FindNext(c) Loop While (Not c Is Nothing) And (c.Address <> first) Else MsgBox "not found" End If End Sub

1.3.2.5. Do...Loop Until

В этой конструкции проверка осуществляется в конце, поэтому цикл выполняется минимум один раз и прекращается, когда условие становится True:

Do ProcessUserData ' вызываем процедуру для обработки данных response = MsgBox("Do you want to process more data?", vbYesNo) Loop Until response = vbNo

1.3.2.6. For...Next

Если Вам заранее известно, что какой-то блок кода надо повторить определенное число раз, используйте цикл For...Next. В отличие от вариантов оператора Do...Loop, в операторе For...Next применяется счетчик, уменьшаемый или увеличиваемый на каждой итерации цикла. Если разновидности Do...Loop; завершают цикл, как только условие становится истинным или ложным, то цикл For...Next прекращается, когда счетчик достигает заданного значения.

Приведенная ниже процедура Sub генерирует сигнал заданное число раз:

Sub BeepSeveral() numBeeps = lnputBox("How many beeps") For counter = 1 To numBeeps Beep Next counter End Sub

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

Sub ClearArray(ByRef ArrayToClear()) For i = LBound(ArrayToClear) To UBound(ArrayToClear) Step 2 ArrayToClear(i) = 0 Next i End Sub

1.3.2.7. For Each ...Next

Цикл For Each...Next похож на For...Next за исключением того, что он повторно выполняет одну и ту же группу операторов для каждого элемента набора объектов или массива. Это особенно полезно в том случае, когда Вам не известно число элементов в наборе или когда их количество может измениться, пока работает Ваша процедура. Вот как выглядит синтаксис оператора For Each...Next:

For Each элемент In группа операторы Next элемент

Встретив оператор For Each...Next, Visual Basic:

1. Считает элемент именем первого элемента в группе (если группа не пуста).

2. Выполняет операторы.

3. Проверяет, не последний ли это элемент в группе, и, если да, завершает цикл.

4. Подставляет вместо элемента имя следующего элемента в группе.

5. Повторяет операции, описанные в пп. 2-4.

В следующем примере для Microsoft Excel мы проверяем каждую ячейку текущего региона для ячейки А1 в таблице с именем “Sheet3” и закрашиваем содержимое ячейки красным цветом, если ее значение меньше -1.

For Each с In Worksheets("Sheet3").Range("A1").CurrentRegion.Cells If c.Value < -1 Then c.Font.ColorIndex = 3 Next c

Применяя оператор For Each...Next, помните о следующих ограничениях:

  • в случае наборов элементом может быть переменная типа Variant, Object или конкретного объектного типа из библиотеки объектов, а для массивов — только Variant;

  • оператор For Each...Next не годится для массивов пользовательских типов, так как в переменную типа Variant нельзя записать значение пользовательского типа.