Microsoft Outlook troubleshooting

W tej prezentacji posłużymy się tym samym przykładem, co zaprezentowanym w „Automatyzacja 1”, z tym że informacje, jakie nas interesują, zostaną przekazane do pliku Excela a nie uzupełnione o dodatkową treść. W tym pliku umieszczone zostaną informacje z każdej wiadomości w formacie tabularycznym (linia po linii), tak aby można było przystąpić do analizy tych danych. Ten sposób jest preferowany w przypadku posiadania kont IMAP/Exchange z uwagi na brak możliwości modyfikacji wiadomości.

Poniższe zdjęcie przedstawia znaną już nam wiadomość raportu za wykonaną usługę przejazdu taksówką.


Rys 1. Widok wiadomości, z danymi do przekazania.

W powyższej wiadomości interesują nas pola, które określają szczegóły zamówienia. W tej linii znajdują się wszystkie dane potrzebne do analizy. Podobnie jak poprzednio przygotowana zostanie procedura testowa, która sprawdzi czy pobrane dane będą zgodne z naszymi oczekiwaniami (pocięte i sklasyfikowane). Następnie otworzymy plik bazy (lub go utworzymy, o ile nie istnieje on w danej lokalizacji) i dodamy kolejno ww. dane. W tym przypadku nie musimy sięgać do bazy danych osób, ponieważ informacje na ten temat możemy wyszukać formułą pomiędzy plikami Excela wyszukaj.pionowo(), lub od razu dodać pole z taką formułą określając miejsce przechowywania pliku źródłowego.

 

Na pow. zdjęciu wiadomości email możemy zauważyć strategiczne dane, które będą stanowiły kolumny zestawienia. Mogą to być pobrane z dolnego poziomu wiadomości: „Data:”, „Woz:”, „Kwota:”, „Rachunek:”, trasa składająca się z 2 linijek „skąd/dokąd” oraz z górnych wierszy „hasło o numerze”, który w tym przypadku definiuje nr karty usługobiorcy. Dla urozmaicenia, kod zawierać będzie procedurę, dzięki której pobrane zostaną wszystkie rekordy z aktywnego folderu, aby nie analizować, jak poprzednio, pojedynczej wiadomość. Jednakże nie będzie ona wydajna z uwagi na regułę, która podpiętą, jako skrypt do wiadomości przychodzących będzie realizowała dodanie nowego rekordu do zestawienia (za każdym razem, odebrania wiadomości spełniającej zakładany warunek); zgodnie z rys 4 poprzedniego artykułu. To ona „Wyszukaj_tresc_wpisz_w_excel”, będzie otwierała i zamykała z zapisem plik Excelowy po jego uzupełnieniu o dodatkowy rekord.

Option Explicit

Sub Pobieranie_danych_email()
'MVP OShon from VBATools.pl
Dim MyItem As MailItem, el As Object
Dim oFolder As MAPIFolder, ile&
Set oFolder = Application.ActiveExplorer.CurrentFolder
On Error GoTo blad
For Each el In oFolder.Items
    If el.Class = 43 Then
        Set MyItem = el
        If MyItem.Subject = "Powiadomienie z systemu Monitor VIP" Then
            ile = ile + 1
            Call Wyszukaj_tresc_wpisz_w_excel(MyItem)
        End If
    End If
Next el
MsgBox "Przerobiono " & ile & " wiadomości z " & _
            oFolder.Items.Count, vbInformation, "VBATools.pl"
koniec:
Set MyItem = Nothing
Exit Sub
blad:
    MsgBox "Błąd: " & Err.Number & vbCr & Err.Description, _
        vbCritical, "Informacja o błędzie"
End Sub

Sub Wyszukaj_tresc_wpisz_w_excel(Item As Outlook.MailItem)
'MVP OShon from VBATools.pl
Const baza$ = "c:\temp\Barbakan_raport_regula.xlsx"
Dim Haslo&, Auto%, Data As Date, Kwota As Double, NrRachunku&
Dim Skad$, Dokad$
If Item <> olMailItem = False Then Exit Sub
With Item
    Data = Split(Split(.Body, "Data: ")(1), ",")(0)
    Haslo = Split(Split(.Body, "hasło o numerze ")(1), ",")(0)
    Auto = Split(Split(.Body, "Woz: ")(1), ",")(0)
    Kwota = Split(Split(.Body, "Kwota: ")(1), " zl,")(0)
    NrRachunku = Split(Split(.Body, "Rachunek: ")(1), ",")(0)
    Skad = Split(Split(.Body, "Skąd: ")(1), vbCrLf)(0)
    Dokad = Split(Split(.Body, "Dokąd: ")(1), vbCrLf)(0)
End With

Dim xlApp As Object, xlWkb As Object, xlWks As Object, x&, max_row&
Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
If FileExists(baza) = False Then
    Set xlWkb = xlApp.Workbooks.Add
        xlWkb.SaveAs FileName:=baza
Else
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
   
    With xlApp
        .Visible = False
    Set xlWkb = .Workbooks.Open(baza)
    End With
End If
Set xlWks = xlWkb.Sheets(1)
With xlWks
    max_row = .Cells(.Rows.Count, "a").End(3).Row '
xlUp    

If max_row = 1 And Len(.Cells(1, 1)) = 0 Then
        With .Cells(1, 1)
            .value = "Data przejazdu"
            .Offset(, 1) = "Numer"
            .Offset(, 2) = "Samochód"
            .Offset(, 3) = "Kwota"
            .Offset(, 4) = "nrRachunku"
            .Offset(, 5) = "Skąd/Dokąd"
        End With
    End If
    With .Cells(max_row + 1, 1)
        .value = Data
        .Offset(, 1) = Haslo
        .Offset(, 2) = Auto
        .Offset(, 3) = Kwota
        .Offset(, 4) = NrRachunku
        .Offset(, 5) = Skad & " -> " & Dokad
    End With
End With
    xlWkb.Close True
    xlApp.Quit
Set xlWkb = Nothing
Set xlWks = Nothing
Set xlApp = Nothing
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

 

 
Rys 2. Przygotowana baza po exporcie danych z wiadomości email.

 Teraz pozostaje jedynie skonfigurować regułę z pow. umieszczonym skryptem.
 

Na tych dwóch przykładach pokazana jest automatyzacja procesów, jaka może usprawnić proces w dowolnej firmie korzystającej z poczty elektronicznej i stałych raportów działań. Wystarczy tylko opierać się o dane, jakie będą mogły być wyodrębnione i przekazane do zestawienia bądź wiadomości elektronicznej.

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
Wiktor Zajączkowski
Wiktor Zajączkowski, CCS 2013-02-06 09:55:18
Witam, Pracuję z Office 2010. Próbowałem wykorzystać powyższy kod (oczywiście dostosowując adres bazy xlsx oraz pobieranych z maila danych, do swoich potrzeb), lecz przy próbie kompilacji dostaję komunikat "variable not defined". Program wskazuje na xlUp jako niezdefiniowaną zmienną. Jak mogę poradzić sobie z tym problemem?
Wiktor Zajączkowski
Wiktor Zajączkowski, CCS 2013-02-06 10:53:40
Witam, Pracuję z Office 2010. Próbowałem wykorzystać powyższy kod (oczywiście dostosowując adres bazy xlsx oraz pobieranych z maila danych, do swoich potrzeb), lecz przy próbie kompilacji dostaję komunikat "variable not defined". Program wskazuje na xlUp jako niezdefiniowaną zmienną. Jak mogę poradzić sobie z tym problemem?
OShon
OShon, VBATools.pl 2013-02-07 21:33:44
xlUp możesz zamienić liczbą 3. Nie mniej jednak możesz też do projektu dodać referencje Excela, w tedy parametr ten będzie rozpoznawany prawidłowo.
Czeslaw
Czeslaw 2013-08-27 19:15:22
Ale masz wiedzę. Bardzo mi się przyda ten kod. Jesli zechce zaglebic sie w kod i go zrozumieć to gdzie szukać dokumentscji? Nie rozumiem parametrów do funkcji split. Pozdrawiam
Księgowa
Księgowa, http://biedziak.com 2013-09-05 14:24:11
A co w przypadku i jak to zapisać gdy temat maila jest stały tak jak w przykładzie + unikalny numer ?
Księgowa
Księgowa, http://biedziak.com 2013-09-05 14:46:58
A co w przypadku i jak to zapisać gdy temat maila jest stały tak jak w przykładzie + unikalny numer ?
OShon
OShon, VBATools.pl 2013-09-17 14:19:20
@Księgowa, Aby pobrać nr tematu to należy potraktować temat tak samo jak treść. msgbox split(Item.subject, "stały temat")(1) zwróci słowo po stałym ciągiem. Więcej dowiesz się na Forum (po sformułowaniu pytania).