Интеграция на Microsoft Outlook с други приложения на Office
Няма да се спирам на проблемите с обработката на данни - това е конкретна задача за всеки програмист. Ще бъде само за това как най-добре да се свържете с обекти на Outlook, да създадете ново писмо и да прехвърлите необходимия текст към него. Решавайки такива проблеми през годината, стигнах до извода, че въпреки факта, че всички програми на Office са интегрирани помежду си - интеграцията като Excel-Outlook или Word-Outlook далеч не е толкова ефективна, колкото Excel-Word. Проблемите възникват точно там, където изобщо не ги очаквате.
Нека започнем с разликите между Office 2000 и Office XP. Първо, в Office XP всеки програмен достъп до обекти на Outlook се прихваща от услугата за сигурност с издаване на подходящо съобщение, където потребителят е подканен да избере между „разрешаване на достъп“ и „отказ на достъп“. В последния случай на VBA се връща подходяща грешка. В Office 2000 не се появяват предупредителни съобщения.
Освен това ще разгледам проблемите с програмирането, като се фокусирам върху Office XP, за програмисти в средата на Office 2000, това също ще бъде полезно да се прочете, тъй като 99% от програмния код е работещ в тази платформа. един ден лесно ще можете да създадете връзка въз основа на всякакви приложения на Office. Също така очаквам да имате достатъчно опит в средата на VBA.
Свързване с Outlook
Сама по себе си връзката с Outlook може да бъде включена в обработката на събитието с щракване върху бутон или във всяка друга процедура. Тук всичко зависи само от конкретната задача.
Имате два начина за свързване, които се наричат по-ранно и късно обвързване. И най-интересното е, че можете да използвате тези два метода наведнъж. Нищо лошо в това. Обикновено ранното обвързване е удобно, защото в бъдеще, когато пишете код, всичко ще изпадне, познато,подсказки и списъци с методи и свойства на обекти на Outlook. Обикновено използвам предварително обвързване.
За да организирате обвързването (както ранно, така и късно), трябва да поставите подходящото квадратче за отметка в прозореца Препратки.
Кодът трябва да включва следния ред за деклариране на променлива
Dim mailApp Като Outlook.Application
(В случай на късно свързване променливата mailApp трябва да бъде описана като Dim mailApp As Object. Няма повече разлика от гледна точка на програмирането. Единствената разлика е, че в случай на ранно свързване обектите, които трябва да бъдат обвързани, се свързват на етапа на компилация (да се чете „на етапа на проектиране“), а в случай на късно свързване обектите се свързват на етапа на изпълнение на програмата. И двата метода имат недостатъци, но за модерния компютър s достатъчно RAM и достатъчна производителност на процесора, промените в производителността няма да бъдат толкова незабележими. Във всеки случай е за предпочитане да се използва по-ранно свързване.)
Два оператора на VBA се използват за достъп до обекти на Outlook
Задайте mailApp = GetObject(, "Outlook.Application")
Задайте mailApp = CreateObject("Outlook.Application")
Първата опция се препоръчва, ако Outlook вече работи и е в паметта на компютъра. Второто - в случай с Outlook, първо трябва да се отвори. Разбира се, че функцията GetObject е по-бърза, тъй като без да създава обект, тя получава препратка към него. Функцията CreateObject винаги създава нов обект и генерира съответна връзка към него, докато самият Outlook не се появява на екрана (разбира се, обектът може да бъде показан на екрана по всяко време). В някои случаи винаги е по-лесно да използвате функцията CreateObject, но този подход не еефективен - не трябва да създавате копие на обект, ако той вече е създаден (зареден по-рано програмно или от потребителя). С помощта на инструментите VBA и API можете да проверите дали Outlook е зареден в момента или не.
Описание на функцията на API:
Декларирайте функция FindWindowByClass Lib "user32" _ Псевдоним "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As Long) Доколкото
Код за проверка:
Dim lngRetVal As Long
\'Търсене в прозорец на Microsoft Outlook lngRetVal = FindWindowByClass("rctrl_renwnd32", 0&)
Името на класа е посочено като rctrl_renwnd32. Така че е замислено от програмистите на Microsoft и името на класа не се е променило от няколко поколения на Oitlook, мисля, че в името на съвместимостта ще продължи да бъде така.
Функцията FindWindowByClass API връща 0, ако прозорецът не е намерен, във всички останали случаи се връща манипулаторът на намерения прозорец.
В зависимост от това дали прозорецът е намерен или не, извикваме функцията GetObject или CreateObject.
Ако lngRetVal <> 0 След това Set mailApp = GetObject(, "Outlook.Application") Else Set mailApp = CreateObject("Outlook.Application") End If
Не мисля, че този код ще създаде много трудности, той може просто да бъде взет и копиран.
На това всъщност връзката с Outlook е завършена. Можете да осъществявате достъп до различни папки, приложения, да създавате нови елементи в тях и да извършвате други действия. За съжаление, програмистът не може да промени повечето от настройките на Outlook, но има няколко неща, които можете да направите. Това важи и за нови съобщения, които се създават. Например, не можете програмно да промените шрифта, който е зададен като "шрифт по подразбиране" за новосъздадени съобщения.
Създайте ново съобщение:
Задайте objMail =mailApp.CreateItem(olMailItem)
dim dfg като обект Задайте dfg = objMail.Recipients.Add("[email protected]") dfg.Type = olCC \'използвайте olBCC вместо olCC за изпращане на сляпо копие
Посочете темата на съобщението:
Това всъщност е всичко! Остава само да напишете тялото на самото съобщение. Ще приемем, че вече форматираният и подготвен текст е записан в променливата BodyText. Можете да напишете отделна статия за това как да формирате текст и да го форматирате и ако имате проблеми с работата с низове, обърнете се към друга литература.
Важна бележка по пътя! Естествено, като всеки уважаващ себе си пощенски клиент, Microsoft Outlook може да работи с невъобразим брой кодировки. За кореспонденция потребителите обикновено използват две кодировки: Windows-1251 (основен) и KOI-8R (което наследихме от Linux). Не по-малко очевиден е фактът, че във VBA низовите променливи се създават в Win-1251 кодиране. Следователно, ако желаете и е необходимо, можете да напишете компактна, но ефективна процедура за прекодиране на текст. В нета има много информация за различни кодировки и написването на такава процедура не е проблем. Бъдете внимателни, разликата в кодирането е друг капан на Microsoft Outlook. На пръв поглед най-лесният начин е да използвате кодирането Win-1251, но Outlook е конфигуриран да използва кодирането KOI-8R по подразбиране (почувствайте проблема!), така че за да използвате разработеното от вас приложение, Outlook трябва да бъде преконфигуриран към кодирането Win-1251 (или незабавно да напишете транскодер).
\'напишете текст в тялото на писмото в текстов формат objMail.Body = BodyText
\'вписване на текст в HTML формат objMail.HTMLBody=BodyText
Можете да използвате всички наличниHTML тагове. В началото написах, че Outlook XP не запазва автоматично тялото на изпратеното писмо в HTML формат. Следователно използването на този формат е донякъде ограничено.
За да промените формата на вече генериран имейл, използвайте следния код:
objMail.BodyFormat = olFormatPlain \'обикновен текст objMail.BodyFormat = olFormatHTML \'HTML формат objMail.BodyFormat = olFormatRichText \'RTF формат
Сега, за да изпратите незабавно генерирания имейл, използвайте метода Изпращане.
В края на процедурата по обработка трябва да затворите вашите Outlook сесии
Задайте objMail = нищо Задайте mailApp = нищо
Това е всичко! Много просто и най-важното, безобразно ефективно.
И все пак, въпреки простотата, много бих искал да използвам HTML формата за формиране и изпращане на съобщение. За потребителите на Office 2000 тук няма проблеми, но в случай на Office XP ще трябва или да се справите с факта, че съобщението не е запазено и за нормалното изпращане (запазване) на писмото е необходима намеса на потребителя, или да напишете допълнителни модули и библиотеки. Единственото, което ми хрумва е да използвам оператора SendKey и да се опитам да изпратя желаната комбинация от натискания на клавиши към Outlook, но този подход е изключително неефективен и ненадежден. Разбира се, Microsoft съзнателно създаде ограничения и едва ли ще успее да ги заобиколи с толкова елементарни неща.
Свързване към Microsoft Outlook Contacts
Работата на потребителя, използващ вашето приложение, ще бъде още по-ефективна, ако самата програма получи списък с абонати от папката с контакти на Microsoft Outlook и го предостави в удобен за използване вид. В това няма нищо сложно, така че нека започнем да програмираме. Надявам се, че можете сами да се справите с подходящия интерфейс на списъка.
Вземете обекта на Outlook:
lngRetVal = FindWindowByClass("rctrl_renwnd32", 0&)
Ако lngRetVal <> 0 След това Set myOlApp = GetObject(, "Outlook.Application") Else Set myOlApp = CreateObject("Outlook.Application") End If
- същото е както преди.
dim myNameSpace като обект dim myfolder като обект
\'вземете хранилището за съобщения MAPI. Задайте myNameSpace = myOlApp.GetNamespace("MAPI")
Грубо казано, всички папки на Outlook (входящи, изпратени, чернови и т.н.) са MAPI хранилище.
\'вземете папката с контакти от хранилището за съобщения MAPI. Задайте myfolder = myNameSpace.GetDefaultFolder(olFolderContacts)
Dim i As Long \'преминете през папката Contacts и прочетете информацията, от която се нуждаем For i = 1 To myfolder.Items.Count \' преминете през всички записи в папката Me.ListBox1.AddItem (myfolder.Items(i)) \'попълнете ListBox Me.ListBox1.List(i - 1, 1) = myfolder.Items (i).Email1Address Аз .ListBox1.List(i - 1, 2) = myfolder.Items(i).BusinessAddress Напред i
Създайте глобален масив:
Public clients() ReDim clients(myfolder.Items.Count, 3) \'разпределяне на памет клиенти = Me.ListBox1.List() \'попълване на масив с данни
Забележете колко лесно е да копирате информацията в масив от ListBox.
Забележете отново колко е просто.
Естествено, съдържанието на папката Контакти може да се промени и съдържанието на масива в този случай няма да отразява действителното състояние на нещата. Трябва да се отбележи, че съдържанието на папката Контакти не се променя много често, но препоръчвам да предоставите бутон, щракването върху който води до актуализиране на информацията в масива.
Масивът, като цяло, отнема допълнителна, често ценна памет, работи няколко десетки пътипо-бързо от директния достъп до папката с контакти на Microsoft Outlook и не задейства системата за сигурност, което го прави изключително удобен за използване. В края трябва да затворите вашите Outlook сесии
Задайте objMail = нищо Задайте mailApp = нищо
В заключение ще кажа няколко думи за обработката на грешки при програмиране на обекти. В повечето случаи е достатъчно да се уловят малък брой грешки.
Изберете Case Err.Number \'повдигнато, ако потребителят отговори с Не на съобщението за защита \'. Интересното е, че тази грешка възниква само ако \'имейлът е изпратен програмно с помощта на метода за изпращане, \'независимо от начина на достъп до Outlook. Ако \'да бъдем съвсем точни, тази грешка няма нищо общо със \'сигурността, тя възниква, ако програмата не може \'да получи достъп до приложението или неговия обект. Това може да се случи по различни причини. Случай 287 MsgBox "Грешка"
\'възниква, когато програмата не може да създаде връзка към \'обекта, например, ако Outlook не е инсталиран. Случай 429 "Грешка"
\'грешка, върната от службата за сигурност, ако отговорът е Не на \'заявка Случай -2147467259 MsgBox "Грешка"
\'всяка друга необработена грешка Case Else MsgBox "Error" End Select