VBATools

Aktualizacja adresów w Listach dystrybucyjnych

by 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.

OL_Aktualizacja_ListyDystrybucyjnej

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.
:, , ,

Leave a Reply