Единственным обязательным параметром метода Add является значение добавляемого элемента. Элемент может быть константой или переменной любого типа, кроме типа, определенного пользователем. При добавлении элемента можно указать ключ, который будет однозначно идентифицировать элемент в коллекции. Ключ – это любое значение типа Variant.
По умолчанию новые элементы добавляются в конец коллекции. Для изменения порядка добавления элементов используются параметры Добавить_перед и Добавить_после, с помощью которых указывается номер или ключ того элемента, перед которым или после которого нужно вставить новый элемент. Нумерация элементов в коллекции начинается с единицы.
Ниже приведены примеры инструкций, добавляющих новые элементы в коллекцию:
col.Add "Value1", "Key1"
col.Add "Value2", "Key2"
col.Add "Value0","Key1"
Количество элементов в коллекции
Для определения количества элементов в коллекции используется свойство только для чтения Count. При его получении возвращается значение типа Long. Пример получения количества элементов коллекции приведен ниже:
lngCount = col.Count
Удаление элементов из коллекции
Для удаления элементов из коллекции используется метод Remove:
Ссылка. Remove Номер
Единственным параметром метода Remove является номер элемента в коллекции или его ключ. Например, для удаления значения "Value2", добавленного в коллекцию при рассмотрении метода Add, можно использовать инструкцию
col.Remove 3
или
col.Remove "Кеу2"
Доступ к элементам коллекций
Для получения значений элементов коллекции используется метод Item, который возвращает значение соответствующего элементу типа:
Ссылка. Item (Номер)
Единственным параметром метода I tern является Номер – это ключ элемента или его порядковый номер в коллекции. Например, для получения значения элемента с ключом "Keyl" (или номером 2) можно использовать следующие инструкции:
val = col.Item("Key1")
val = col.Item(2)
Следует отметить, что Item является для объекта Collection методом по умолчанию, поэтому значения элемента с ключом "Key 1" можно получать и таким образом:
val = col("Key1")
val = col(2)
Определяемые пользователем типы данных
Язык VBA предоставляет программисту достаточно большие возможности для создания и использования специфических типов данных: структур и перечислений.
Структуры
Структура – это сложный тип данных, представляющий собой совокупность переменных, хранящихся и обрабатываемых совместно. Переменные, входящие в состав структуры, называются полями (членами) структуры. В состав структуры могут входить переменные как стандартных, так и определенных пользователем типов данных.
Использование структур в программах зачастую позволяет уменьшить объем и сложность алгоритмов работы с данными. Например, для хранения большого количества записей с именами, адресами и телефонами потребовались бы три массива. При использовании же структуры с полями для имени, адреса и телефона для хранения всей информации потребуется всего один массив (VBA позволяет создавать массивы структур).
Описание структур
Для описания структуры в программе на VBA в блок деклараций модуля необходимо поместить следующую конструкцию:
[Public | Private] Type Имя_структуры
Поле1
Поле2
…
ПолеN
End Type
Ключевые слова Public и Private задают область видимости структуры (по умолчанию используется Public):
• Publiс – применяется для описания структуры, которую можно использовать (объявлять переменные этого типа) во всех модулях проекта; недопустимо в модулях класса;
• Private – применяется для описания структуры, которую можно использовать только в том модуле, где эта структура описана.
После ключевого слова Туре следует имя описываемой структуры. Внутри блока Type-End Туре помещаются объявления переменных-членов структуры. Эти объявления аналогичны объявлениям обычных переменных и отличаются только отсутствием в начале ключевых слов Dim, Static, Private или Public и тем, что в одной строке можно объявлять только одну переменную.
Пусть некоторой компании необходимо хранить данные об имени, фамилии, адресе, телефоне и дате рождения своих сотрудников. Совместно с этими данными нужно хранить информацию о проекте, в котором принимает участие каждый сотрудник. Ниже представлено описание структур, с помощью которых можно реализовать хранение требуемых данных.
Type ПроектИнформация
Название As String
Срок_завершения As Date
End Type
Type Сотрудник
Имя As String
Фамилия As String
Адрес As String
Телефон As String
Дата_рождения As Date
Проект As ПроектИнформация
End Type
Далее на этом примере рассмотрим особенности работы со структурами в программах на VBA.
Объявление переменных, содержащих структуры
Объявления переменных, содержащих структуры, выглядят точно так же, как объявления переменных другого типа. Ниже приведен пример объявления одной переменной, содержащей структуру Сотрудник:
Dim worker As Сотрудник
VBA позволяет создавать массивы любых типов данных, в том числе и структур:
Dim workers (15) As Сотрудник
В данном случае будет создан массив из 15 структур типа Сотрудник.
Примечание
При объявлении переменных, содержащих структуры, происходит автоматическая инициализация всех полей созданных структур.
Доступ к полям структур
Для доступа к содержимому полей структуры необходимо использовать символ "." (точка). Ниже приведен пример получения значений полей с именем и телефоном сотрудника:
strFirstName = worker.Имя
strPhone = worker.Телефон
При доступе к массиву структур получение значений полей будет выглядеть следующим образом:
strFirstName = workers(15). Имя
strPhone = workers(15). Телефон
Получить значения полей вложенной структуры можно следующим образом (Проект – вложенная структура):
strName = worker.Проект. Название
datDate = worker.Проект. Срок_завершения
При работе со структурами необходимо помнить, что каждое поле структуры – это переменная, которой можно присваивать значение. Ниже приведен пример заполнения структуры с информацией о сотруднике:
worker.Имя = "Иван"
worker.Фамилия = "Иванов"
worker.Адрес = "ул. Первомайская, д. 100, кв. 5"
worker.Телефон = "(095) 200 00 00"
worker.Дата_рождения = "12.03.1978"
worker.Проект. Название = "План здания"
worker.Проект. Срок_завершения = "15.09.2005"
Содержимое полей структур можно использовать в любых корректных выражениях, например:
strFullName = "Имя: " & worker.Имя & ", фамилия: " & worker.Фамилия
При использовании заполненной чуть выше структуры (с информацией о сотруднике Иванове) строка strFullName в результате обработки выражения получит значение" Имя: Иван, фамилия: Иванов".
Перечисления
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
Инструкции выбора
Язык VBA поддерживает инструкции, позволяющие осуществлять различные действия в зависимости от выполнения или невыполнения заданных условий, – инструкции выбора If-Then-Else и Select.