Aktualizacja adresów w Listach dystrybucyjnych
by vbatools on Apr.21, 2011, under Outlook, Porady
Outlook pozwala użytkownikowi na stworzenie obiektu składającego się z grupy kontaktów. Lista dystrybucyjna, bo o niej mowa ma specyficzne właściwości. Jedną z nich, jest możliwość aktualizacji kontaktów, które wcześniej zostały dodane do grupy listy po przez wskazanie ich w książce adresowej.
Adresy takie mogą ewaluować, ale niestety nie są one związane z lista dystrybucyjną “na stałe”. Znaczy to że zmiana danych w kontaktach i wysyłka wiadomości do grupy adresowej “Listy dystrybucyjnej” nie będzie realizowało zamierzonego celu (prawidłowej wysyłki). O ile kontakt nie został usunięty i na jego miejsce nie powstał (prawie) identyczny kontakt to posiada on swój numer referencyjny w pewnej części zgodny z kontaktem wybranym w fazie budowania listy.
np: kontakt posiada nr.: “000000003921EFB12C34994594C86EC4DE706AB084092200”
a na jego podstawie kontakt załączony w liście dystrybucyjnej posiada nr.: “00000000C091ADD3519DCF11A4A900AA0047FAA4C3000000003921EFB12C34994594C86EC4DE706AB084092200”
Można by przypuszczać, że wystarczy odwołać się do 48 znaków każdego z kontaktów listy aby pobrać nowy adres kontaktu i podmienić go aktualizując członka listy.
Sub pobranie_danych_kontaktu()
Debug.Print FindAContact("Nazwisko Imie")
Debug.Print Application.GetNamespace("MAPI").GetItemFromID("000000003921EFB12C34994594C86EC4DE706AB084092200")
End Sub
Function FindAContact(adres As String) As String
'MVP OShon from VATools.pl
Dim oItems As Items, oContact As ContactItem
Dim oContactFolder As MAPIFolder
Set oContactFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
Set oItems = oContactFolder.Items
Set oContact = oItems.Find("[FullName] =" & """" & adres & """" & "")
FindAContact = oContact.EntryID '.Email1Address 'może być adres
Set oContact = Nothing
Set oContactFolder = Nothing
Set oItems = Nothing
End Function
Niestety, producent pozostawił parametr oDistList.GetMember(nIndex) .AddressEntry “do odczytu”. Co więcej, użytkownik może zmienić nie tylko adres kontaktu, ale i jego nazwę. W tym przypadku pow kod (o ile by działał) zwracał by błąd. Można by stwierdzić iż Microsoft pozostawił sobie tą funkcję niedostępną dla użytkownika, ponieważ nie można się odwołać do żadnego z dostępnych parametrów członka grupy.
Rys 1. Aktualizacja kontaktów listy w Outlooku 2007 PL
Aby można było się uporać z problemem, można zastosować metodę automatycznego klikania (analogicznie jak przez użytkownika).
W tym celu należy poniżej przytoczoną procedurę osadzić w module developera Outlooka [Alt+F11], a następnie odpalenie jej z poziomu folderu kontaktów Outlooka, w którym znajdują się listy dystrybucyjne.
Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) SubAaktualizuj_listy_dystryb() 'MVP OShon form VBATools.pl Dim item As Object, oDistList As DistListItem Dim oFolder As MAPIFolder, WshShell, winexist As Boolean Set oFolder = Application.ActiveExplorer.CurrentFolder For Each item In oFolder.Items DoEvents If item.Class = 69 Then Set oDistList = item oDistList.Display Set WshShell = CreateObject("WScript.Shell") Do While winexist = False winexist = WshShell.AppActivate(oDistList.DLName) Loop Select Case Val(Application.Version) Case 12 'dla wersji 2007 PL Sleep 100: SendKeys "%RU" Sleep 100: SendKeys "%RSS" Case 14 'dla wersji 2010 PL Sleep 100: SendKeys "%TU" Sleep 100: SendKeys "%TSS" End Select End If Next Set WshShell = Nothing Set oDistList = Nothing Set oFolder = Nothing End Sub
Procedura sprawdzona dla 2007/10 (PL)
Dla innych wersji językowych oraz wersji aplikacji przełączniki SendKeys mogą ulec zmianie.
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.