Outlook application свойства и методы

Обновлено: 05.07.2024

Программа Outlook появилась в составе MS Office совсем недавно (три года назад, в версии 97), но сейчас она стала одним из наиболее часто используемых приложений этого семейства. Действительно — каждому человеку нужно работать с электронной почтой, планировать свою деятельность, вести книги контактов, делать записи в дневник и пр. В результате Outlook для многих превратился в незаменимого помощника, который всегда должен быть под рукой.

Но именно в силу ее многофункциональности и постоянного применения для этой программы особенно актуален вопрос адаптации к требованиям конкретного пользователя. Возможность настройки Outlook при помощи пользовательских форм и VBScript существовала и ранее, в версии 97 (см. статью «Создание приложений для Outlook» в КомпьютерПресс 3’98). Однако этот механизм был довольно примитивным и заметно уступал аналогичным функциям, реализованным в Word 97 или Office 97.

Фактически пользователи Outlook 97 имели лишь средства для обработки событий и полей пользовательских форм. Для создания более сложных вариантов автоматизации нужно было создавать приложение-контейнер (например, на VB), в котором требовалось указать ссылку на исполняемый компонент в MS Outlook 97 и создать объектную ссылку на Outlook.Application. Наряду с необходимостью применения дополнительного инструмента разработки такое решение использовало внепроцессную (out-of-process) модель реализации приложения, работающую существенно медленнее по сравнению с внутрипроцессной (in-process) моделью, которая реализуется на базе VBA-решения.

Далее в этой статье мы рассмотрим некоторые возможности применения Outlook 2000 для создания бизнес-приложений, включающих почтовые функции. Для этого попробуем решить следующую задачу.

Объектная модель Outlook 2000

Для создания утилиты слияния нам понадобятся объектные модели как Excel, так и Outlook. В объектной модели Excel 2000 появился целый ряд новшеств (по сравнению с Excel 97 там добавилось 11 новых объектов для работы с Web, OLAP PivotTable и OLE DB). Мы исходим из того, что вы уже знаете, как программировать объектную модель Excel и как получить доступ к одному из многочисленных источников информации по программированию с помощью Excel. В то же время Outlook 2000 претерпел существенные изменения, что требует небольших вводных пояснений.

Если у вас уже имеется опыт разработки при помощи Office, то вы знаете, что все Office-приложения помещают объект Application на самый верхний уровень своих объектных моделей. Outlook 2000 не является исключением (рис. 2). Объект Application предоставляет глобальные свойства, методы и события, которые доступны из VB-кода без каких-либо описаний переменных.

Специфика OTM-проектов в Outlook 2000

Здесь мы вспомним о том, что в общем случае приложения занимаются обработкой различных наборов данных, которые вводятся пользователем в виде открытия файлов. В офисных приложениях такие файлы называются документами. Если программа использует внутреннюю среду программирования, то у нее появляется второй тип загружаемых файлов — с программным кодом. Эта ситуация была нами показана на примере создания приложения с интеграцией в него VBA («Интеграция VBA в бизнес-приложения независимых разработчиков», КомпьютерПресс 3’2000, на CD-ROM). Там мы могли отдельно загружать документы для редактирования текста (RTF-файлы) в среде редактора и отдельно в среде VBA загружать VBA-проекты, содержащие макрокоманды.

В отличие от других офисных приложений Outlook работает с фиксированной базой данных, которая хранит создаваемую (или получаемую в виде писем) пользователем информацию. Кроме того, некоторым аналогом вводимых документов являются PST-файлы — пользовательские папки (индивидуальные базы данных). Однако эти файлы, в отличие от Word и Excel, не содержат VBA-кода.

На сегодняшний день Outlook не поддерживает возможность гибкой загрузки того или иного VBA-проекта (как, например, это делается в Word с помощью загрузки различных шаблонов: глобальных, присоединенных или загружаемых в виде документа). Сейчас он может работать только с одним глобальным VBA-проектом, который имеет фиксированное имя VbaProject.OTM и должен обязательно храниться в каталоге …\Windows\Application Data\Microsoft\Outlook. Обратите внимание (рис. 4), что команда File|Save в среде Outlook/VBA автоматически производит запись файла с указанным именем в этом каталоге. Команда Save As вообще не доступна. Тут можно провести такую аналогию — представьте, что Word может работать только с одним шаблоном по имени Normal.

Таким образом, если вы хотите работать с разными VBA-проектами в Outlook, то вам нужно перед запуском приложения переименовать нужный проект в VbaProject.OTM. Чтобы сменить проект, нужно перезагрузить Outlook, сделав при этом соответствующее переименование.

Пользовательские настройки меню и панели инструментов Outlook 2000 хранятся в файле …\Windows\Application Data\Microsoft\Outlook\Outcmd.dat. Мы определили это экспериментальным путем, так как не нашли такой информации в документации. Таким образом, для переноса пользовательского кода и настроек нужно копировать два файла VbaProject.OTM и Outlook.dat (а может быть, лучше полностью каталог …\Windows\Application Data\Microsoft\Outlook\).

Изменим имя текущего проекта VBAProject (Проект 1), щелкнув правой кнопкой мыши на его значке в окне Project Explorer и выбрав команду меню VBAProject Properties (Проект 1 Properties). В результате этих действий на экран выведется диалоговое окно, в котором можно изменить имя проекта (рис. 6). Назовем его EmailMergeProject. Еще раз подчеркнем, что данное название никак не связано с именем файла, в котором проект будет сохраняться, — этот файл будет неизменно носить имя \Windows\Application Data\Microsoft\Outlook\VbaProject.OTM.

Прежде чем продолжить, выполним еще одну операцию. Для эффективной работы с объектной моделью Excel внутри VBA-кода в Outlook необходимо добавить ссылку к библиотеке объектов Excel. Это повышает быстродействие VBA-кода, а также увеличивает производительность разработчика. Кроме того, данная библиотека позволит вам воспользоваться функциями IntelliSense при работе с объектной моделью Excel. Для этого выберите команду References из меню Tools, поставьте галочку в строке Microsoft Excel 9.0 Object Library в диалоговом окне References, а затем щелкните OK (рис. 7).

Теперь добавим новую форму UserForm к нашему проекту EmailMergeProject. Для этого вызовем команду UserForm из меню Insert (более подробно о свойствах этой формы см. врезку «Microsoft Forms 2.0»). Далее необходимо разместить на ней элементы управления (текстовые поля, метки и кнопки), чтобы у нас получилась форма, показанная на рис. 8. В табл. 2 приведены значения свойств визуальных компонентов, которые нужно установить. Используйте метки lblState, чтобы информировать пользователя о том, на каком этапе ввода данных он находится. Поля текста txtWorkbook и txtDataRange служат только для вывода информации. Поэтому запретим любые нажатия клавиш в этих полях, установив KeyKode = 0 в событии KeyDown для обоих полей, и тем самым заставим пользователей работать только с помощью командных кнопок «Открыть» и «Выбрать».

Форма frmEmailMerge представляет собой интерфейс пользователя в нашем приложении. Она основывается на классе clsEmailMerge, в котором сосредоточена вся информация и базовые функции. Создадим этот класс до того, как приступить к написанию кода для формы.

Некоторые сведения относятся к предварительной версии продукта, в которую перед выпуском могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Представляет приложение Outlook целиком.

Комментарии

Это единственный объект в иерархии, который может быть возвращен с помощью CreateObject(String) метода или встроенной функции Visual Basic GetObject .

Объект приложения Outlook имеет несколько целей:

При использовании автоматизации для управления Microsoft Outlook из другого приложения используйте метод CreateObject для создания объекта приложения Outlook.

Свойства

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Возвращает Application объект, представляющий родительское приложение Outlook для объекта. Только для чтения.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Возвращает OlObjectClass константу, указывающую класс объекта. Только для чтения.

Возвращает коллекцию COMAddIns , которая представляет все загруженные в Microsoft Outlook надстройки модели компонентных объектов (com).

Возвращает объект Explorers Collection, который содержит Explorer объекты, представляющие все открытые проводника. Только для чтения.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Возвращает объект Inspectors Collection, который содержит Inspector объекты, представляющие все открытые инспекторы. Только для чтения.

Возвращает родительский объект указанного объекта. Только для чтения.

Возвращает PickerDialog объект, который предоставляет функциональные возможности для выбора людей или данных в диалоговом окне. Только для чтения.

Возвращает Reminders коллекцию, которая представляет все текущие напоминания. Только для чтения.

Возвращает NameSpace объект для текущего сеанса. Только для чтения.

Возвращает TimeZones коллекцию, представляющую набор часовых поясов, поддерживаемых в Outlook. Только для чтения.

Методы

Возвращает самый верхний Explorer объект на рабочем столе.

Возвращает самый верхний Inspector объект на рабочем столе.

Возвращает объект, представляющий самое верхнее окно Microsoft Outlook на рабочем столе: Explorer Inspector объект или объект.

Выполняет поиск, основанный на указанной строке поиска DAV и поиске (DASL).

Копирует файл из указанного места в магазин Microsoft Outlook.

Создает и возвращает новый элемент Microsoft Outlook.

Создает новый элемент Microsoft Outlook из шаблона Outlook (oft) и возвращает новый элемент.

Создает объект автоматизации указанного класса.

Возвращает NameSpace объект указанного типа.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Создает строго или слабую ссылку на объект для указанного объекта Outlook.

Обновляет кэш, получая текущее определение из реестра Windows для одной или всех областей формы, определенных для локального компьютера и текущего пользователя.

События

Возникает при выполнении Stop() метода Search указанного объекта.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Возникает перед отображением диалогового окна совместного использования для Folder выбранного объекта.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Возникает при загрузке элемента Outlook в память.

Возникает после входа пользователя в систему.

Возникает каждый раз, когда пользователь нажимает кнопку "параметры надстройки" на вкладке "надстройки" диалогового окна "Параметры" Outlook.

Происходит, когда Outlook начинает закрываться.

Происходит непосредственно перед отображением напоминания.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Происходит при запуске Microsoft Outlook, но после загрузки всех программ надстроек.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Этот объект, элемент или перечисление устарели и не предназначены для использования в коде.

Объектная модель Microsoft Outlook реализована в виде набора объектов, собранных в библиотеке Outlook.

Объекты приложения Outlook

В табл. 21.3 приведено описание основных объектов из объектной модели Outlook.

Таблица 21.3. Основные объекты Outlook

В табл. 21.4—21.6 представлено описание основных свойств, методов и событий объекта Application.

Объект Inspector (форма элемента)

Рис. 21.1. Объект Inspector (форма элемента)

Свойство Описание
Session ClassВозвращает объект Namespace для текущего сеанса. Сеанс (session) — это период времени, в течение которого пользователь работает с Outlook
ParentВозвращает константу из перечисления QlObjectClass для указанного объекта. Это целочисленное значение, идентифицирующее класс объекта
VersionВозвращает родительский объект для указанного объекта Возвращает или задает номер версии

Таблица 21.4. Основные свойства объекта Application

Метод Назначение
ActiveExplorerВозвращает головной объект Explorer
Active Inspect orВозвращает головной объект Inspector
ActiveWindowВозвращает объект, представляющий главное окно
CreateltemСоздает новый элемент Outlook и возвращает его приложения
GetName SpaceВозвращает объект NameSpace указанного типа
QuitЗакрывает приложение

Таблица 21.5. Основные методы объекта Application

Таблица 21.6. События объекта Application

Объекты MAPIFolderv и Mailltem

Поскольку в примерах этой главы и следующей используются свойства и методы объектов MAPIFolder и Mailltem, мы сочли необходимым привести их краткое описание.

Объект MAPiFoider, как было сказано выше, представляет папку Outlook. Объект MAPiFoider может содержать другие MApiFoider-объекты. В этом случае вы можете управлять доступом к вложенным папкам посредством комбинации Folder (индекс), где индекс возвращает объект MAPiFoider.

В табл. 21.7 приведены основные свойства объекта MAPiFoider, а в табл. 21.8 — его методы.

Таблица 21.7. Свойства объекта MAPiFolder

Метод Назначение
СоруТоКопирует текущую папку (полностью) в указанную папку. Возвращает MAPiFolder объект, представляющий новую копию
DeleteУдаляет объект из семейства папок
DisplayОтображает новый объект Explorer для папки
MoveToПеремещает папку в указанную папку

Таблица 21.8. Методы объекта MAPiFolder

Sub openLastMail () Dim oa As Outlook.Application

Dim ns As NameSpace ; Dim fl As MAPiFolder Dim ob As Object Dim it As Mailitem

Dim i As integer

Set oa = CreateObject("OutLook.Application") Set ns = oa.GetNamespace("MAPI") Set fl = ns.GetDefaultFolder(olFolderlnbox) For i = 1 To f1.Items.Count Set ob = fl.Items(i) On Error GoTo nextitem If ob.MessageClass = "IPM.Note" Then Set it = ob If it.ReceivedTime > Date - 1 Then

it.Display (False) End If End If nextitem:

Замечание

Для семейств Outlook нельзя воспользоваться оператором For Each Next, поэтому применяется цикл For . . . Count.

В Office 97 на смену системам Microsoft Schedule+ и Exchange пришел новый персональный информационный менеджер (ПИМ) - Outlook, который объединяет в себе электронную почту, календарь, список контактов и менеджер заданий (рис.1). И хотя в текущую версию Outlook не встроен VBA, он содержит расширенную объектную модель, используемую любым Automation-контроллером. Тем не менее научиться работать с этой моделью - задача не из простых, так как документация по программированию Outlook встречается довольно редко. Чтобы восполнить этот пробел, рассмотрим примеры по созданию полезных Outlook-приложений с использованием Visual Basic.

Модель Outlook имеет очень большие размеры, однако здесь, как и в VB, действует правило 80/20, то есть около 80 процентов кода Outlook-приложения использует около 20 процентов его объектной модели. Полная диаграмма объектной модели Outlook 97 приводится в руководстве Microsoft Office 97 Object Model Guide, а здесь вы познакомитесь только с некоторыми из ее свойств и методов.

Прежде чем мы приступим к программированию Outlook, запустим файл справки VBAOUTL.HLP, хранящийся в каталоге Office. Он содержит одну-единственную тему "Installing Visual Basic Help for Microsoft Outlook". Что же там находится? Файл справки, в котором говорится, что вам нужен другой файл справки с тем же именем! Таким образом, если вы даже установили полную версию Office, то все, что вы получаете, - это файл размером 19 Кбайт, адресующий вас к каталогу ValuPack\MoreHelp на компакт-диске Office. Там спрятан настоящий файл справки Outlook VBA, имеющий более солидный размер - 365 Кбайт. Скопируем все файлы VBAOUTL.* в каталог Office. Теперь у нас есть VBA-справка для Outlook - и это хорошо. Гораздо хуже то, что данная справка состоит только из ссылки на объектную модель Outlook без какого бы то ни было содержательного описания и конкретных примеров использования - есть только несколько фрагментов кода.

Самый главный объект Outlook, обеспечивающий доступ к другим иерархическим объектам Информационного менеджера, - Application. Его необходимо создавать каждый раз при написании нового Outlook-приложения. GetNameSpace и CreateItem - наиболее важные методы этого объекта. При отправке почты используется первый из них, а при составлении письма, задания, памятки или ввода информации для контакта или встречи - второй.

Пример 1. Вывод имени пользователя

Для вывода на экран текущего имени пользователя откройте меню Project, выберите команду References и отметьте Microsoft Outlook 8.0 Object Library. Поместите на форму командную кнопку и в событии Click введите следующий код, служащий иллюстрацией объекта Application и его метода GetNameSpace:

Вызов CreateObject("Outlook.Application") возвращает объект типа Application, метод GetNameSpace которого возвращает объект NameSpace. Сейчас вы всегда передаете методу GetNameSpace одну и ту же строку, "MAPI", но в будущем, вероятно, Outlook сможет поддерживать другие почтовые протоколы. Объект NameSpace вам понадобится для использования почтовых функций Outlook. Например, свойство Folders представляет собой коллекцию коллекций - список всех папок Outlook и вложенных в них других папок, включая те, что созданы вами. Свойство CurrentUser объекта NameSpace имеет тип Recipient и обладает своими собственными интересными свойствами. Среди них есть свойство Name, которое возвращает имя, выводимое на экран в нашем примере. Это удобно для создания приложений, которые автоматически читают имя пользователя.

Как всегда, сначала необходимо создать объекты Application и NameSpace. Новый объект в этом примере - MailItem, который создается с помощью вызова Application.CreateItem. Здесь необходимо помнить, что метод MailItem.Send устанавливает элемент данных (item) равным Nothing, поэтому каждый раз при отправлении письма необходимо выполнять Application.CreateItem.

Пример 3. Утилита для просмотра содержимого папки Contacts

Шаг 1. Создание пользовательского интерфейса

Запустите VB5 и выберите Standard EXE. Нарисуйте на форме элемент управления TextBox, а над ним - Label. Выделите оба элемента управления, скопируйте их в буфер обмена и затем четырежды поместите их на форму как массив элементов управления. Созданные таким образом элементы управления будут использоваться для вывода полей из папки Contacts. Применение массива элементов управления очень удобно при работе с формами ввода, поскольку они совместно используют одни и те же процедуры событий. Чтобы написать код, реагирующий на изменения во всех элементах управления, вам понадобится только одна процедура.

Добавьте вертикальную линейку прокрутки на правой стороне формы, а внизу разместите командную кнопку, свойство Caption которой замените на "Сохранить" и имя - на butSave (рис. 3).

Шаг 2. Просмотр содержимого папки Contacts

Вначале зададим переменные, которые будут использоваться в любом событии формы для ссылки на папку Contacts:

Первая строка определяет переменную ol как объект Application, занимающий самую верхнюю позицию в иерархии объектов Outlook. Из этого объекта вы можете ссылаться на любой другой объект внутри Outlook. Ключевое слово New открывает Outlook и создает экземпляр объекта Application при первом использовании переменной ol. Если опустить это ключевое слово, нужно будет воспользоваться операторами Set и CreateObject, как это делалось в приведенных выше примерах. Переменная ContactFolder представляет собой объект MAPIFolder, а переменная IsDirty используется в том случае, когда пользователь делает какие-либо изменения в поле формы.

И хотя данный код запускает программу Outlook (если она еще не была запущена), имеет смысл самостоятельно запустить ее из Windows Desktop. Это должно ускорить процесс отладки, так как вам не нужно будет ждать запуска Outlook каждый раз при тестировании своего приложения.

Теперь дважды щелкнем на нашей форме, чтобы добавить код в событие Form_Load. Мы должны установить связь с папкой Contacts внутри Outlook. Используем метод GetNameSpace объекта Application для связи со стандартным профилем MAPI. Когда вы передаете константу olFolderContacts в качестве аргумента в метод GetDefaultFolder, вы открываете папку Contacts. Затем установим свойство Max вертикальной линейки прокрутки равным количеству элементов (контактов) в папке Contacts. И наконец, зададим свойство Value этого же элемента управления равным 1 - тем самым мы выводим на экран первый контакт:

Пользователь перемещается от контакта к контакту, щелкая на линейке прокрутки. Такие действия изменяют значение элемента управления, которое всегда остается в интервале от 1 до максимального количества контактов. Благодаря этому вы можете использовать данное значение в качестве прямой ссылки к коллекции элементов (контактов) в папке Contacts. В событии Change линейки прокрутки напишем код для вызова процедуры LoadContact, передающей текущее значение элемента управления Scrollbar. Здесь необходимо обратить внимание на то, что с точки зрения простоты кода всегда лучше отделять процедуры загрузки и сохранения от процедур событий для формы. Таким образом, вам будет легче вызывать их из другой процедуры своего приложения:

Процедура LoadContact очень проста. Вы можете сделать ее еще более удобной для пользователя, если выведете текущий номер контакта в свойстве Caption для формы. В операторе With мы используем коллекцию Items папки Contacts, чтобы установить свойство Text каждого элемента управления TextBox равным одному из полей элемента (контакта):

Как уже говорилось выше, мы выбрали именно эти пять полей, так как они не всегда корректно импортируются из других приложений. Вы можете легко модифицировать данный код, использовав другие поля или добавив дополнительные элементы управления TextBox к своей форме.

Теперь проверим работу нашего приложения. Нажмите F5, и первый контакт должен появиться на экране.

Шаг 3. Внесение изменений и их сохранение

Хотя наше приложение уже можно использовать для просмотра контактов, было бы неплохо, если бы мы могли проводить какие-либо изменения, а потом сохранять их. Вначале добавим код к событию Change массива элементов управления TextBox для установки флажка IsDirty, который отражает изменения в любом из полей. Здесь мы на практике можем ощутить преимущество использования массива элементов управления - для установки флажка требуется всего одна строка кода:

Дважды щелкнем кнопку "Сохранить" и введем следующий код для вызова процедуры SaveContact:

Скопируем код из процедуры LoadContact и изменим его следующим образом, чтобы установить свойства полей для элементов (контактов) внутри коллекции Items переменной ContactFolder. После того, как вы задали все поля, используйте метод Save для записи модифицированных полей в папку Contacts. Не забудьте установить переменную IsDirty равной False (Ложь) после того, как сохраните изменения:

Теперь запустите свое приложение, измените что-нибудь в данных о контактах и щелкните кнопку "Сохранить". Прокрутите вперед, а затем назад записи из папки Contacts, и вы должны увидеть обновленные данные.

Шаг 4. Форматирование имен

Таким образом, с помощью нашего приложения мы хорошо справляемся с изменением одного контакта. Но что делать, если таких контактов у нас сотни и мы хотим внести изменения во все? Например, в папке Contacts поле FullName заполнено правильно, а вот поле FirstName в некоторых случаях содержит как FirstName, так и LastName. При этом поле LastName остается пустым. Попробуем провести анализ поля FullName и заполнить поля FirstName и LastName. Кроме того, сформируем поле FileAs как LastName, FirstName плюс поле Company, если оно заполнено.

Добавим к нашей форме еще одну командную кнопку и установим для нее свойство Caption равным "Автонастройка", а свойство Name - butAuto. Дважды щелкнем на этой кнопке и введем код, позволяющий использовать встроенную в VB функцию Instr. С ее помощью мы сможем определить, есть ли пробел в поле FirstName, и не является ли поле LastName пустым:

Для заполнения полей FirstName и LastName вызовем функцию ParseName (листинг 1). После этого можно заполнить поля FullName и FileAs:

Теперь, если вы вдруг обнаружите, что какой-либо контакт заполнен неверно, мы можете щелкнуть кнопку "Автонастройка" для автоматического заполнения полей, а затем щелкнуть кнопку "Сохранить".

Таким образом, написав менее 50 строчек кода, мы создали утилиту, имеющую доступ к данным внутри Office-приложения. Теперь, после того как у вас появилось работоспособная программа, может быть, вы подумаете о том, чтобы добавить к ней и другие полезные функции.

Читайте также: