|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
3.6 Работа с цикламиЦиклы VBA, конструкция For...Next, конструкция For Each...Next, выход из цикла по Exit For, конструкции Do While и Do Until, выход из цикла по Exit Do, конструкция While...Wend Циклы используются в ситуациях, когда нам нужно выполнить какое-либо действие несколько раз. Первая ситуация — мы знаем, сколько раз нужно выполнить какое-либо действие, в этом случае используется конструкция For…Next: For iCounter = 1 to 10 MsgBox "Счетчик: " & iCounter Next Чтобы указать, насколько должно прирастать значение счетчика, используется ключевое слово Step: For iCounter = 1 to 10 Step 2 MsgBox "Счетчик: " & iCounter Next Можно и уменьшать исходное значение счетчика: For iCounter = 10 to 1 Step -2 MsgBox "Счетчик: " & iCounter Next Для безусловного выхода из конструкции For…Next используется команда Exit For. VStop = InputBox (“Введите значение останова”) VInput = CInt(VStop) For iCounter = 1 to 10 MsgBox "Счетчик: " & iCounter If iCounter =VInput Then Exit For Next Очень часто в VBA требуется сделать какое-нибудь действие со всеми элементам коллекции или массива — перебрать все открытые документы, все листы Excel, все ячейки в определенном диапазоне и т.п. Для того, чтобы пройти циклом по всем элементам коллекции, используется команда For Each … Next: For Each oWbk in Workbooks MsgBox oWbk.Name Next При использовании этого приема можно очень просто найти и получить ссылку на нужный нам объект: For Each oWbk in Workbooks If oWbk.Name = "Сводка.xls" Then Set oMyWorkBook = oWbk Exit For End If Next В этом случае мы проходим циклом по всем элементам коллекции Workbooks (то есть открытым рабочим книгам в Excel), для каждой книги проверяем ее имя, и если мы нашли книгу с именем Сводка.xls, то мы получаем на нее ссылку и выходим из цикла. Коллекция рабочих книг — это специальная коллекция, которая умеет производить поиск в себе по имени элементов, поэтому в принципе можно было обойтись такой строкой: Set oMyWorkBook = Workbooks("Сводка.xls") Но для многих других коллекций без конструкции For Each не обойтись. Еще одна ситуация — когда мы не знаем точно, сколько раз должна быть выполнена та или другая команда — это зависит от какого-либо условия. Используются конструкции Do While…Loop и Do Until…Loop. Конструкция Do While означает: выполнять какое-либо действие до тех пор, пока условие истинно: Do While MyVar < 10 MyVar = MyVar + 1 MsgBox “ MyVar = “ & MyVar Loop Применений на практике — множество: пройти по всему набору записей, пока они не закончатся, требовать от пользователя ввести подходящее значение, пока не он наконец не введет его и т.п. Внимание! Если вы случайно запустили в своей программе бесконечный цикл, нажмите на клавиши <Ctrl>+<Break>. Откроется окно, аналогичное представленному на рис. 3.1, в котором вы сможете продолжить выполнение, завершить его или открыть ваш код в отладчике.
Рис. 3.1 Выполнение макроса остановлено по <Ctrl>+<Break> Второй вариант — Do Until. Все выглядит точно так же, за одним исключением: цикл будет выполняться до тех пор, пока условие ложно. Do Until MyVar >= 10 MyVar = MyVar + 1 MsgBox “ MyVar = “ & MyVar Loop Можно переписать цикл так, чтобы условие проверялось после завершения цикла: Do MyVar = MyVar + 1 WScript.Echo “MyVar = “ & MyVar Loop While MyVar < 10 В этом случае цикл будет выполнен по крайней мере один раз. Немедленный выход из цикла можно произвести по команде Exit Do. В VBA имеется также конструкция While … Wend. Это — еще один вариант цикла, который оставлен для обратной совместимости с первыми версиями Visual Basic. Функциональные возможности — те же, что и у конструкции Do…While: While My Var < 10 MyVar = MyVar + 1 WScript.Echo “MyVar = “ & MyVar Wend
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||