Jak na propojení Excelu s Outlookem a proč vlastně? Po článku Jak na propojení Excelu s Wordem je další na řadě poštovní aplikace. Na čtyřech příkladech si ukážeme, čím si tyto dvě aplikace z balíčku Microsoft Office mohou být užitečné. Hned na začátku něco, co sám potřebuji velmi často seznam e-mailových adres, které se potulují v mém Outlooku. 'Tools / References / Microsoft Outlook xx.x Object Library Private Sub OutlookNacistAdresyZAdresare() Dim objoutlook As Object Dim objaddresslist As Object Dim objaddressentry As Object Dim i As Long Dim lngpocetpolozek As Long Dim arradresy() Set objoutlook = CreateObject("Outlook.Application") Set objaddresslist = objoutlook.session.addresslists("kontakty") Application.ScreenUpdating = False 'počet položek v adresáři lngpocetpolozek = objaddresslist.addressentries.count 'dimenzování pole ReDim arradresy(1 To lngpocetpolozek, 1 To 2) 'prokaždý záznam v adresáři For Each objaddressentry In objaddresslist.addressentries 'počítadlo i = i + 1 'jméno arradresy(i, 1) = objaddressentry.name 'adresa Excelplus.NET 1
arradresy(i, 2) = objaddressentry.address 'Microsoft Exchange 'Set objaddressentrydetail = objaddressentry.getexchangeuser Next objaddressentry 'vložení adres do listu wshadresy.cells(1).resize(lngpocetpolozek, 2) = arradresy Application.ScreenUpdating = True Set objaddresslist = Nothing Set objoutlook = Nothing End Sub Pokud jsou vaše kontakty uloženy v rámci Exchange, detail kontaktů najdete pod objektem objaddressentrydetail (PropertyAccessor, GetProperty, schema a Microsoft Exchange Property Tags). To není můj případ a tak není jednoduché se dostat k jiným informacích, než je jméno a adresa. Uvedená procedura má i další háček. Outlook není dostatečně aktivní a ani nemotivuje uživatele v tom, aby odesílatele přidávali do svých adresářů. Takže v momentě, kdy chcete projít vaše kontakty, je v adresáři jednoduše nemáte. Proto nabízím i verzi, která vytahá e-maily z doručených zpráv. 'Tools / References / Microsoft Outlook xx.x Object Library Sub OutlookNacistAdresyZDorucenychMailu() Dim i As Long Dim lngpocetpolozek As Long Dim arradresy() Dim objoutlook As Object Dim objnamespace As Object Dim objfolder As Object Dim objitem As Object Set objoutlook = New Outlook.Application Excelplus.NET 2
Set objnamespace = objoutlook.getnamespace("mapi") 'olfolderinbox... 6 Set objfolder = objnamespace.getdefaultfolder(olfolderinbox) 'počet položek v adresáři lngpocetpolozek = objfolder.items.count 'dimenzování pole ReDim arradresy(1 To lngpocetpolozek, 1 To 1) For Each objitem In objfolder.items 'je položka typu e-mail? 'olmail... 43 If objitem.class = olmail Then 'počítadlo i = i + 1 'přidání adresy odesílatele do pole arradresy(i, 1) = objitem.senderemailaddress End If Next objitem Application.ScreenUpdating = False With wshadresy 'vložení adres do listu.cells(1).resize(lngpocetpolozek, 1) = arradresy 'odstranění duplicit.range("a:a").removeduplicates Columns:=1, Header:=xlNo End With 'setřídění listu A-Z With wshadresy.sort.sortfields.clear Excelplus.NET 3
.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal.SetRange Range("A:A").Header = xlguess.matchcase = False.Orientation = xltoptobottom.sortmethod = xlpinyin.apply End With Application.ScreenUpdating = True 'odstranění proměnných z paměti Set objfolder = Nothing Set objnamespace = Nothing Set objoutlook = Nothing End Sub Po převzetí adres je samozřejmě potřeba řešit duplicity a není na škodu si adresy abecedně seřadit. I tak vám ještě zůstane trocha ruční práce spam, který prošel, no reply adresy apod. A hodit se vám může i tip na zřetězení. Postačí prostý odkaz na oblast vzorcem, stisk F9 (dojde k nahrazení adresy oblasti za hodnoty) a zbavení se drobného balastu. Položky oddělené středníky lze rovnou aplikovat ve zprávě Outlooku. První adresu věnujte políčku Komu a ostatní umístěte do skryté kopie (tlačítko Kopie a v otevřeném dialogu políčko Skrytá). Hromadné e-maily prosím rozesílejte jen v rozumné míře Zřetězení e-mailových adres pro hromadnou korespondenci Přitvrdíme. Co si třeba projít všechny zprávy a vypsat jen takové, které obsahují v předmětu slovo Excelplus.NET 4
Excel? 'Tools / References / Microsoft Outlook xx.x Object Library Sub OutlookNacistZpravyDlePredmetu() Dim i As Long Dim lngpocetpolozek As Long Dim arrpoledata() Dim objoutlook As Object Dim objnamespace As Object Dim objfolder As Object Dim objitem As Object Set objoutlook = New Outlook.Application Set objnamespace = objoutlook.getnamespace("mapi") 'olfolderinbox... 6 Set objfolder = objnamespace.getdefaultfolder(olfolderinbox) 'aktivace patřičného listu wshzpravy.activate 'počet položek v adresáři lngpocetpolozek = objfolder.items.count 'dimenzování pole ReDim arrpoledata(1 To lngpocetpolozek, 1 To 4) For Each objitem In objfolder.items 'je položka typu e-mail 'a obsahuje předmět slovo "Excel"? 'olmail... 43 If (objitem.class = olmail) And (objitem.subject Like "*Excel*") Then 'počítadlo i = i + 1 Excelplus.NET 5
'přidání informací do pole 'čas doručení arrpoledata(i, 1) = objitem.receivedtime 'jméno arrpoledata(i, 2) = objitem.sendername 'e-mail arrpoledata(i, 3) = objitem.senderemailaddress 'předmět zprávy arrpoledata(i, 4) = objitem.subject 'obsah 'arrpoledata(i, 5) = objitem.body 'kopie CC, BCC 'arrpoledata(i, 6) = objitem.cc End If Next objitem 'vložení informací do listu wshzpravy.cells(1).resize(lngpocetpolozek, 4) = arrpoledata 'odstranění proměnných z paměti Set objfolder = Nothing Set objnamespace = Nothing Set objoutlook = Nothing End Sub Něco praktičtějšího? Tak projdeme všechny nepřečtené zprávy, roztřídíme je a uložíme přílohy do složky podle odesílatele. 'Tools / References / Microsoft Outlook xx.x Object Library Private Const cstrcesta As String = "D:\Test\" Excelplus.NET 6
Sub OutlookUlozeniPrilohDleOdesilatele() Dim cstrcestapriloha As String Dim objoutlook As Object Dim objnamespace As Object Dim objfolderinbox As Object Dim objfolderdeleteditems As Object Dim objitem As Object Set objoutlook = New Outlook.Application Set objnamespace = objoutlook.getnamespace("mapi") 'olfolderinbox... 6, olfolderdeleteditems... 3 Set objfolderinbox = objnamespace.getdefaultfolder(olfolderinbox) Set objfolderdeleteditems = _ objnamespace.getdefaultfolder(olfolderdeleteditems) 'pro každou položku v adresáři For Each objitem In objfolderinbox.items 'je zpráva doposud nepřečtená? If objitem.unread Then With objitem.attachments 'existuje příloha? If.Count > Then 'pro všechny přílohy For i = 1 To.Count 'cstrcesta ke složce odesílatele cstrcestapriloha = cstrcesta & objitem.sendername & "\" 'vytvoření (neexistující) složky On Error Resume Next MkDir cstrcestapriloha Excelplus.NET 7
'uložení přílohy.item(i).saveasfile (cstrcestapriloha &.Item(i).Filename) Jak na propojení Excelu s Outlookem Next i End If End With 'nastavení atributu přečtené zprávy 'objitem.unread = False 'přesun zprávy do složky Odstraněná pošta 'objitem.move (objfolderdeleteditems) 'odstranění zprávy 'objitem.delete End If Next objitem 'ukončení seance 'objoutlook.quit End Sub Všechny dosavadní příklady fungovaly ve směru z Outlooku do Excelu. Poslední úloha bude opačná. Ze seznamu úkolů v Excelu vytvoříme úkol/událost v Outlooku. Níže uvedená procedura je jiná ještě v jedné věci. Ukazuje druhý způsob, jak se odkázat na aplikaci Outlook bez nutnosti reference (metoda CreateObject). Zatímco v předchozích ukázkách s referencemi jsme si mohli dovolit používat konstanty Outlooku a deklarovat objekty i přímo a nejen jako obecný Object, zde to možné není. Sub OutlookVytvoritUkolUdalost() Propojení Excel Outlook událost Excelplus.NET 8
Dim objoutlook As Object Dim objtaskitem As Object Dim objappointmentitem As Object Dim intradek As Integer 'aktivace patřičného listu wshudalosti.activate 'volba datového řádku intradek = 2 'vytvoření instance aplikace Outlook Set objoutlook = CreateObject("Outlook.Application") 'úkol... oltaskitem... 3 'Set objtaskitem = objoutlook.createitem(3) 'With objtaskitem '.Subject = Cells(intRadek, 1).Text '.StartDate = Cells(intRadek, 2).Value '.DueDate = Cells(intRadek, 3).Value '.ReminderTime = Cells(intRadek, 4).Value '.Body = Cells(intRadek, 5).Text '.Save 'End With 'událost... olappointmentitem...1 Set objappointmentitem = objoutlook.createitem(1) With objappointmentitem 'předmět.subject = Cells(intRadek, 1).Text 'počáteční datum.start = Cells(intRadek, 2).Value 'konečné datum.end = Cells(intRadek, 3).Value + 1 'celodenní událost Excelplus.NET 9
.AllDayEvent = True 'upozornění v minutách před poč. datem.reminderminutesbeforestart = (Cells(intRadek, 2).Value - _ Cells(intRadek, 4).Value) * 1440 'obsah.body = Cells(intRadek, 5).Text 'místo.location = Cells(intRadek, 6).Text 'uložení.save End With 'odstranění objektů z paměti Set objtaskitem = Nothing Set objappointmentitem = Nothing Set objoutlook = Nothing End Sub Excelplus.NET 10
Propojení Excel Outlook událost Chcete-li si nastudovat objektový model Outlooku, můžete zavítat na stránky Object model (Outlook VBA reference). Pokud vás to navnadilo podívat se na Outlook blíž, pak jen dobře. Uvědomte si, že i Outlook má události a vy můžete po příchodu zprávy automaticky uložit přílohu a mail zpracovat Příloha: excel_propojeni_outlook.zip Excelplus.NET 11