VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
objМузыкаДжаз.Воспроизведение
В основном техника вызова методов вполне согласуется с техникой вызова процедур и функций VBA, о которой шла речь в главе 7.
* Чтобы вызвать метод, требующий ввода аргумента, напечатайте аргумент после имени метода. В следующем примере метод Воспроизведение получает аргумент, говорящий о том, сколько раз нужно воспроизвести пьесу:
objМузыкаДжаз.Воспроизведение3
* Если метод имеет несколько аргументов, печатайте их через запятую (в следующем примере предполагается, что Негромко является именованной константой, задающей невысокий уровень громкости, a intCкopocть - переменной, определяющей скорость воспроизведения):
objМузыкаДжаз.Воспроизведение 2, Негромко, intCкopocть
* Чтобы вызвать метод, возвращающий значение, присвойте метод переменной или используйте его в выражении как обычную процедуру типа Function. В этом случае все аргументы, независимо от их числа, необходимо заключить в скобки:
dateВремяВоспроизведения = _
objМузыкаДжаз.Воспроизведение(2, Негроко,intCкopocть)
Как и в случае свойств, методы совершенно разных классов объектов могут иметь одинаковые имена. Например, объекты, содержащие группы элементов или других объектов, как правило, имеют метод Add.
Обратите внимание, что метод меняет установки одного или нескольких свойств. Например, объект objМузыкаДжаз может иметь свойство только для чтения ЧислоИсполнений, допускающее изменение только методом Воспроизведение, но его значение в то же время можно выяснить оператором типа intИсполнения = objМузыкаДжаз.ЧислоИсполнений. Некоторые объекты имеют методы, единственное назначение которых - установка значений определенных свойств.
События
Событие представляет собой нечто, случающееся с объектом, и на что объект может ответить заранее предусмотренным действием. К событиям можно отнести следующее.
* Физические действия пользователя программы, например щелчок кнопкой мыши, перемещение курсора, прыжки и пляски вокруг компьютера. (Ну, ладно-ладно, прыжки и пляски вокруг компьютера, очевидно, не относятся к событиям, распознаваемым VBA.)
* Ситуации, в которые попадает объект в ходе выполнения программы. Например, если речь идет об объекте, представляющем документ, то к событиям можно отнести открытие и закрытие документа, добавление и удаление страниц (такие события в Word распознаются объектами Application и Document ). В Visio объекты Pages могут отвечать на девять различных событий, среди которых BeforeShapeDelete (Перед удалением графического элемента) и TextChanged (Изменение текста). Другие примеры таких не связанных с формами событий вы найдете в главе 4.
То, какие события данный объект может распознавать, определяете не вы, а ваше VBA-приложение. К вашим задачам относится создание программного кода, определяющего, что должен делать объект в ответ на распознаваемое событие. Здесь следует обратить внимание на такой момент: вам не нужно вызывать процедуру обработки события из программного кода- при наступлении соответствующего события объект автоматически предпримет запрограммированные вами действия.
Программирование процедур обработки событий для форм рассматривается в главе 10. Те же самые приемы, в основном, применяются и в случае не связанных с формами событий, правда, тут существуют некоторые тонкости, варьирующие от приложения к приложению, а иногда даже в рамках одного приложения. Исчерпывающая информация по этому вопросу должна содержаться в справочной документации вашего приложения или в файлах его справки.
Идентификация объекта для использования
Вы должны сообщить VBA, какой именно объект нужен. Для этого используется объектное выражение- VBA-выражение специального вида, которым однозначно определяется конкретный объект для использования. То остающееся за кулисами значение, которое VBA вычисляет на основе объектного выражения, является ссылкой на объект (вы можете представлять себе такое значение как почтовый адрес, по которому проживает объект).
Если при работе с объектами объектное выражение составлено правильно - цель практически достигнута. После этого можно значительно упростить себе жизнь, создав для объекта переменную и присвоив этой переменной ссылку на объект, используя построенное объектное выражение. С этого момента в программном коде можно ссылаться на объект просто по имени переменной.
Понимание объектных выражений
Объектное выражение представляет собой фрагмент программного кода – выражение, "указывающее" на конкретный объект. С помощью правильно построенного объектного выражения можно изменять свойства объекта, вызывать его методы или присвоить объект переменной.
Обсуждаемые здесь приемы исключительно важны для практического программирования с использованием VBA, хотя сразу понять их не очень просто. Из-за того что в программе могут использоваться много объектов одновременно, полное объектное выражение должно включать все объекты, содержащие нужный вам объект. Попробую пояснить это следующим образом. Предположим, вас просят отправиться и найти "того парня". Вы сразу же спросите: "Какого еще того?"' А вот если бы вас попросили найти самого старшего школьника, живущего в доме №3 по улице Цветочной в городе Шепетовка, Украина, то вам не пришлось бы задавать такой вопрос. (Правда. вы бы тогда, наверное, спросили "Зачем?'") Конечно, если вы уже находитесь в доме №3 по улице Цветочной, и в том доме живет только один школьник, то команда типа "покормить мальчишку" будет вполне адекватной. Точно так же, когда контекст ясен, и VBA не требует полного списка объектов.
Свойство одного объекта может тоже оказаться объектом. Объекты сосуществуют в иерархии, когда один объект (например, документ) служит контейнером для других, подчиненных ему объектов (страниц, рабочих листов или чего-то другого).
Связь между двумя этими идеями очевидна: если объект содержит подчиненные объекты, то любой подчиненный объект можно идентифицировать посредством свойства первого объекта. Выражение, которое используется для указания нужного свойства, является объектным выражением.
Например, рассмотрим следующее выражение, идентифицирующее конкретный объект в документе Word;
ThisDocument.Sections(2).Range
В этом выражении не одна, а две точки. Посмотрите, Range является свойством объекта Section, который, в свою очередь, является свойством объекта ThisDocument. Возможно, чтобы понять идею, вам этого примера уже достаточно, но если нет, то в следующем разделе вы найдете более подробные объяснения.
В большинстве объектных моделей VBA объект Application (Приложение) находится на самой вершине иерархии. Однако обычно не возникает необходимости включать этот объект в выражения - VBA соображает достаточно неплохо для того, чтобы понять, что вы работаете с объектами текущего приложения, если вы специально не указываете иного.
Объект Application содержит объект Documents - коллекция, представляющая все открытые документы. Если вам нужно работать с конкретным документом, необходимо идентифицировать его среди членов этого объекта-коллекции Documents. Например.
Documents(5) представляет объект Document № 5 в коллекции Documents.
В примере объектного выражения вы, однако, видите ключевое слово ThisDocument. Во многих VBA-приложениях ThisDocument используется для обозначения объекта Document, ассоциированного с вашим проектом.
В Word каждый объект Document имеет свойство Sections, которое ссылается на коллекцию Sections, - объект, представляющий множество всех разделов документа. Поэтому первая часть указанного выше выражения - ThisDocument.Sections -идентифицирует конкретную коллекцию Sections, принадлежащую объекту ThisDocument. Идентифицировав объект Sections, вы получаете возможность выбрать конкретный член этой коллекции. Таким образом, Sections (2 ) ссылается на второй раздел документа.
Теперь о завершающей части выражения. Тонкость здесь заключается в том, что хотя .Range идентифицирует свойство объекта Section, значением этого свойства является объект Range. Таким образом, все выражение обеспечивает ссылку на этот объект Range.
Использование выражения, подобным образом прокладывающего путь к конкретному объекту сквозь дебри иерархии объектов, в профессиональной фразеологии VBA называется "получением объекта".
В рассмотренном выше примере объектного выражения
ThisDocument.Sections(2).Range
объект Sections представляет собой коллекцию. В VBA коллекцией называется объект специального типа, который может содержать любое число других объектов.
Определенные в VBA-приложениях коллекции обычно содержат объекты одного типа. Например, коллекции Sections в Word содержат только объекты Section, а коллекции Pages в Visio могут принадлежать только объекты Page. (Правда, VBA предлагает и родовой объект Collection, в котором вы можете разместить объекты любых типов. О том, как создавать и использовать свои собственные коллекции такого рода, говорится в главе 13.)