Работа с циклами

Работа с циклами. Массивы

Константы

Константы — еще один контейнер для хранения данных, но, в отличие от переменных, они не изменяются в ходе выполнения VBA-программы. Константы используют в следующих случаях:

- код становится более читаемым, убираются потенциальные ошибки;

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

В VBA константы определяются при помощи ключевого слова Const: Const COMP_NAME As String = "Microsoft"

Главное отличие констант от переменных заключается в том, что при попытке изменить значение константы в теле процедуры будет выдано сообщение об ошибке.

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

UserForm1.BackColor = vbGreen

и

UserForm1.BackColor = 65280

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

В VBA встроено множество служебных констант: календарных, для работы с файлами, цветами, формами, типами дисков и т. п. Просмотреть их можно через справочную систему VBA: Microsoft Visual Basic Documentation | Visual Basic Language Reference | Constants. Про одну из констант (она находится в разделе Miscellaneous Constants) следует сказать особо: константа vbCrLf позволяет произвести переход на новую строку, например:

MsgBox "Первая строка" + vbCrLf + "Вторая строка"

Множество наборов констант встроено в объектные модели приложений Office.

Циклы используются в ситуациях, когда нам нужно выполнить какое-либо действие несколько раз. Первая ситуация — мы знаем, сколько раз нужно выполнить определенное действие, в этом случае используется конструкция 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...Next не обойтись.

Еще одна ситуация: когда мы не знаем точно, сколько раз должна быть выполнена та или другая команда — это зависит от какого-либо условия. В этом случае используются конструкции Do While...Loop и Do Until...Loop.

Конструкция Do While...Loop означает: выполнять какое-либо действие до тех пор, пока условие истинно:

Do While MyVar < 10

MyVar = MyVar + 1

MsgBox "MyVar = " & MyVar

Loop

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

Если вы случайно запустили в своей программе бесконечный цикл, нажмите на клавиши <Ctrl>+<Break>. Откроется окно, аналогичное представленному на рис. 3.1, в котором вы сможете продолжить выполнение (кнопка Continue), завершить его (End) или открыть ваш код в отладчике (Debug).

Рисунок 3.1 - Выполнение макроса остановлено по <Ctrl>+<Break>

Второй вариант — Do Until...Loop. Все выглядит точно так же, за одним исключением: цикл будет выполняться до тех пор, пока условие ложно.

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...Loop:

While My Var < 10

MyVar = MyVar + 1

WScript.Echo "MyVar = " & MyVar

Wend


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: