W codziennej pracy z aplikacją MS Outlook często spotykaną sytuacją jest, że przychodzi do nas email który chcielibyśmy umieścić w naszym kalendarzu celem późniejszego odniesienia się. Przykładowo gdy otrzymujemy mail z fakturą w PDF z 14 dniowym terminem płatności, chętnie zapłacimy na koniec tego terminu.

Wbudowana w Outlook funkcja działa źle gdyż nie kopiuje poprawnie wiadomości jeżeli są one w formacie HTML. Uszkadzane jest formatowanie wiadomości, co widać na poniższym przykładzie maila od nazwa.pl z przypomnieniem o wygasającej dzierżawie domeny.

 

Makro “Wiadomosc_do_Kalendarza” pomaga szybko wykonać poniższe czynności:

  • tworzy wpis w domyślnym kalendarzu Outlook na podstawie aktualnie podświetlonej wiadomości e-mail
  • dodaje źródłowy mail jako załącznik do wydarzenia kalendarza, dzięki czemu jeżeli w naszej wiadomości były załącznik to mamy do nich wygodny dostęp z kalendarza
  • pozwala wybrać domyślne zdefiniowane terminy na kiedy dodać przypomnienie: dzisiaj, jutro, za tydzień, za 2 tygodnie, za miesiąc. Makro wylicza też jaki to jest dzień tygodnia, gdy któryś termin wypada np w dzień wolny łatwo możemy go przesunąć w oknie edycji terminu.
  • ustawia wydarzenie na całodzienne

Jak to działa?

 

Poniżej widzimy email z informacją o wygasającej domenie, zawierającą proformę który chcemy zamieścić w kalendarzu

Uruchamiamy nasze makro VBA: Wiadomosc_do_Kalendarza, klikając na jego ikonę na pasku szybkiego dostępu.

 

 

Otwiera się nam oko wyboru daty na kiedy ma zostać utworzone przypomnienie. Oczywiście można tą datę ręcznie zmienić w oknie edycji wydarzenia.

 

 

Po kliknięciu interesującej nas daty otwiera nam się okno edycji wydarzenia.
Możemy dokonać jeszcze zmian, lub od razu zapisać wydarzenie.

 

 

Po kliknięciu “Zapisz i zamknij” nasze wydarzenie znajduje się w kalendarzu

 

Wymagania

Makro do działania potrzebuje aktywowania dodatkowej referencji “Microsoft Office 14.0 Obiect Library”.

 


Oczywiście musimy tez aktywować wstążkę deweloper…

 

  …oraz w zabezpieczeniach włączyć możliwość uruchamiania makr.

 

Kod makra “Wiadomosc_do_Kalendarza” w języku VisualBasic VBA wraz z komentarzami:

 

Public za_ile_dni_zmienna As Integer
Sub Wiadomosc_do_Kalendarza()

Dim Obiekt_Kalendarza As Outlook.AppointmentItem
 Dim Obiekt_Email As Outlook.MailItem
 Dim Obiekt_EmailReply As Outlook.MailItem
 Dim Obiekt_Inspektor As Inspector
 Dim Obiekt_Word As Word.Document
 Dim Obiekt_Selekcja_Word As Word.Selection

Set Obiekt_Email = Application.ActiveExplorer.Selection.Item(1)
Set Obiekt_EmailReply = Obiekt_Email.Reply '.Reply powoduje powstanie wiadomości reply na aktualnie podświetloną wiadomość

If Not Obiekt_EmailReply Is Nothing Then
 If Obiekt_EmailReply.Class = olMail Then ' sprawdza czy to jest obiekt: MailItem
 Set Obiekt_Inspektor = Obiekt_EmailReply.GetInspector
 Obiekt_Inspektor.Display

If Obiekt_Inspektor.EditorType = olEditorWord Then ' Since Microsoft Office Outlook 2007, the EditorType property always returns olEditorWord.
 Set Obiekt_Word = Obiekt_Inspektor.WordEditor 'Returns the Microsoft Word Document Object Model of the message being displayed.
 Set wrdBkm = Obiekt_Word.Bookmarks("_MailAutoSig") 'zaznaczanie naszego podpisu którego nie potrzebujemy w kalendarzu
 If Not wrdBkm Is Nothing Then wrdBkm.Range.Delete ' usuwanie podpisu
 Set objWord = Obiekt_Word.Application
 Set Obiekt_Selekcja_Word = objWord.Selection
 With Obiekt_Selekcja_Word
 .WholeStory
 .Copy
 End With

End If
 End If
 End If
 Set Obiekt_Inspektor_mail_reply = Obiekt_Inspektor ' potrzebne aby potem zamknąć okno maila
 Set Obiekt_Kalendarza = Application.CreateItem(olAppointmentItem)
 Set Obiekt_Inspektor = Obiekt_Kalendarza.GetInspector
 Set Obiekt_Word = Obiekt_Inspektor.WordEditor
 Set Obiekt_Selekcja_Word = Obiekt_Word.Windows(1).Selection

With Obiekt_Kalendarza
 .Subject = "Z e-maila -> " & Obiekt_Email.Subject

'.Body = Chr(13) & Chr(13) ' dodaje 2 nowe linie w treści obieku reply
 '.Categories = "From Email" 'ustawia kategorię może się przydać?
 Za_ile_dni.dzis.Caption = "Dzisiaj - " & Format(Now, "Long Date") & " - " & WeekdayName(Weekday(Now) - 1)
 Za_ile_dni.jutro.Caption = "Jutro - " & Format(Now + 1, "Long Date") & " - " & WeekdayName(Weekday(Now + 0))
 Za_ile_dni.za_tydzien.Caption = "Za tydzień - " & Format(Now + 7, "Long Date") & " - " & WeekdayName(Weekday(Now + 6))
 Za_ile_dni.za_2_tygodnie.Caption = "Za 2 tyg - " & Format(Now + 14, "Long Date") & " - " & WeekdayName(Weekday(Now + 13))
 Za_ile_dni.za_miesiac.Caption = "Za miesiąc - " & Format(Now + 30, "Long Date") & " - " & WeekdayName(Weekday(Now + 29))
 Za_ile_dni.Show

.Start = Now + za_ile_dni_zmienna
 .End = Now + za_ile_dni_zmienna
 .AllDayEvent = True
 .ReminderSet = False

Obiekt_Selekcja_Word.PasteAndFormat (wdFormatOriginalFormatting)
 .Attachments.Add Obiekt_Email, , 1 'dodaje maila jako załącznik wydarzenia, parametr 1 powoduje że załącznik znajdzie się na samej górze treści.
 .Display 'wyświetla nasze wydarzenie w kalendarzu do dalszej edycji
 '.Save ' możemy tez zapisywać wydarzenia automatycznie bez dodatkowej edycji

End With

'Obiekt_Email.Categories = "Appt" & Obiekt_Email.Categories
 Set Obiekt_Kalendarza = Nothing
 Set Obiekt_Email = Nothing
 Set Obiekt_EmailReply = Nothing
 Obiekt_Inspektor_mail_reply.Close (olDiscard) ' zamykanie okna reply na maila
End Sub

Wygląd Formatki “za_ile_dni”

 

Kod VBA formatki “Za_ile_dni”:

Private Sub dzis_Click()
Za_ile_dni.Hide
za_ile_dni_zmienna = 0
End Sub

Private Sub jutro_Click()
Za_ile_dni.Hide
za_ile_dni_zmienna = 1
End Sub
Private Sub za_tydzien_Click()
Za_ile_dni.Hide
za_ile_dni_zmienna = 7
End Sub
Private Sub za_2_tygodnie_Click()
Za_ile_dni.Hide
za_ile_dni_zmienna = 14
End Sub
Private Sub za_miesiac_Click()
Za_ile_dni.Hide
za_ile_dni_zmienna = 30
End Sub