Microsoft Outlook troubleshooting

W tym artykule zostanie przedstawiony mechanizm pozwalający zaprezentować automatyzacje aplikacji Microsoft, na przykładzie Outlook i Excel w praktyce. Przykładem będzie obróbka wiadomości, która jest raportem wykonanej usługi przez firmę taksówkową. Kluczowym pytanie w tym przypadku jest odszukanie właściciela karty, na które konto zostało nałożone obciążenie. W niej można zauważyć numer VIP 93217. W tym przykładzie będziemy chcieli dowiedzieć się, do kogo on należy, modyfikując wiadomość email.


Rys 1. Widok wiadomości, co do której będzie wykonana automatyzacja

Oprócz przedstawionej powyżej wiadomości (Rys1) potrzebna jest lista, będąca materiałem źródłowym, dzięki której uzupełnimy naszą wiadomość wyszukując dane. W niej zapisane będą słowa klucze, które będziemy wyszukiwać, a następnie zwrócimy wartość znajdującą się obok, która tłumaczy w tym przypadku przyporządkowaną wartość. Pokazany poniżej rysunek tłumaczy alokacje danych w pliku Excela:


Rys 2. Źródłowa baza danych

Dla zachowania poufności dane, które nie są konieczne w tej prezentacji zostały zamazane.

Procedura VBA, która będzie umieszczona w środowisku Developerskim otworzy ten plik (Rys2) oraz pobierze do tablicy wszystkie jego elementy, po czym zamknie plik w tle. Następnie po spełnieniu warunku (odnalezienie słowa klucza) i wyszukaniu interesującej dla nas wartości (numeru karty taksówkowej) w pliku xls, zwróci do zmiennej nazwisko jej posiadacza. Jeśli zwrócimy uwagę na wiadomość możemy dowolnie zlokalizować miejsce, w którym zwrócimy wyszukane dane. W pow. przypadku będzie to linia ze znakami „--”. W zależności od naszych potrzeb miejsce to może być dobrane dowolnie. Mechanizm zamieni tą wartość na wyszukaną i doda naszą linię ze znakami, co wywoła wrażenie dodania extra linii.


Rys 3. Wiadomość poddana modyfikacji.

Kod zawiera dwie procedury. Pierwsza z nich to mechanizm testujący, którym możemy odwołać się do otwartej lub zaznaczonej wiadomości.

Sub Przetestuj_modyfikacje_raportu_email()
'MVP OShon from VBATools.pl
Dim MyItem As MailItem

On Error Resume Next
Select Case TypeName(Application.ActiveWindow)
Case "Explorer"
    Set MyItem = ActiveExplorer.Selection.Item(1)
    MyItem.Display
Case "Inspector": Set MyItem = ActiveInspector.CurrentItem
Case Else: Exit Sub
End Select
On Error GoTo 0

If MyItem Is Nothing Then
MsgBox "Wpierw wskarz lub otwórz wiadomość " & _
"która jest raportem Taxi!", vbExclamation, "VBATools.pl"
GoTo koniec
End If

Call Wyszukaj_excel_wpisz_w_tresc(MyItem)
koniec:
Beep
Set MyItem = Nothing
End Sub

Sub Wyszukaj_excel_wpisz_w_tresc(Item As Outlook.MailItem)
'MVP OShon from VBATools.pl
Const baza$ = "c:\temp\Barbakan_lista_regula.xlsx"
Const klucz$ = "VIP: "
Const info$ = "Znaleziono w bazie jako: "
Const wstaw_w$ = "--"

Dim Nr_Karty_Taxi&, Znaleziony$
If Item <> olMailItem = False Then Exit Sub
With Item
    If InStr(1, .Body, klucz) > 0 Then
        If InStr(1, .Body, info) > 0 Then Exit Sub
        Nr_Karty_Taxi = Split(Split(.Body, klucz)(1), ",")(0)
    Else
        Exit Sub
    End If
End With

Dim xlApp As Object, xlWkb As Object, xlWks As Object, tablica(), x&, max_row&
If FileExists(baza) = False Then Exit Sub
ponownie:
If IsFileOpen(baza) = True Then
    MsgBox "Wyjdź z pliku bazy i spróbuj ponownie." & vbCr & _
    "Baza: " & baza, vbInformation, "VBATools.pl"
    GoTo ponownie:
End If
Set xlApp = CreateObject("Excel.Application")
With xlApp
    .Visible = False
Set xlWkb = .Workbooks.Open(baza)
Set xlWks = xlWkb.Sheets(1)
End With

With xlWks
    max_row = .Cells(.Rows.Count, "a").End(xlUp).Row
    tablica = .Range("a1:b" & max_row).value
End With
    xlWkb.Close False
    xlApp.Quit
Set xlWkb = Nothing
Set xlWks = Nothing
Set xlApp = Nothing
For x = 1 To max_row
    If tablica(x, 1) = Nr_Karty_Taxi Then Znaleziony = tablica(x, 2): Exit For
Next x

If Len(Znaleziony) = 0 Then Znaleziony = "Brak w bazie" Else _
Znaleziony = info & Znaleziony
With Item
    If .BodyFormat = olFormatHTML Then
       .HTMLBody = Replace(.HTMLBody, wstaw_w, Znaleziony & "<br>" & wstaw_w & "<br>")
    Else
        .Body = Replace(.Body, wstaw_w, Znaleziony & vbNewLine & wstaw_w & vbNewLine)
    End If
    .Save
End With
End Sub

Public Function FileExists(FilePath$) As Boolean
On Error GoTo blad
    FileExists = Len(Dir(FilePath, vbDirectory Or vbHidden Or vbSystem)) > 0
Exit Function
blad:
FileExists = False
End Function
Public Function IsFileOpen(FileName$) As Boolean
Dim iFilenum&, iErr&
    On Error Resume Next
    iFilenum = FreeFile()
        Open FileName For Input Lock Read As #iFilenum
        Close iFilenum
    iErr = Err
    On Error GoTo 0
    
    Select Case iErr
        Case 0:    IsFileOpen = False
        Case 70:   IsFileOpen = True
        Case Else: Error iErr
    End Select
End Function

Procedurę umieszczamy w module [Alt+F11]/Menu/Insert/Module a następnie zapisujemy nasz projekt.

Aby zautomatyzować w pełni ten proces (nie wywoływać go dla każdej wiadomości z osobna) wystarczy procedurę „Wyszukaj_excel_wpisz_w_tresc” dodać, jako skrypt w regule wiadomości przychodzących. Cyklicznie przychodzący raport wykonania usługi zostanie przerobiony automatycznie w identyczny sposób jak wywołany ręcznie.


Rys 4. Podłączenie procedury do reguły MS Outlook

Zapisujemy regułę pod unikalną nazwą i to wszystko.

Sposób ten działa w przypadku użytkowania konta POP3, ponieważ w konfiguracji IMAP/Exchange modyfikacja wiadomości nie jest dopuszczalna. Aby jednak uporać się z tym zadaniem polecam odniesienie się do następnego artykułu: Automatyzacja2, w którym zostanie opisany proces eksportu danych z aplikacji Outlook do Excela.

MVP Shon Oskar – VBATools.pl
Jeśli masz pytania dot. tego artykułu zapraszam na Forum
Skonfiguruj swój pakiet dodatków do Excela, Worda, PowerPointa i Outlooka



© Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.

Komentarze

Komentarze
Wojtek
Wojtek 2014-05-27 13:37:33
Świetna strona! Ciesze sie, że na nią trafiłem. Mam pytanie: Nie pojawia mi się żaden skrypt w oknie "select script". Co mam zrobić? Jakieś projekty ze skryptami .otm trzymam w folderze W7 C:Usersuser1AppDataRoamingMicrosoftOutlook