Книга Excel 2007. Трюки и эффекты онлайн - страница 8



Перечисления

VBA позволяет определять целочисленные типы данных с ограниченным количеством значений – перечисления. Каждому значению перечисления соответствует идентификатор.

Использование перечислений, во-первых, позволяет оградить программиста от ошибок (не нужно знать значения элементов перечислений), а во-вторых, может повысить читаемость программного кода, так как вместо малоинформативных значений типа 167353b программе используются идентификаторы типа Actions ave. Использование перечислений также избавляет от необходимости создания глобальных целочисленных констант, которые используются только как значения параметров функций и процедур.

Описание перечислений

Для описания перечисления в блок деклараций модуля необходимо поместить следующую конструкцию:

[Public | Private] Enum Имя_перечисления

Идентификатор1 [= Значение1]

Идентификатор2 [= Значение2]

Идентификатор1 [= ЗначениеN]

End Enum

Ключевые слова Public и Private задают область видимости перечисления точно так же, как для структуры (см. выше).

После ключевого слова Enum следует имя описываемого перечисления. Внутри блока Enum—End Enum задаются идентификаторы значений перечисления и, если нужно, сами значения, которые сопоставляются с идентификаторами.

Если значение элемента перечисления явно не указывается, то оно автоматически формируется следующим образом:

• если элемент перечисления первый, то тогда ему присваивается нулевое значение;

• если элемент не первый, то его значение равняется значению предыдущего элемента, увеличенному на единицу.

Ниже приведен пример описания перечисления:

Enum MyEnum

value1

value2 = 100

value3

End Enum

В приведенном примере создается перечисление, содержащее три идентификатора и значения. При этом с идентификаторами значения сопоставлены следующим образом: value1 имеет значение 0, value2 – значение 100, a value3 – 101.

Использование перечислений

Объявление переменных для перечислений ничем не отличается от объявления переменных других типов. Ниже приведены примеры объявления переменной и массива переменных для перечисления MyEnum:

Dim EnumValue As MyEnum

Dim EnumValues(255) As MyEnum

Таким переменным можно присваивать любые численные значения, но можно (и даже нужно) использовать идентификаторы этих значений. Например:

EnumValue = value1

EnumValues(100) = value3

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

If EnumValue = value2 Then…

Здесь значением выражения EnumValue = value2 является True, если EnumValue имеет значение value2 (или 100), и False – в противном случае.

Управление выполнением программы

Язык VBA поддерживает ряд способов управления порядком выполнения инструкций программы в пределах функции или процедуры: инструкции безусловного и условного перехода, циклы. Большое количество этих инструкций и наличие различных вариантов обеспечивают максимально эффективное и удобное их использование при написании программ.

Циклы

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

VBA поддерживает четыре вида циклов: обычный цикл For-Next, цикл For Each-Next для просмотра элементов массивов и коллекций, циклы While-Wend и Do-Loop. Циклы различных видов могут быть вложены друг в друга. Рассмотрим подробно каждый из приведенных циклов.

Цикл For-Next

Цикл For-Next в VBA является самым простым и очень часто используемым. Формат данного цикла следующий:

For Счетчик = Начальное_значение To Конечное_значение [Step Шаг]

[Инструкции]

[Exit For]

[Инструкции]

Next [Счетчик]

Здесь Счетчик – это переменная-итератор любого численного типа. Началъное_значение, Конечное_значение, Шаг – численные значения или идентификаторы переменных численного типа. После ключевого слова Next можно (но не обязательно) указывать идентификатор итератора цикла, конец тела которого обозначает данное ключевое слово. Указывать идентификатор переменной-итератора после Next особенно удобно при организации сложных вложенных циклов.

В начале выполнения цикла итератору присваивается значение элемента Начальное_значение. Инструкции, записанные в теле цикла, выполняются до тех пор, пока значение итератора не превзойдет значение элемента Конечное_значение (станет больше или меньше его в зависимости от направления изменения итератора). Шаг и направление изменения итератора (увеличение или уменьшение) задаются элементом Шаг. Если шаг изменения итератора равен единице, то данный элемент можно опустить.

Для преждевременного выхода из цикла предусмотрена инструкция Exit For. При ее встрече в теле цикла выполнение программы переходит на следующую инструкцию после ключевого слова Next.

Ниже приведен пример трех вложенных циклов For-Next, итераторами которых являются целочисленные переменные i, j и к:

For i = 10 To 1 Step -1

For j = 1 To 20

For k = 10 To -10 Step -2

' Выполнение каких-то действий

Next k

Next j

Next i

Цикл For Each-Next

Цикл For Each-Next используется для просмотра всех элементов массива или коллекции. Формат данного цикла следующий:

For Each Элемент In Контейнер

[Инструкции]

[Exit For]

[Инструкции]

Next [Элемент]

Здесь Элемент – это идентификатор переменной-итератора, а Контейнер – идентификатор массива или коллекции. Для цикла For Each-Next допустимый тип итератора зависит от того, просматривается массив или коллекция. При просмотре массива итератор должен иметь тип Variant. При просмотре коллекции итератор может иметь тип Variant или быть ссылкой на объект.

После ключевого слова Next можно (но не обязательно) указывать идентификатор итератора цикла, конец тела которого обозначает данное ключевое слово.

Чтобы преждевременно выйти из цикла, можно использовать такую же инструкцию Exit For, как и для цикла For-Next.

Ниже приведен пример использования цикла For Each-Next для просмотра массива astrStrings:

For Each varItem In astrStrings

' Выполнение каких-то действий над элементом varItem

Next

Цикл While-Wend

While-Wend являeтcя самым простым циклом, с помощью которого можно осуществлять определенные действия до тех пор, пока выполняется заданное условие. Формат данного цикла следующий:

While Условие

[Инструкции]

Wend

Инструкции в теле цикла While-Wend выполняются до тех пор, пока логическое выражение Условие имеет значение True (значение этого выражения вычисляется при каждой итерации).

Ниже приведен пример организации цикла While-Wend:

While i < 100

' Действия в цикле

i = i + 3

Wend

Следует отметить, что цикл While-Wend является значительно упрощенным и ограниченным с точки зрения разнообразности способов его использования.

Цикл Do-Loop

Цикл Do-Loop предоставляет гораздо больше возможностей при организации циклических действий с проверкой логического условия, чем цикл While-Wend. Проверка логического условия окончания цикла может происходить в начале каждой итерации цикла, при этом формат цикла следующий:

Do [While | Until Условие]

[Инструкции]

[Exit Do]

[Инструкции]

Loop

Проверка условия может также происходить в конце каждой итерации цикла (тогда выполняется как минимум одна итерация цикла):

Do

[Инструкции]

[Exit Do]

[Инструкции]

Loop [While | Until Условие]

В приведенных форматах Условие – любое логическое выражение. При использовании ключевого слова While цикл выполняется до тех пор, пока Условие имеет значение True, а при использовании ключевого слова Until – пока Условие имеет значение False. Для выхода из цикла предусмотрена инструкция Exit Do.

Ниже приведен пример использования цикла Do-Loop:

Do While i < 100

i = i + 1

Do

j = j + 5

' Действия

Loop Until j > 200

Loop



Помоги Ридли!
Мы вкладываем душу в Ридли. Спасибо, что вы с нами! Расскажите о нас друзьям, чтобы они могли присоединиться к нашей дружной семье книголюбов.
Зарегистрируйтесь, и вы сможете:
Получать персональные рекомендации книг
Создать собственную виртуальную библиотеку
Следить за тем, что читают Ваши друзья
Данное действие доступно только для зарегистрированных пользователей Регистрация Войти на сайт