Электронная библиотека » Алексей Гладкий » » онлайн чтение - страница 3

Текст книги "Excel. Трюки и эффекты"


  • Текст добавлен: 22 ноября 2013, 19:01


Автор книги: Алексей Гладкий


Жанр: Программы, Компьютеры


сообщить о неприемлемом содержимом

Текущая страница: 3 (всего у книги 22 страниц) [доступный отрывок для чтения: 6 страниц]

Шрифт:
- 100% +
Доступ к элементам массива

Для доступа к элементам массива в VBA используется указание номера этого элемента в круглых скобках после идентификатора переменной массива. При этом номера измерений массива разделяются запятыми. Например (для одномерного и трехмерного массивов):

intNum = aintValues(16)

intNum = aintValues(12, 32, 3)

Использование переменной Variant при работе с массивами

Язык VBA поддерживает универсальный тип данных Variant, которому находится применение и при работе с массивами. Переменной этого типа можно присваивать массив. В результате этой операции в переменной Variant формируется копия массива. Далее с такой переменной можно работать либо как с обычной переменной, либо как с массивом (использовать доступ к элементам), например:

Dim aintValues(1 To 3) As Integer

Dim varArray

' Присвоение массива переменной типа Variant

varArray = aintValues

' Доступ к элементам массива

varArray(1) = 1

varArray(2) = 2

varArray(3) = 3

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

Для определения того, содержит ли переменная типа Variant массив, можно использовать функцию IsArray, имеющую следующий формат:

IsArray(Переменная)

Данная функция возвращает значение типа Boolean: True – если в переменной с именем Переменная содержится массив, и False – в противном случае.

Использование функции Array для заполнения массива

В VBA имеется возможность быстрого заполнения массива значениями. Эта возможность реализована в функции Array. Ее формат такой:

Array(Список_элементов)

В качестве аргументов функция принимает список значений, разделенных запятой. Возвращает она заполненный заданными значениями массив, сохраненный в переменной типа Variant. Ниже приведен пример использования функции Array:

Dim varArray

' Заполнение массива значениями

varArray = Array(1, 2, 3, 4, 5)

Коллекции

Коллекции (они же семейства и множества) – это объекты, которые позволяют хранить произвольное количество элементов любого типа. Элементы в коллекции идентифицируются уникальным ключом, которым может быть не только номер элемента в коллекции, но и значение строкового или другого типа. При программировании на VBA различные коллекции используются очень часто. Например, к коллекции Workbooks нужно обращаться для получения ссылки на объект Workbook нужной рабочей книги, к коллекции Worksheets – для получения ссылки на объект Worksheet нужного рабочего листа и т. д.

В VBA коллекции реализованы во встроенном классе Collection. Создание объекта Collection ничем не отличается от создания объекта другого типа:

Dim col As New Collection

или

Dim col As Collection

Set col = New Collection

Добавление элементов

Для добавления элементов в коллекции реализован метод Add, имеющий следующий формат:

Ссылка. Add Элемент [, Ключ][, Добавить_перед][, Добавить_после]

Единственным обязательным параметром метода 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.

Инструкция If-Then-Else

Инструкция VBA If-Then-Else предоставляет возможность выбора одного из действий в зависимости от значений заданных логических выражений. Формат данной инструкции следующий:

If Выражение1 Then

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

[ElseIf Выражение2 Then

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

[ElseIf ВыражениеN Then

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

[Else

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

End If

Здесь Выражение1 – ВыражениеN – логические выражения. Если какое-либо из них истинно, то выполняются инструкции, находящиеся после соответствующего ключевого слова If или Elself. Если ни одно из выражений не является истинным, то выполняются инструкции, записанные после ключевого слова Else (если, конечно, это ключевое слово используется).

Рассмотрим пример использования инструкции If-Then-Else:

If intAction = 1 Then

' Выполнение сложения

res = a + b

ElseIf intAction = 2 Then

' Выполнение вычитания

res = a – b

ElseIf intAction = 3 Then

' Выполнение умножения

res = a * b

Else

' Заданное действие не поддерживается

'…

End If

В приведенном примере с помощью инструкции If-Then-Else выбирается одно из трех поддерживаемых действий для переменных а и Ь: сложение, вычитание или умножение. Действие, которое необходимо выполнять, определяется по содержимому переменной intAction. Если она имеет значение, отличное от 1, 2 и 3, то выполняются инструкции, следующие непосредственно после ключевого слова Else.

Язык программирования VBA также поддерживает упрощенный вариант инструкции If-Then-Else:

If Выражение Then [Инструкции1] [Else Инструкции2]

Здесь Выражение – это логическое выражение, при истинном значении которого выполняются инструкции после ключевого слова Then. Если Выражение не истинно, то выполняются инструкции после ключевого слова Else (если это ключевое слово используется). При использовании этой формы инструкции If-Then-Else следует учитывать, что она записывается в одну строку (или в несколько строк, но с использованием символа подчеркивания). Также необходимо учитывать, что Инструкции и Инструкции1 представляют собой либо одну инструкцию VBA, либо несколько инструкций, разделенных двоеточием.

Если ключевое слово Else используется, то элемент Инструкции1 может отсутствовать.

Ниже приведены несколько примеров использования сокращенного варианта инструкции If-Then-Else:

If a = 1 Then a = 2 Else a = 1

If a = 1 Then a = 2 Else a = 1: b = b + 1

If a = 1 And b = 0 Then Else a = 1: b = b + 1

Инструкция Select Case

Select Case позволяет, подобно инструкции If-Then-Else, делать выбор выполняемых программой действий в зависимости от значения заданного аргумента. При большом количестве альтернатив данная инструкция работает быстрее инструкции If-Then-Else, так как значение проверяемого выражения вычисляется только один раз. Формат инструкции Select Case приведен ниже:

Select Case Проверяемое_выражение

[Case Список_выражений

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

[Case Else

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

End Select

Здесь Проверяемое_выражение – это любое численное или строковое выражение. Список_выражений содержит неограниченное количество выражений, диапазонов значений и условий. Для более детального пояснения ниже приведен формат элемента Список_выражений:

Выражение | Мин_значение To Макс_значение | Is Оператор Выражение _

[, Выражение | Мин_значение To Макс_значение | Is Оператор Выражение]…

Значения элементов приведенной конструкции следующие.

 Выражение – это любое численное или строковое выражение (тип элемента Выражение должен соответствовать типу элемента Проверяемое_выражение).

 Мин_значение То Макс_значение – используется для задания диапазона значений. Элементы Мин_значение и Макс_значение задают минимальное и максимальное значения диапазона соответственно.

• Is Оператор Выражение – используется для задания условий. Позволяет использовать в инструкции Select Case операторы сравнения. Элемент Оператор – это любой оператор сравнения VBA, кроме Is и Like. Элемент Выражение – это любое выражение, тип которого соответствует типу элемента Проверяемое_выражение.

При соответствии значения элемента Проверяемое_выражение одному из заданных выражений, при попадании значения этого элемента в один из диапазонов или при выполнении одного из заданных условий происходит выполнение инструкций, записанных после соответствующего ключевого слова Case. Если ни одна Case-конструкция не сработала, то выполняются инструкции после сочетания ключевых слов Case Else.

Допустим, что в программе необходимо проверять значение численной переменной intTestValue и выполнять одни действия, когда эта переменная имеет значение 1, 2, 3 или 5, и другие действия – в противном случае. Приведенный ниже фрагмент программы позволяет решить поставленную задачу:

Select Case intTestValue

Case 1 To 3, 5

' Действия при значении переменной intTestValue,_

равном 1, 2, 3 или 5

Case Is < 1, Is > 3

' Действия при значении переменной intTestValue _

меньше 1 или больше 3

End Select

В данном примере необходимо обратить внимание на то, что значение 5 удовлетворяет обеим Case-конструкциям. При обработке инструкции Select Case VBA просматривает конструкции с ключевым словом Case в том порядке, в котором они следуют в программе. Поэтому в приведенном примере при значении переменной intTestValue, равном 5, выполняются инструкции после первого ключевого слова Case.

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

Select Case strTestValue

Case «a» To "z"

" Действия, если строка strTestValue начинается _

со строчной буквы латинского алфавита

Case «A» To "Z"

" Действия, если строка strTestValue начинается _

с прописной буквы латинского алфавита

Case Else

" Действия, если строка не начинается с символа _

латинского алфавита

End Select


Страницы книги >> Предыдущая | 1 2 3 4 5 6 | Следующая
  • 4.6 Оценок: 5

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации