Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 2:

Начнем с объектов Office 2000

События объектов Application

У объекта Access.Application событий нет. Все события вынесены на более низкий уровень иерархии и возникают при работе с документами Access - отчетами, формами и т.д.

Объекты Application приложений Word, Excel и Power Point имеют примерно одинаковый набор событий. Фактически эти события возникают при работе с объектами нижних уровней иерархии - окнами, документами Word, рабочими книгами и страницами ( Sheets ) Excel, презентациями и слайдами Power Point. Всякий раз, когда окно или тот или иной документ создается, открывается, изменяется, закрывается, - возникает соответствующее событие, которое можно обработать. Обработчик события можно связывать непосредственно с самим объектом, при работе с которым событие возникло. Но иногда удобнее вынести обработчик на верхний уровень приложения и связать его с объектом Application. Это особенно полезно, если один и тот же обработчик применяется ко всем документам приложения.

Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание

Мы уже не раз говорили, что эффективность работы в среде Office 2000 во многом определяется возможностью совместной работы его приложений. С программистской точки зрения это означает, что в документе одновременно определены несколько объектов Application, задающих совместно работающие приложения. Давайте рассмотрим, как обеспечивается такая возможность. При открытии какого - либо из приложений, например, документа Word по умолчанию считается определенным соответствующий объект Application, а следовательно и все объекты, в него вложенные. Более того, определены и все объекты, входящие в каркас документа, построенный по умолчанию.

Если мы хотим обеспечить совместную работу приложений, например, Word, Excel и Access, то можно начинать работу с открытия документа любого из этих приложений, и тогда корневой объект Application этого приложения будет доступен автоматически. Остальные объекты Application необходимо подключить к уже открытому документу. Пусть для определенности мы открыли документ Word и хотим подключить Excel и Access. Вот, что для этого нужно сделать:

  • Расширить каркас документа Word, установив ссылки на библиотеки, содержащие приложения Excel и Access . Напомним, что это делается в редакторе VBE в окне References меню Tools.
  • Объявить объекты (указатели на объекты) соответствующего класса.
  • Создать объекты и связать указатели с вновь созданными объектами.

Когда корневой объект Application создан и доступен, то автоматически становятся доступными все вложенные в него объекты, так что теперь с приложением можно работать в обычном режиме, вызывая свойства и методы его объектов. При объявлении объектов возможны варианты. При этом следует помнить, что объекты в VBA задаются с помощью указателей. Рассмотрим три возможных варианта объявления:

  1. Dim MyXlApp As Object, MyAcApp As Object Этот вариант задает так называемое позднее связывание. На этапе объявления известно, что MyApp переменные являются объектами, а точнее, указателями на объекты, но еще не известно с объектами какого класса они будут связаны. Это станет известно динамически, в ходе выполнения программы, когда реально будет создан объект - экземпляр соответствующего класса и наш указатель получит на него ссылку. Для программиста эти переменные являются нетипизированными указателями.
  2. Dim MyXlApp As Excel.Application, MyAcApp As Access.Application Это объявление задает раннее связывание. Наши переменные теперь представляют собой типизированные указатели. И уже на этапе объявления известно, что в дальнейшем они будут связаны с объектами соответствующего класса. Чтобы при этом объявлении не возникло конфликтов, конечно же, необходимо предварительно подключить соответствующую библиотеку. Важно также понимать, что на этапе объявления память выделена только указателям. Сами объекты еще не созданы, и потому значения указателей не определены. Объекты еще предстоит создать по ходу выполнения программы и указатели должны быть связаны с ними.
  3. Dim MyXlApp As New Excel.Application, MyAcApp As New Access.Application В этом случае раннее связывание реализуется в полном объеме. Создается указатель, благодаря спецификатору New создается сам объект, и указатель получает ссылку на вновь созданный объект.

Эти три варианта характерны не только при работе с объектами Application, а во всех случаях работы с объектами. Конечно же, в большинстве случаев предпочтительнее третья конструкция, когда создание объекта и указателя совмещаются в одном операторе. В Office 2000 такая конструкция является допустимой для объектов Application и ее разумно использовать.

Заметьте, что не все приложения допускают конструкцию New для создания Active X объектов, каковыми являются объекты Application. В ряде случаев для создания Active X объектов, хранящихся в отдельных файлах, следует использовать метод CreateObject, первый параметр которого задает имя класса объекта. Этот метод следует выполнить в нужный момент, связав заодно указатель с вновь созданным объектом. Конечно, и в Office 2000 допустимо создать объекты Application следующим образом:

Set MyXlApp = CreateObject("Excel.Application ")
Set MyAcApp = CreateObject("Access.Application ")

Теперь еще несколько общих слов о раннем и позднем связывании. Раннее связывание предпочтительнее по двум важным причинам: оно обеспечивает более быструю работу приложения и интеллектуальную поддержку при работе с объектом. Последнее означает, что появляется список доступных свойств и методов, как только ставится точка после имени объекта. При позднем связывании такая поддержка отсутствует, так как класс объекта не известен на этапе трансляции до начала выполнения программы. Следует заметить, что VBA не является чисто интерпретируемым языком. На этапе трансляции до выполнения программы проверяется наличие ошибок в программе, проводится распределение памяти и обеспечивается интеллектуальная поддержка объявленным переменным.

В заключение рассмотрим пример, иллюстрирующий работу трех приложений: Word, Excel и Access:

Public Sub WorkWithExcel()
'НЕ забудьте включить ссылку на Excel в меню References
 'Объявление и создание объектов Excel.Application
        Dim MyXlApp As New Excel.Application
    'Работа с приложением Excel
    With MyXlApp
            .Visible = True
        'Excel появился на линейке и его можно раскрыть
         'Добавить новую книгу
       .Workbooks.Add
            'Теперь можно работать и с ячейками данной книги
            .Range("A1") = "Hello!"
            'Идет работа с книгой
            .Range("B1") = "By-By"
        .Workbooks(1).Activate
         'Закрываем открытую книгу
         MsgBox ("Закрываем рабочую книгу Excel?")
        .Workbooks(1).Close
        'Будет задан вопрос о необходимости сохранения книги
         'Закрываем приложение
     .Quit
    End With
End Sub

Public Sub WorkWithAccess()
'НЕ забудьте включить ссылку на Access и Dao 3.6 в меню References
'Приложение Access и его компоненты:
'База данных, форма и путь к базе
Dim MyAc As New Access.Application
Dim MFDb As Database
Dim FormPoetAges As Form
Dim PathDb As String
'Открываем базу данных Access
    PathDb = "E:\O2000\CD2000\Ch1\AgeOfPoet.mdb"
    MyAc.OpenCurrentDatabase (PathDb)
    Set MFDb = MyAc.CurrentDb
'Открываем форму
	MyAc.DoCmd.OpenForm ("AgeOfPoets")
	Set FormPoetAges = MyAc.Forms("AgeOfPoets")
	MyAc.Visible = True
	FormPoetAges.SetFocus

'Закрываем базу данных
	MsgBox ("Закрываем базу данных Access?")
	MyAc.Quit
End Sub
1.2.

Макросы WorkWithExcel и WorkWithAccess могут быть вызваны из приложения Word. В наших тестовых примерах мы вызывали их в ответ на щелчок соответствующих командных кнопок. Заметьте, второй пример довольно содержателен. Здесь показано, как, не выходя из документа Word, просматривать и редактировать данные формы, созданной в приложении Access для работы с базой данных.

На этом мы прервем знакомство с корневыми объектами Application. Помните, явно или неявно они всегда будут присутствовать в наших примерах.

Коллекции в Office 2000

Почти половина классов объектов в Office 2000 являются коллекциями. Это объясняется тем, что элементы большинства классов можно объединить в упорядоченную совокупность, получив тем самым новый класс - коллекцию элементов. Коллекция это способ организации динамической структуры данных, и потому методы коллекций во многом схожи между собой. Но поскольку специфика элементов различна, то, как следствие, коллекции имеют и специальные свойства и методы. В современных языках программирования коллекции становятся столь же употребительной частью языка, как массивы. Рассмотрим некоторые коллекции объектов Office 2000 и те вариации, которыми они отличаются друг от друга.

Коллекции объектов Office 2000

Мы уже говорили, что коллекцию можно рассматривать, как структуру данных, способ их организации. При таком подходе свойства и методы коллекции определяют эту структуру и не учитывают специфику объектов, составляющих коллекцию. Этот подход характерен для класса Collection языка VBA. В других приложениях Office 2000 преобладает несколько иная точка зрения: здесь для большинства коллекций учитываются особенности их объектов, что находит отражение в появлении специфических свойств и методов у различных коллекций. Сейчас мы подробно рассмотрим некоторые коллекции объектов Office 2000. Выбранные для ознакомления коллекции интересны сами по себе, ввиду их широкого использования. С другой стороны, нам важно дать общее представление о возможных вариациях при организации специальных коллекций. Надеемся, приведенных примеров будет достаточно для ориентации во всех имеющихся классах коллекций.

Коллекции Excel: Workbooks, Sheets

"Excel позволяет одновременно работать с одной или несколькими рабочими книгами. Каждая книга состоит из одного или более листов. Листы бывают разных типов: рабочие листы, диаграммы, модули, листы макросов. Один из наиболее употребительных - рабочий лист - состоит из совокупности ячеек. Мощь Excel во многом определяется операциями, которые можно выполнить над ячейками рабочего листа…"

Примерно так можно было бы начать описание Excel. Мы начали его с введения основных понятий. При объектном подходе каждому понятию ставится в соответствие класс объектов. В терминах классов и объектов это же описание Excel может выглядеть так:

"Объект Application. Excel, представляющий приложение Excel, имеет свойство-участник (встроенный объект) WorkBooks, возвращающее объект WorkBooks - коллекцию всех открытых рабочих книг. Каждый элемент коллекции - рабочая книга - является объектом класса WorkBook.

Объект WorkBook, представляющий одну рабочую книгу, имеет свойство Sheets. При обращении к этому свойству возвращается объект Sheets - коллекция листов данной книги. Каждый элемент коллекции - лист - имеет свой тип и потому является объектом, например, класса Worksheet (рабочий лист) или Chart (диаграмма).

Объект Worksheet, представляющий один рабочий лист, имеет свойство Cells, возвращающее объект Range. Используя этот объект, можно задавать как все ячейки рабочего листа - всю таблицу, так и любую ее часть…"

Как видите, при объектном подходе к изучению Excel мы начинаем с введения классов объектов и заметьте, коллекции появляются уже на первых шагах. Коллекции WorkBooks, Worksheets представляют центральные понятия Excel. С них мы и начнем подробное рассмотрение коллекций объектов Office 2000.

Коллекция Workbooks

Коллекция WorkBooks представляет все открытые книги приложения Excel. Рассмотрим свойства и методы этой коллекции. Как обычно, начнем с методов, позволяющих добавить элемент в коллекцию, удалить его и получить к нему доступ.

Одна из специфических черт элементов этой коллекции состоит в том, что большинство рабочих книг существуют до появления коллекции. Они хранятся во внешней памяти, как файлы, обычно с расширением .xls. Поэтому для добавления элементов в коллекцию применяются два различных метода: Add и Open. Первый добавляет новую, пустую книгу в коллекцию, второй - уже существующую книгу, хранящуюся во внешней памяти.

Синтаксис метода Add таков:

Add(Template)

Необязательный параметр Template задает шаблон создания книги. Этот параметр может быть строкой, задающей имя файла, который хранит некую рабочую книгу. В этом случае книга играет роль шаблона для создания новой книги. Параметр Template может также принимать значение одной из предопределенных констант: xlWBATChart, xlWBATWorksheet, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet. В этом случае создается рабочая книга с одним листом, тип которого и задает константа. Если же параметр Template опущен, то создается книга с несколькими пустыми листами, число которых устанавливает свойство SheetsInNewWorkbook.

У метода Open более десяти параметров. Обязательным является только первый - FileName. Он должен быть строкой, которая задает имя файла, хранящего книгу.

Чтобы удалить рабочую книгу из коллекции, нужно закрыть соответствующий файл (в коллекцию входят лишь открытые рабочие книги). Закрытие книги и, следовательно, ее удаление выполняет метод Close. Он определен как для коллекции, так и для рабочей книги - объекта класса WorkBook. В первом случае метод Close не имеет параметров и закрывает всю коллекцию - все рабочие книги. Чаще всего этот метод вызывается объектом - рабочей книгой для своего закрытия. В этом случае его синтаксис:

Close(SaveChanges, FileName, RouteWorkbook)

Все параметры являются необязательными. Первый - булевого типа: если его значение True, сделанные изменения будут сохранены, в противном случае они не сохраняются. Когда же этот параметр опускается, то при выполнении появляется соответствующее диалоговое окно, в котором свой выбор может сделать пользователь. Второй параметр - FileName - необходим, если речь идет о закрытии новой книги, с которой еще не связано имя файла. Если параметр опущен, а указание имени файла необходимо, то, естественно, появляется диалоговое окно. Третий параметр, как и первый, булевого типа. Он задается, когда рабочая книга может быть направлена нескольким участникам для поочередной работы с ней. Если его значение True, книга направляется следующему по списку ее разработчику.

Чтобы получить доступ к рабочей книге в коллекции, можно воспользоваться методом Item:

Item(Index)

Индекс может указывать порядковый номер книги в коллекции, либо быть именем книги. Заметьте, имя книги это имя файла, в котором она хранится. Когда создается новая пустая книга, то ей по умолчанию система присваивает имя типа " BookN ". При сохранении книги в файле это имя может быть изменено. Метод Item является методом по умолчанию и чаще всего опускается. В этом случае индекс связывается с самим объектом - коллекцией рабочих книг.

Свойство Count возвращает количество элементов коллекции. Доступно только для чтения, имеет тип возвращаемого значения Long.

Помимо перечисленных методов и свойств, позволяющих добавлять, удалять, получать доступ и определять количество элементов, WorkBooks -коллекция имеет некоторые дополнительные возможности:

  • Свойство Application возвращает корневой объект Application.
  • Свойство Creator аналогично свойству Application. Оно возвращает код приложения (32-битное целое), который используется при работе с Macintosh.
  • Свойство Parent возвращает родительский объект (для коллекции WorkBooks это все тот же объект Application ).
  • Метод OpenText является модификацией метода Open. Он создает новую рабочую книгу с одной страницей, используя для ее создания текстовый файл. В процессе открытия происходит анализ и разбор данных, записанных в текстовом файле. Метод имеет 13 параметров, из которых обязателен лишь первый - FileName, задающий имя текстового файла.

Приведем теперь пример программы, позволяющий продемонстрировать детали работы с коллекцией WorkBooks. Наша коллекция будет включать как новые, создаваемые в программе, так и ранее существовавшие книги. Книги будут добавляться в коллекцию и удаляться. Отладочная печать позволит проследить за этим процессом.

Public Sub WorkWithbooks()
' Работа с коллекцией книг
Dim N As Long, i As Byte
Dim PathDir As String
PathDir = "e:\O2000\CD2000\Ch1\"
With Workbooks
    N = .Count
    Debug.Print "Число рабочих книг в коллекции Workbooks " & _
    "при открытии приложения Excel = ", N
    ' Добавление 2-х новых книг
    .Add
    .Add
    'Добавление двух существующих книг
    .Open (PathDir & "BookThree.xls")
    .Open (PathDir & "BookFive.xls")
    N = .Count
    Debug.Print "Число книг после 2-х вызовов методов Add и Open =", N
    Debug.Print "Имена книг в коллекции:"
    For i = 1 To .Count
        Debug.Print .Item(i).Name
    Next
    'Закрытие двух книг и, следовательно, удаление их из коллекции
    .Item(2).Close
    .Item(3).Close
    N = .Count
    Debug.Print "Число книг после двух вызовов метода Close =", N
    Debug.Print "Имена книг, оставшихся в коллекции:"
    For i = 1 To .Count
        Debug.Print .Item(i).Name
    Next
End With

End Sub
1.3.

Вот результаты отладочной печати:

Число книг в коллекции WorkBooks при открытии приложения Excel =1 
Число книг после 2-х вызовов методов Add и Open =        5 
Имена книг в коллекции:
BookOne.xls
Book4
Book5
BookThree.xls
BookFive.xls
Число книг после двух вызовов метода Close =             3 
Имена книг, оставшихся в коллекции:
BookOne.xls
Book5
BookFive.xls

Поясним пример. При открытии Excel коллекция WorkBooks состоит из одной открытой книги, в данном случае - книги с именем BookOne. Затем метод Add добавил в коллекцию две новые книги, которые получили имена " Book1 " и " Book2 " соответственно. Еще две книги появляются в коллекции при открытии существующих книг. Затем две книги закрываются, следовательно, удаляются из коллекции. Обратите внимание, удаляются 2-я и 4-я книги коллекции, хотя индексы удаляемых книг имеют значение 2 и 3. Это связано с тем, что после каждого удаления элемента коллекции происходит перенумерация, и книги получают новые индексы.

Если при работе с элементами коллекции выполняется операция удаления, то работать с индексами элементов крайне опасно, предпочтительнее для задания элементов указывать их имена!
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.