Об объектах и коллекциях
Если вы полностью изучили первую часть этой главы, то должны иметь представление о VBA и знать основные методы управления модулями VBA в редакторе Visual Basic. Кроме того, вы ознакомились с примерами кода VBA, а в предыдущих разделах уже встречались с такими элементами, как объекты и свойства. В этом разделе приводится дополнительная информация об объектах и коллекциях объектов.
Работая с кодом VBA, вы должны четко понимать назначение объектов и объектной модели Excel. Целесообразнее рассматривать объекты с точки зрения иерархической структуры.
На вершине объектной модели находятся объект Application — в данном случае. Excel. Но если вы программируете в VBA, запуская VBE в Microsoft Word, то объектом Application будет выступать Word.
Иерархия объектов
Объект Application (то есть Excel) содержит другие объекты. Ниже приведено несколько примеров объектов, которые находятся в объекте Application:
Workbooks (коллекция всех объектов Workbook —рабочих книг);
Windows (коллекция всех объектов Window — окон);
Addlns (коллекция всех объектов Addln — надстроек).
Некоторые объекты могут содержать другие объекты. Например, коллекция Workbooks состоит из всех открытых объектов Workbook, а объект Workbook включает другие объекты, некоторые из которых представлены ниже:
Worksheets (коллекция объектов Worksheet — рабочих листов);
Charts (коллекция объектов Chart —диаграмм);
Names (коллекция объектов Name — имен).
Каждый из этих объектов, в свою очередь, может содержать другие объекты. Коллекция Worksheets состоит из всех объектов Worksheet рабочей книги Workbook. Объект Worksheet включает другие объекты, среди которых следующие:
ChartObjects (коллекция объектов. ChartQb ject — элементов диаграмм);
Range — диапазон;
PageSetup — параметры страницы;
PivotTables (коллекция объектов PivotTable — сводных таблиц).
Может быть, вы пока не готовы правильно воспринять подобную концепцию, но со временем наверняка поймете, что иерархия объектов вполне логична и хорошо структурирована. Кстати, вся объектная модель Excel схематически изображена в электронной справочной системе.
О коллекциях
Одной из ключевых концепций в программировании на языке VBA являются коллекции. Коллекция — это группа объектов одного класса (и сама коллекция тоже является объектом). Как указывалось выше, Workbooks — это коллекция всех открытых, в данный момент объектов Workbook. Worksheets — коллекция всех объектов Worksheet, которые содержится в конкретном объекте Workbook. Вы можете одновременно управлять целой коллекцией объектов или отдельным объектом этой коллекции. Чтобы сослаться на один объект из коллекции, введите название или номер объекта в скобках после названия коллекции: Worksheets ("Лист1")
Если лист Лист1 — это первый рабочий лист в коллекции, то можно использовать следующую ссылку.
Worksheets (1)
На второй лист в рабочей книге Workbook ссылаются как на Worksheets (2) и т.д.
Кроме того, существует коллекция с названием Sheets, состоящая из всех листов рабочей книги, рабочих листов и листов диаграмм. Если Лист1 — первый лист в книге, то на него можно сослаться так:
Sheets (1)
Ссылки на объекты
Если вы ссылаетесь на объект в VBA, для обращения к нему вводятся названия всех расположенных выше в иерархической структуре объектов, разделенных точкой. Что делать, если в Excel открыты две рабочих книги, и в обеих имеется рабочий лист с названием Лист1? В этом случае в ссылке упоминается контейнер требуемого объекта: Workbooks ("Книга1"). Worksheets ("Лиет1"}
Без указания рабочей книги редактор Visual Basic искал бы лист Лист1 в активной рабочей книге.
Чтобы сослаться на определенный диапазон (например, ячейку А1) на рабочем листе с названием Лист1 в рабочей книге Книга1, можно использовать следующее выражение:
Workbooks(" Книга 1").Worksheets(" Лист 1").Range("Al")
Полная ссылка из предыдущего примера включает объект Application и выглядит таким образом:
Application.Workbooks(" Книга 1").Worksheets(" Лист 1").Range(“Al”)
Однако в большинстве случаев можно опускать объект Application в ссылках (кроме него использоваться больше нечему). Если объект Книга1 — это активная рабочая книга, то опустите ссылку на нее и запишите рассматриваемое выражение следующим образом:
Worksheets ("Лист1"). Range (" Al ")
Если Лист1 является активным рабочим листом, можно еще более упростить выражение:
Range (" Al ")
Свойства и методы
Запутаться в свойствах и методах несложно: их существует несколько тысяч. В этом разделе показано, как осуществляется доступ к свойствам и методам объектов.
Свойства объектов
Все объекты обладают свойствами. Например, объект Range обладает свойством с названием Value. Вы можете создать оператор VBA, чтобы отобразить свойство Value или задать свойству Value определенное значение. Ниже приведена процедура, использующая функцию VBA MsgBox для отображения окна, в котором представлено значение ячейки А1 листа Лист1 активной рабочей книги.
Sub ShowValue()
MsgBox Worksheets("Лист1").Range("Al").Value
End Sub
Код предыдущего примера отображает текущее значение свойства Value для конкретной ячейки — А1 рабочего листа Лист1 активной рабочей книги. Обратите внимание, что если в активной книге отсутствует лист с названием Лист1, то макрос выдаст ошибку.
MsgBox— полезная функция, часто используемая для отображения результатов выполнения операторов VBA. В этой книге она применяется очень часто.
Что необходимо сделать, чтобы изменить свойство Value? Ниже приведена процедура по изменению значения ячейки А1 путем определения значения свойства Value.
Sub ChangeValue((
Worksheets("Лист1").Range("Al").Value = 123
End Sub
После выполнения этой процедуры ячейка Al листа Лист1 получает значение 123. Вы можете ввести описанные процедуры в модуль и протестировать их.
Многие объекты имеют свойство по умолчанию. Для объекта Range свойством по
умолчанию является Value. Следовательно,
выражение. value
в приведенном выше коде можно опустить, и ничего не изменится. Однако лучше включать ссылку на свойство, даже если оно используется по умолчанию.
Методы объектов
Кроме свойств, объекты характеризуются методами. Метод — это действие, которое выполняется над объектом. Ниже приведен простой пример использования метода clear по отношению к диапазону ячеек. После выполнения этой процедуры ячейки А1: СЗ листа Лист1 станут пустыми, и дополнительное форматирование ячеек будет удалено.
Sub ZapRange()
Worksheets("Лист1").Range("Al:СЗ").Clear
End Sub
Если необходимо удалить значения в диапазоне, но оставить форматирование, используйте метод ClearContents объекта Range.
Многие методы получают аргументы, определяющие выполняемые над объектом действия более детально. Далее приводится пример, в котором ячейка А1 копируется в ячейку В 1 с помощью метода Сору объекта Range - В данном примере метод Сору получает один аргумент (адрес ячейки, в которую следует скопировать данные). Обратите внимание, что в примере используется символ продолжения строки (пробел и подчеркивание). Вы можете не применять этого символа, а ввести оператор в одну строку.
Sub CopyOne()
Worksheets ("Лист1").Range("Al").Copy _
Worksheets("Лист 1 ").Range ("B1")
End Sub
Определение аргументов методов и свойств
В среде программистов VBA определение аргументов методов и свойств часто вызывает определенные трудности. Некоторые методы используют аргументы для дальнейшего уточнения действия; отдельные свойства используют аргументы для дальнейшего определения значения свойства. Иногда один или несколько аргументов вообще применять не обязательно.
Если метод использует аргументы, они указываются после названия метода и разделяются запятыми. Если метод использует необязательные аргументы, то можете пропустить их, оставив пустые места. Рассмотрим метод protect объекта рабочей книги. В справочной системе дается информация о том, что метод Protect имеет три аргумента: пароль, структура, окна. Эти аргументы соответствуют параметрам в диалоговом окне Защита книги.
К примеру, если требуется защитить рабочую книгу под названием MyBook. xls, используйте такой оператор:
Workbooks("MyBook.xls").Protect "xyzzy", True, False
В данном случае рабочая книга защищена паролем (аргумент 1). Также защищена структура рабочей книги (аргумент 2), но не ее окна (аргумент 3).
Если вы не хотите присваивать пароль, можно применить такой оператор:
Workbooks("MyBook.xls").Protect, True, False
Обратите внимание, что первый аргумент пропущен, а его место обозначено с помощью запятой.
Существует и другой подход (причем в этом случае программу удобнее будет читать) — использование именованных аргументов. Применим именованные аргументы для предыдущего примера.
Workbooks("MyBook.xls").Protect Structure:=True, _
Windows:=False
Использование именованных аргументов — хорошая идея, особенно в методах с большим количеством необязательных аргументов, когда следует использовать только некоторые из них. При использовании именованных аргументов не требуется оставлять место для пропущенных аргументов.
Для свойств, использующих аргументы, аргументы указываются в скобках. Например, свойство Address объекта Range имеет пять аргументов — все необязательные. Показанный ниже оператор некорректен, так как пропущены скобки:
MsgBox Range ("Al").Address False 'некорректно
Правильный синтакис для этого оператора выглядит так:
MsgBox Range ("Al").Address(False)
Кроме того, оператор может записываться с использованием именованного аргумента.
MsgBox Range ("Al").Address(rowAbsolute:=False)
Подобные тонкости применения методов и свойств вскоре станут для вас привычным делом,