Как связать приложения Office 2000 с помощью VBA. На примере Outlook и Excel
Как связать приложения Office 2000 с помощью VBA
На примере Outlook и Excel
Специфика OTM-проектов в Outlook 2000
Создание утилиты для отправки сообщений
Создание класса для утилиты Email Merge
Не надо заново изобретать колесо
Последние усилия — отправка письма
Привязка утилиты к панели инструментов в Outlook
Тестирование утилиты EmailMerge
Листинг 1. Процедура SetState: проверка готовности данных для формирования письма
Листинг 2. Функция SendMail в модуле класса clsEmailMerge
Листинг 3. Функция ParseString для вставки текстов вместо тэгов шаблона
Программа 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 существенно расширил возможности автоматизации и настройки по сравнению с предыдущими версиями (рис. 1). Самое главное: он теперь включает полноценную среду разработки VBA, которая также входит в состав других основных приложений из пакета Microsoft Office 2000 (более подробно о новшествах Office 2000 см. в статье «MS Office 2000 для разработчиков», КомпьютерПресс 12’99). Кроме того, для настройки Outlook 2000 можно использовать и VBScript, однако по сравнению с ним VBA6 предоставляет Outlook-разработчикам намного больше преимуществ (табл. 1). Вместе с тем реализация механизма VBA, способов создания макрокоманд и подключения проектов в Outlook 2000 несколько отличается от того, как это происходит у уже хорошо знакомых нам Word и Excel (список наших статей на эту тему можно найти по адресу www.visual.2000.ru/develop/vb/compress/index.htm).
Далее в этой статье мы рассмотрим некоторые возможности применения Outlook 2000 для создания бизнес-приложений, включающих почтовые функции. Для этого попробуем решить следующую задачу.
В среде Word можно присоединить контакты, хранящиеся в Outlook. Однако Office 2000 не содержит встроенной функции слияния сообщений Outlook с информацией о контактах, находящейся в других местах, например в рабочих книгах Excel. Мы попробуем решить эту задачу с помощью средств VBA 6.0.
Объектная модель Outlook 2000
Ключ к эффективной разработке с помощью Outlook 2000 — глубокое понимание методов, свойств и событий, благодаря которым Outlook и является программируемым. Другими словами, вам необходимо знать объектную модель Outlook. Мы считаем, что наши читатели уже знакомы с синтаксисом языка VBA, и теперь нам нужно перенести эти знания в среду конкретного приложения.
Для создания утилиты слияния нам понадобятся объектные модели как Excel, так и Outlook. В объектной модели Excel 2000 появился целый ряд новшеств (по сравнению с Excel 97 там добавилось 11 новых объектов для работы с Web, OLAP PivotTable и OLE DB). Мы исходим из того, что вы уже знаете, как программировать объектную модель Excel и как получить доступ к одному из многочисленных источников информации по программированию с помощью Excel. В то же время Outlook 2000 претерпел существенные изменения, что требует небольших вводных пояснений.
Если у вас уже имеется опыт разработки при помощи Office, то вы знаете, что все Office-приложения помещают объект Application на самый верхний уровень своих объектных моделей. Outlook 2000 не является исключением (рис. 2). Объект Application предоставляет глобальные свойства, методы и события, которые доступны из VB-кода без каких-либо описаний переменных.
Другой стандарт, который используется во всех Office-приложениях, — это «горячие» клавиши для вывода VBA IDE. Просто нажмите Alt+F11 в среде Outlook, и на экране появится знакомая среда разработки VBA6. Окно Project Explorer выводит элемент VBAProject (Проект 1), содержащий элемент хост-проекта с именем ThisOutlookSession. Подобным образом VBA обрабатывает общие события приложения, такие как Startup и NewMail. В окне Project Explorer дважды щелкните на элементе ThisOutlookSession, чтобы открыть окно кода. Затем выберите объект Application, и вы увидите полный список событий объекта Application (рис. 3). Например, следующий код использует событие ItemSend объекта Application, чтобы вставить во все исходящие сообщения текущую дату и время, а также номер версии Outlook:
Private Sub Application_ItemSend (ByVal Item _ As Object, Cancel As Boolean) ‘ автоматическая вставка текущей даты и номера версии программы Item.Body = Item.Body& Date & “ “ & Time & _ Application.Session.CurrentUser.Name End Sub
Объект NameSpace является абстрактным исходным узлом для источников данных Outlook. Сейчас поддерживается только один такой источник данных — MAPI, который обеспечивает доступ ко всем данным Outlook, хранящимся в файлах сообщений пользователя. Свойство Session объекта Application возвращает объект MAPI NameSpace. Вам также понадобится коллекция Folders, доступная с помощью объекта NameSpace. Эта коллекция является эквивалентом файловой системы Outlook и в качестве таковой обеспечивает доступ ко всем типам элементов Outlook, включая сообщения (mail), контакты (contacts), встречи (schedules), задачи (tasks) и заметки (notes).
Специфика OTM-проектов в Outlook 2000
Здесь мы вспомним о том, что в общем случае приложения занимаются обработкой различных наборов данных, которые вводятся пользователем в виде открытия файлов. В офисных приложениях такие файлы называются документами. Если программа использует внутреннюю среду программирования, то у нее появляется второй тип загружаемых файлов — с программным кодом. Эта ситуация была нами показана на примере создания приложения с интеграцией в него VBA («Интеграция VBA в бизнес-приложения независимых разработчиков», КомпьютерПресс 3’2000, на CD-ROM). Там мы могли отдельно загружать документы для редактирования текста (RTF-файлы) в среде редактора и отдельно в среде VBA загружать VBA-проекты, содержащие макрокоманды.
В знакомых нам Word и Excel реализован вариант, когда VBA-код хранится вместе с самим документом (или шаблоном, что в данном случае почти одно и то же). Однако следует отметить, что в них также можно загружать (и создавать) совершенно автономные VBA-проекты, но такая возможность реализована только для выпуска Office 2000 Developer Edition. (Технология практического использования таких VBA-проектов отличается от привычной работы с проектами, включенными в состав документов. Эта технология описана в статье Владимира Биллига «Документы Office 2000 и их проекты», www.microsoft.ru/offext/officedev/articles/billig/.)
В отличие от других офисных приложений 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, сделав при этом соответствующее переименование.
В одной из зарубежных статей описывался способ подключения OTM-файлов с помощью их определения в окне Tools|References. Однако, хотя возможность открытия таких файлов в окне Add Reference вроде бы предусмотрена (рис. 5), после нажатия кнопки Open у нас постоянно появлялось сообщение о невозможности подключения данного файла в качестве ссылки.
Пользовательские настройки меню и панели инструментов Outlook 2000 хранятся в файле …\Windows\Application Data\Microsoft\Outlook\Outcmd.dat. Мы определили это экспериментальным путем, так как не нашли такой информации в документации. Таким образом, для переноса пользовательского кода и настроек нужно копировать два файла VbaProject.OTM и Outlook.dat (а может быть, лучше полностью каталог …\Windows\Application Data\Microsoft\Outlook\).
Создание утилиты для отправки сообщений
Теперь приступим к созданию собственно утилиты EmailMerge, которая будет объединять данные из списка, хранящиеся в Excel, с шаблоном сообщения в Outlook для генерирования нового электронного письма для каждой строки списка. Для решения этой задачи мы соединим шаблон сообщения (хранящийся в Outlook 2000 в папке Drafts в качестве неотправленного элемента) с простыми строковыми маркерами, например с <
Форма с именем frmEmailMerge будет являться главным элементом макрокоманды Email Merge, а класс с именем clsEmailMerge будет получать требуемые данные и осуществлять слияние. Для операции слияния нам понадобятся рабочая книга Excel, в которой хранятся адреса электронной почты, и шаблон сообщения. Мы будем использовать форму frmEmailMerge для отображения состояния этого набора данных. Как только все необходимые для формирования письма компоненты будут заполнены, пользователь сможет осуществить слияние, щелкнув кнопку «Отправить». Кроме того, он в любой момент сможет отменить эту операцию, щелкнув кнопку «Отмена».
Изменим имя текущего проекта 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, в котором сосредоточена вся информация и базовые функции. Создадим этот класс до того, как приступить к написанию кода для формы.