Tworzenie listy dystrybucyjnej na podstawie adresów z zaznaczonych wiadomości email
by vbatools on Jun.22, 2010, under Outlook, Porady
W kliencie poczty Microsoft Outlook nie ma możliwości prostego, hurtowego zapisu kontaktów do książki adresowej, a co więcej nie można również jednym kliknięciem zapisać adresatów listy dystrybucyjnej (grupy zebranych adresatów przypisanych jako jedną zdefiniowaną grupę odbiorców wiadomości).
Outlook otrzymując adres email może nie otrzymać „nazwy wyświetlanej” adresu, lub może ona być myląca – to też mechanizm jaki miałby dodawać adresy do książki adresowej tworzył by pełen śmietnik danych na pierwszy rzut oka nie do ogarnięcia.
Nazwa wyświetlana to pole nie obowiązkowe jakie wpisuje nadawca podczas konfiguracji konta, a przekazywana potem wraz z adresem. Jeśli sam użytkownik, odbiorca wiadomości w takim przypadku nie uzupełni właściwie nazwy (Imię Nazwisko lub Nazwa instytucji) dla otrzymanego adresu to w książce adresowej otrzyma wiele niemówiących nic adresów email.
Inaczej jest w przypadku przekazywania wiadomości grupie osób, gdzie ich personalizacja nie musi być uzupełniona (wpisanie na listę promocyjną, wysyłany humor czy korespondencja okolicznościowa). Lista bowiem może składać się z wpisanych adresów oraz z wybranych adresatów.
W tym przypadku poniższe makro po zaznaczeniu otrzymanych wiadomości (z Ctrl) i podaniu w wyświetlonym oknie nazwy, dla grupy adresów, listy dystrybucyjnej utworzy, a następnie wyświetli ją na ekranie użytkownika.
Option Explicit
Sub zrob_liste_dla_zaznaczonych_wiadomosci()
'MVP OShon from VBATools.pl
If Application.ActiveExplorer.CurrentFolder.DefaultItemType <> 0 Then Exit Sub
Dim Message As String, nazwa_listy As String
Message = "Podaj nazwę dla zakładanej listy dystrybucyjnej." & vbCr _
& "Wszystkie zaznaczone kontakty zostaną podłączone do tej grupy."
nazwa_listy = Trim(InputBox(Message, " Tworzenie listy dystrybucyjnej"))
nazwa_listy = Replace(nazwa_listy, ";", " ")
nazwa_listy = Replace(nazwa_listy, "(", vbNullString)
nazwa_listy = Replace(nazwa_listy, ")", vbNullString)
If Len(Trim(nazwa_listy)) = 0 Then Exit Sub
Dim oContactFolder As MAPIFolder
Dim oDistList As DistListItem
Dim oMailItem As MailItem
Dim oRecipients As Recipients
Dim oRecipient As Recipient
Dim item As MailItem
Dim oNewContact As ContactItem
Set oContactFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
Set oDistList = oContactFolder.Items.Add(olDistributionListItem)
With oDistList
.DLName = nazwa_listy
.Save
End With
Dim MailAdres, oReply, oRecipients2, oRecip
Dim adresy$, adres$
Dim NoDupes As New Collection
Dim I As Long, J As Long
Dim Swap1, Swap2
On Error GoTo ErrMessage
For Each item In Application.ActiveExplorer.Selection
DoEvents
Set MailAdres = item
Set oReply = item.Reply
Set oRecipients2 = oReply.Recipients
'adresy DO
For Each oRecip In oRecipients2
NoDupes.Add oRecip.Address
Next
'adresy DW – można wyłączyć
For I = 1 To MailAdres.Recipients.Count
NoDupes.Add MailAdres.Recipients(I).Address
Next I
Next
Set MailAdres = Nothing
Set oReply = Nothing
Set oRecipients2 = Nothing
For I = 1 To NoDupes.Count - 1
DoEvents
For J = I + 1 To NoDupes.Count
If NoDupes(I) > NoDupes(J) Then
Swap1 = NoDupes(I)
Swap2 = NoDupes(J)
NoDupes.Add Swap1, Before:=J
NoDupes.Add Swap2, Before:=I
NoDupes.Remove I + 1
NoDupes.Remove J + 1
End If
Next J
Next I
Set oDistList = oContactFolder.Items(nazwa_listy)
Set oMailItem = Application.CreateItem(olMailItem)
Set oRecipients = oMailItem.Recipients
adres = ""
For J = 1 To NoDupes.Count
DoEvents
If adres = NoDupes(J) Then GoTo nastepny
oRecipients.Add NoDupes(J)
'adresy = adresy & NoDupes(J) & ";"
adres = NoDupes(J)
nastepny:
Next J
'Debug.Print adresy
oRecipients.ResolveAll
With oDistList
.AddMembers oRecipients
.Save
.Display 0 'można wyłączyć
End With
ErrExit:
On Error Resume Next
Set oDistList = Nothing
Set oMailItem = Nothing
Set oRecipients = Nothing
Exit Sub
ErrMessage:
MsgBox "Błąd procedury " & Err.Number & vbCr _
& Err.Description, vbExclamation, " Informacja o błędzie"
Goto ErrExit
End Sub
Aby osadzić procedurę zrob_liste_dla_zaznaczonych_wiadomosci pod przyciskiem w menu MS Outlook polecam uwadze następujący artykuł.
Postępowanie krokowe w makra:
- sprawdza czy jesteś w folderze wiadomości
- tworzy listę dystrybucyjną o nazwie jaka została podana w InputBoxie
- przerzuca do tymczasowej tablicy adresy osób z pół DO i DW z zaznaczonych wcześniej wiadomości (można ograniczyć i wyłączyć to drugie)
- sortuje tą tablice aby adresy poukładane były alfabetycznie (sortowanie bąbelkowe)
- usuwa z kolekcji adresy z duplikowane (bo X zaznaczonych wiadomości może posiadać tych samych odbiorców)
- dodaje adresy do utworzonej wcześniej listy dystrybucyjnej i zapisuje zmiany
- pokazuje efekt końcowy, otwierając listę dystrybucyjną (można wyłączyć)
Jeśli masz pytania dotyczące makra zobacz powiązany z nim wątek na naszym forum.
(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.