Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2701
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Создание учетных записей 233

Рис. 9.8. Окно управления учетными записями Outlook 2000 — это тот же объект, который используется для этих целей в Outlook Express

Рис. 9.9. Набор учетных записей Outlook Express успешно импортирован в Outlook 2000

Щелкнув на кнопке Импорт, нужно выбрать в открывшемся окне необходимую учетную запись (рис. 9.8), а затем щелкнуть на кнопке Открыть — учетная запись появится в окне управления учетными записями Outlook.

К сожалению, окно управления учетными записями не позволяет экспортировать и импортировать их группами, поэтому приходится выполнять данные операции с каждой учетной записью по отдельности. Проделав подобную операцию для всех файлов IAF, получим набор учетных записей пользователей электронной почты, аналогичный набору Outlook Express (рис. 9.9). При этом нет необходимости вручную определять все параметры подключения, а также задавать пароли. Конечно это справедливо, при условии, что у всех учетных записей пользователей установлен флажок Запомнить пароль на вкладке Сервер окна свойств учетной записи.

После закрытия окна управления учетными записями окно Outlook 2000 приобретете вид, подобный рис. 9.10 (при необходимости система предложит загрузить информацию из папок учетных записей сервера).

234 Глава 9. Программирование в Outlook: документооборот и электронная почта

Рис. 9.10. Учетные записи представлены в виде папок IMAP4, загружаемых с сервера

ПРИМЕЧАНИЕ

Создать несуществующую учетную запись можно используя Мастер подключения Интернет. Для его запуска можно раскрыть в Outlook диалоговое окно Учетные записи в Интернет и перейти на вкладку Почта. Затем щелкнуть на кнопке Добавить и выбрать в раскрывшемся меню пункт

Почта.

Рис. 9.11. Установите размер окна Outlook 2000 таким, чтобы в области просмотра отображалось несколько сообщений любой учетной записи

Теперь осталось лишь уменьшить окно Outlook 2000 до приемлемых размеров (рис. 9.11) и закрыть его. Размер окна, конечно, можно задавать и программно, но установка его размеров вручную позволит не загромождать создаваемое приложение вспомогательным кодом, а сосредоточится на его ключевых моментах. Изменение размера окна станет понятно чуть позже.

Создание приложения Registrator

Завершив подготовку Outlook 2000, можно приступать собственно к разработке приложения Registrator. Разработка приложения будет проводиться в следующей последовательности:

создание заготовки приложения;

определение констант, переменных, классов и форм;

разработка схемы приложения;

написание основного и вспомогательного программного кода;

доводка и совершенствование приложения.

Создание приложения Registrator 235

Создание заготовки приложения

Создание заготовки приложения начнем с подготовки рабочего листа.

Изменение имени листа

Откройте созданный в начале главы файл Registrator.xls, переименуйте его первый лист в Панель управления, удалите все остальные листы (рис. 9.12) и сохраните полученную рабочую книгу, состоящую из одного листа, на диске.

Рис. 9.12. Так выглядит рабочий лист Панель управления приложения Registrator

Создание элемента управления Кнопка

Создадим элемент управления, предназначенный для обеспечения запуска разрабатываемого приложения пользователем из рабочего листа Панель управления. Для этого нужно отобразить на экране панель инструментов Формы, выбрать из этой панели объект Кнопка и нарисовать кнопку на рабочем листе.

см. также в гл. 1 раздел “Как поместить на лист элемент управления”.

Создание заготовки макроса, связанного с кнопкой

После того, как будет отпущена кнопка мыши, Excel создаст кнопку Кнопка 1, размер которой будет соответствовать размеру очерченной области, и откроет окно назначения кнопке макроса. Щелкните в этом окне на кнопке Создать. Это приведет к запуску редактора Visual Basic, созданию нового модуля и заготовки процедуры со стандартным именем Кнопка1_Щелкнуть. Измените имя этой процедуры на cbGet_IMAP (листинг 9.1), и переименуйте имя модуля Module1 на

main.

ЛИСТИНГ 9.1

Sub cbGet_IMAP()

Sub End

Создание модулей, классов и форм, и изменение их свойств

Для изменения стандартного имени модуля нужно воспользоваться окном свойств Properties (команда View | Properties Windows, клавиша [F4]) и ввести в качестве значения свойства (Name) соответствующее название, как показано на рис. 9.13. На исходный код, приведенный на этом рисунке пока не обращайте внимания — вернемся к нему позднее.

236 Глава 9. Программирование в Outlook: документооборот и электронная почта

Также создайте в окне Visual Basic модуль с именем misc (команда Insert | Module), модуль класса mySync (Insert | Class Module) и формы Form1 (Insert | UserForm).

Рис. 9.13. Проект приложения Registrator с двумя созданными модулями, одним модулем класса и одной формой. В правой части окна показаны объявления переменных объектов и переменных уровня всего проекта и уровня модуля main

Создав заготовки модулей, откройте форму Form1 и поместите на нее метку (объект класса Label, которому система автоматически присвоит имя Label1). Установите свойства формы следующим образом:

(Name)

Form1

 

 

Caption

Подождите…

Height

83

Width

192

Затем задайте указанные ниже значения для следующих свойств метки:

Caption

Идет

 

 

синхронизация

 

 

 

 

Font

Tahoma

полужир-

 

 

ный

ForeColor

&H000000FF&

красный

Height

12

 

Left

36

 

TextAlign

2-fmTextAlignCenter

 

Top

24

 

Width

132

 

Форма приобретет вид, показанный на рис. 9.14.

Создание приложения Registrator 237

Рис. 9.14. Форма Form1 с размещенной на ней меткой

Изменение свойств кнопки на рабочем листе Excel

Для того чтобы изменить текст, отображаемый на созданной кнопке на рабочем листе Excel, нужно вернуться на этот лист, например, закрыв панель инструментов Формы. Затем щелкнуть на названии кнопки мышью — появится курсор ввода, и отредактировать текст, изменив его на название Провести регистрацию, а затем нажать дважды Esc. Осталось лишь закрыть и проверить работу кнопки. Если подвести к ней указатель мыши, он примет форму указывающей руки. Это говорит о том, что кнопке назначен макрос, который будет выполнен, если щелкнуть на ней. Щелкнув на кнопке, можно увидеть… да, ровным счетом ничего не увидеть! Объяснения излишни

— назначенный кнопке макрос cbGet_IMAP, находящийся в модуле main, ничего не выполняет.

На этом этап создания заготовки программы закончен — сохраните файл Registrator.xls. Теперь перейдем к следующему этапу, состоящему в определении констант, переменных, классов и форм.

СОВЕТ

Чтобы быстро переключаться между окном рабочей среды Excel и окном редактора Visual Basic можно воспользоваться Windows-сочетанием клавиш [Alt]+[Tab], или щелкать мышью на соответствующих им пиктограммах на панели задач Windows.

Определение программных элементов

Для начала перейдите в окно Visual Basic, откройте модуль main и введите в окне редактора объявления элементов программы, показанные в листинге 9.2. По окончанию ввода окно редактора должно иметь вид, подобный показанному на рис. 9.13.

238 Глава 9. Программирование в Outlook: документооборот и электронная почта

ЛИСТИНГ 9.2

Public objOutlook As Outlook.Application

Public myForm As New Form1

'****************************************** '*** Объекты Outlook ***

'******************************************

Private FolderList As Outlook.Folders

Private CurNameSpace As Outlook.NameSpace

Private CurFolder As Outlook.MAPIFolder

Private CurMsg As Outlook.MailItem

Private CurExplorer As Outlook.Explorer

Private CurSync As New mySync

Private Account As Outlook.SyncObject

Private FolderItem As Object

Private Attach As Outlook.Attachment

'********************************************* '*** Переменные модуля ***

'*********************************************

Private LastInputRow As String

Private InputDataRange, OutputDataRange As String

Private Interval As Variant

Private DateStart, DateEnd As Variant

Затем откройте модуль misc и введите в окне редактора объявления элементов программы, показанные в листинге 9.3.

ЛИСТИНГ 9.3

Public Const sRow As String = "R", sCol As String = "C" Public Const sHome As String = "1", sStart As String = "0" Public Const sFirstCol As String = "A"

Public Const sLastCol As String = "F"

Public Const sTimeKey As String = "D3"

Public Const sSemicolon As String = ":" Public Const sDollar As String = "$" Public Const sDot As String = "." Public Const sSpace As String = " " Public Const sHiphen As String = "-"

Public Const sAddressCol As String = "$A$2"

Public Const sSubjectCol As String = "$E$2" Public Const sAttachmentsCol As String = "$C$2" Public Const iGoodWidth As Integer = 30

Public Const iGoodHeight As Integer = 25 Public Const iGoodAttachWidth As Integer = 100

Public Const sMorningMail As String = "09:00:00"

Public Const sEveningMail As String = "14:00:00" Public Const sInbox As String = "Входящие"

Public Const sSentItems As String = "Sent Items" Public Const iTopHeader As Integer = 1

Public Const iBottomHeader As Integer = 2 Public MaxAttachmentsLen As Integer

Создание приложения Registrator 239

Наконец откройте окно модуля класса mySync и введите в окне редактора объявление, показанное в листинге 9.4.

ЛИСТИНГ 9.4

Dim WithEvents mySync As Outlook.SyncObject

см. также в приложении раздел “Область видимости и время жизни переменных ”.

Сохраните файл Registrator.xls. Теперь немного остановимся и рассмотрим только что добавленные объявления объектов, переменных, констант и других элементов программы.

Анализ объявленных программных элементов

Основную роль в создаваемой программе играют объявления, представленные в листинге 9.2. Как видно из листинга, здесь объявляется объект класса objOutlook, представляющий собой экземпляр класса Outlook.Application. Именно этот объект и играет роль сервера автоматизации — будем его инициализировать в приложении, обращаться к его методам, объектам и свойствам, а затем завершать с ним работу.

Помимо этого главного объекта, объявлены также объекты, предназначенные для работы с пространством имен (CurNameSpace), списком учетных записей IMAP, представленных в виде папок верхнего уровня (FolderList), текущей папкой (CurFolder), текущим сообщением электронной почты (CurMsg), текущим иксплорером (CurExplorer) и текущим объектом синхронизации (Account). Последний объект необходимо рассмотреть подробнее.

Как видно из листингов 9.2 и 9.4, в программе объявлен объект синхронизации Account и родственный ему объект синхронизации CurSync, представляющий собой объект класса mySync. Класс mySync, объявление которого (см. листинг 9.4) содержится в модуле класса mySync, представляет собой расширенную версию класса SyncObject. Зачем нужны такие сложности? Объект Account предназначен для получения ссылки на очередной объект синхронизации, соответствующий определенной учетной записи. С использованием этой ссылки будет активизироваться объект CurSync, имеющий функциональность, которая расширяет стандартную функциональность объектов класса SyncObject с целью обеспечения наглядного отображения хода синхронизации с использованием формы myForm.

Пока что это звучит несколько непонятно, но на данном этапе этого вполне достаточно — впоследствии механизм программно управляемой синхронизации будет рассмотрен более подробно.

Объекты FolderItem и Attach носят вспомогательный характер и предназначены для обеспечения работы с элементами, хранящимися в папках, и вложениями сообщений электронной почты, соответственно.

Большое значение также имеет переменная myForm, которая представляет собой объект класса Form1. Данный класс был разработан на первом этапе. Объект myForm предназначен для со-

вместной работы с классом mySync. Задача этого объекта — обеспечить отображение на экране формы до тех пор, пока не будет закончена синхронизация очередной учетной записи с выводом на экран информации о ходе синхронизации.

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

На этом этап объявления элементов программы закончен. Сохраните файл Registrator.xls, откройте модуль main и поместите курсор ввода в процедуру cbGet_IMAP.

Разработка схемы приложения

Проведенную в предыдущих разделах подготовительную работу, строго говоря, можно было бы не выполнять. Как легко догадаться, только самые опытные программисты могут сразу, до начала разработки приложения, определить все необходимые им константы, объекты, переменные, классы и т.п. Однако в этом примере была проявлена неслыханная мудрость и прозорливость, все элементы программы были определены на начальном этапе. Это сделано умышленно, чтобы мож-

240 Глава 9. Программирование в Outlook: документооборот и электронная почта

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

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

1.Инициализация переменных.

2.Синхронизация (при необходимости) локальных папок с папками сервера.

3.Запрос у пользователя периода, за который нужно выбрать сообщения.

4.Создание нового рабочего листа Excel, на котором будут регистрироваться сообщения.

5.Подготовка заголовка таблицы для входящих сообщений.

6.Выборка входящих сообщений из локальных папок.

7.Определение адреса диапазона, в котором находятся записи зарегистрированных входящих сообщений.

8.Подготовка заголовка таблицы для исходящих сообщений.

9.Выборка исходящих сообщений из локальных папок.

10.Выгрузка из памяти приложения Outlook.

11.Определение адреса диапазона, в котором находятся записи зарегистрированных исходящих сообщений.

12.Окончательное форматирование отчета и завершение работы приложения.

Как видите, схема достаточно проста и понятна. Вопросы могут возникнуть лишь по некоторым пунктам. Необходимость наличия п. 2 объясняется тем, что, во-первых, Outlook работает не с папками IMAP, хранящимися на сервере, а с локальными папками, которые автоматически синхронизируются с сервером при создании или удалении каких-либо элементов. Поэтому для того, чтобы перед выборкой сообщений всегда иметь самые свежие данные, нужно провести синхронизацию. Однако в некоторых случаях в данной операции нет необходимости — например, если выполнять выборку сообщений за прошлый месяц, а синхронизация папок осуществлялась всего лишь несколько часов назад. В этой связи операция синхронизации должна выполняться по решению пользователя.

Необходимость получения отчета по всем без исключения отправленным и полученным сообщениям возникает крайне редко. В этой связи имеет смысл обеспечить механизм определения ка- кого-то определенного интервала, за который нужно провести выборку информации. Именно для этих целей в схему введен п. 3. Это позволит пользователю определить границы интервала, в зависимости от стоящих перед ним задач.

Наконец, пп. 7 и 11 предназначены для обеспечения форматирования отчета в п. 12. Действительно, количество сообщений может меняться, поэтому приложение должно корректно определять границы диапазона ячеек рабочего листа Excel, в котором находятся сведения о полученных или об отправленных письмах, а также корректно обрабатывать ситуацию, когда входящих или (и) исходящих писем за заданный период не обнаружено.

Теперь откройте модуль main и поместите в тело процедуры cbGet_IMAP программный код, представленный в листинге 9.5, а после оператора выхода из процедуры — код, представленный в листинге 9.6.

ЛИСТИНГ 9.5

'*** Главная процедура программы.

'*** 1. Инициализация переменных.

Initialization

'*** 2. Синхронизация локальных папок с папками сервера.

Synchronization

Создание приложения Registrator 241

'*** 3. Определение интервала, за который нужно выбрать сообщения.

Interval = CalculateInterval(DateStart, DateEnd)

'*** 4. Создание нового листа для регистрации сообщений из '*** заданного интервала.

MakeNewReport DateStart, DateEnd

'*** 5. Подготовка заголовка таблицы для входящих сообщений.

MakeReportHeader sInbox, _

"Входящие сообщения, полученные за период с " _ & DateStart & " по " & DateEnd

'*** 6. Выборка входящих сообщений из локальных папок.

ProcessFolder (sInbox)

'*** 7. Определение адреса диапазона, в котором находятся '*** записи зарегистрированных входящих сообщений.

CalculateInputRange

'*** 8. Подготовка заголовка таблицы для исходящих сообщений.

MakeReportHeader sSentItems, _

"Исходящие сообщения, отправленные за период с " _ & DateStart & " по " & DateEnd

'*** 9. Выборка входящих сообщений из локальной папки.

ProcessFolder (sSentItems)

'*** 10. Выгрузка из памяти приложения Outlook.

Deinitialization

'*** 11. Определение адреса диапазона, в котором находятся '*** записи зарегистрированных исходящих сообщений.

CalculateOutputRange

'*** 12. Оформление отчета.

Application.StatusBar = "Оформление отчета..." FormatReport (InputDataRange)

FormatReport (OutputDataRange) Application.StatusBar = "Макрос выполнен успешно."

ЛИСТИНГ 9.6

Sub ProcessFolder(FolderType As String)

End Sub

Sub Synchronization()

End Sub

Sub CalculateInputRange()

End Sub

Sub CalculateOutputRange()

242 Глава 9. Программирование в Outlook: документооборот и электронная почта

End Sub

Sub Initialization()

End Sub

Sub Deinitialization()

End Sub

Как видно из листингов 9.5 и 9.6, некоторые процедуры и функции остались неопределенными. Так как они по большей части носят вспомогательный характер, их рациональнее поместить в модуль misc. Откройте модуль misc и поместите после объявления переменных и констант программный код, представленный в листинге 9.7.

ЛИСТИНГ 9.7

Sub MakeNewReport(sStartDate As Variant, sEndDate As Variant)

End Sub

Sub MakeReportHeader(sFolderType As String, _

ByVal sHeaderText As String)

End Sub

Sub FormatReport(Selector As String)

End Sub

Function CalculateInterval(sStartDate, sEndDate As Variant) As Variant

End Function

Компиляция проекта и запуск его на выполнение

Выберите из меню команду Debug | Compile VBAProject для компиляции проекта. Если текст введен без ошибок, Visual Basic “молчаливо одобрит” это творение, после чего команда Compile VBAProject будет оставаться недоступной до тех пора пока не будут внесены такие изменения в исходный текст, которые потребуют перекомпиляции проекта. Скомпилированный проект можно запустить на выполнение с помощью команды пользовательского интерфейса Visual Basic Run | Run Sub/UserForm. Однако так как была предусмотрена специальная кнопка для запуска приложения из рабочего листа Панель управления, воспользуемся именно этим методом. Перейдите в окно Microsoft Excel и щелкните на созданной кнопке Провести регистрацию. Ву-а-ля! В этот раз почти ничего не произошло. “Почти”, так как кое-что все-таки изменилось: в строке состояния вместо стандартной надписи ”Готово” появилась надпись ”Макрос выполнен успешно”. Это означает, что созданный “костяк” приложения работает. Сохраните файл Registrator.xls, перейдите в окно Visual Basic и снова откройте модуль main.

Осталось совсем немного — реализовать данный алгоритм в виде программного кода. Это и будет сделано в следующем разделе.

Соседние файлы в папке Книги