Publikoval Michal Kočí dňa 24.3.2005 o 23:07 v kategórii Office
Microsoft Office Outllok je fajn. Je príjemné, že ak nejakú feature nemá, dá sa celkom ľahko doprogramovať pomocou VBA. No a keďže docela často sa mi v poslednej dobe stávalo, že som potreboval vyhľadať email podľa názvu prílohy a toto sa v štandardnom vyhľadávacom dialógu nedá, musel som si to doprogramovať sám. S výsledkom som samozrejme nanajvýš spokojný :)
Mal som zopár požiadaviek a všetky sa mi podarilo naimplementovať:
Hneď na začiatku upozorňujem prípadných čitateľov, že používam (navyše používam svojskú) maďarskú notáciu, testovaniu kódu som nevenoval toľko času, koľko by si zaslúžil a v neposlednom rade som kód neoptimalizoval (ak je to u VBA vôbec možné) :)
Teda aby som nenapínal, formulár na vyhľadanie vyzerá nasledovne:
Formulár bude mať zopár globálnych premenných, nesúcich informácie o nájdených emailoch, či prebieha hľadanie, či je požiadavka na stornovanie hľadania, v akom priečinku sa má hľadať atď
Dim mailsFounded() As MailItem Dim nsThis As NameSpace Dim fldrSelected As MAPIFolder Dim bCanceled As Boolean Dim bSearching As Boolean
Pri aktivácii formulára je potrebné spraviť niekoľko základných úkonov, najmä zistiť aktuálny priečinok, pripraviť stĺpce v zozname s mailami, ktoré obsahujú hľadané prílohy.
Private Sub UserForm_Activate()
Set nsThis = Application.GetNamespace("MAPI") Set fldrSelected = Application.ActiveExplorer.CurrentFolder tbFolder.Text = fldrSelected lvResults.ColumnHeaders.Add , , "Od", 100 lvResults.ColumnHeaders.Add , , "Predmet", 150 lvResults.ColumnHeaders.Add , , "Dátum", 100 bSearching = False bCanceled = False
End Sub
Pri požiadavke na výber iného priečinka sa musí užívateľovi zobraziť dialóg na výber priečinka a v prípade, že si niektorý vyberie a voľbu potvrdí, nastaví sa globálna premenná na zvolený priečinok.
Private Sub btnSelectFolder_Click()
Dim fldrTemp As MAPIFolder Set fldrTemp = nsThis.PickFolder If Not (fldrTemp Is Nothing) Then Set fldrSelected = fldrTemp tbFolder.Text = fldrSelected End If
End Sub
Vyhľadávacia procedúra je najdlhšia ale nie zložitá. Keďže jedno tlačidlo má slúžiť na hľadanie aj na ukončenie hľadania, je potrebné hneď na začiatku skontrolovať, či už hľadanie nebeží. Ak nie, nastaví sa príznak, že hľadanie beží a zmení sa text tlačidla. Ak beží, nastaví sa príznak, že treba stornovať hľadanie a procedúra sa ukončí.
Ďalej sa pripraví progress bar, ktorý bude zobrazovať priebeh hľadania a v “stavovom riadku” sa zobrazí informácia o začatí hľadania.
Nasleduje cyklus, ktorý skontroluje každú položku v prehľadávanom priečinku. Prvý krok cyklu kontroluje, či nebola požiadavka na ukončenie hľadania a ak bola, potom hľadanie zastaví (ukončí sa procedúra), predtým však trochu prečistí formulár. U práve kontrolovanej položky sa zistí, či sa jedná o e-mail a ak áno, či obsahuje prílohy. Ak prílohy obsahuje, každú z nich skontroluje, či sa v jej názve nenachádza hľadaný text. Ak áno, nastaví sa príznak, že sa mail má email pridať do výsledkov.
Ak niektorá príloha mailu vyhovela hľadanému názvu, do zoznamu výsledných mailov sa vloží nová položka obsahujúca odosielateľa, predmet správy a dátum prijatia. Zároveň sa do globálnej premennej pridá odkaz na tento email, aby keď si užívateľ bude chciet mail zobraziť, nemusel prehľadať znovu celý priečinok.
Na konci hľadania sa opäť prečistí formulár a do stavového riadku sa vypíše oznam o ukončení hľadania.
Private Sub btnSearch_Click() Dim mailOne As MailItem Dim objectOne As Object Dim attOne As Attachment Dim bFound As Boolean Dim lPosition As Long Dim liOne As ListItem If Not bSearching Then bSearching = True bCanceled = False btnSearch.Caption = "Zrušiť" Else bCanceled = True btnSearch.Caption = "Hľadať" Exit Sub End If ReDim mailsFounded(0) lvResults.ListItems.Clear lblInfo.Caption = "Hľadá sa príloha obsahujúca v názve " & tbFileName.Text pbProgress.Min = 0 pbProgress.Max = fldrSelected.Items.Count pbProgress.Value = 0 For Each objectOne In fldrSelected.Items If bCanceled Then pbProgress.Value = 0 bSearching = False Exit Sub End If pbProgress.Value = pbProgress.Value + 1 If objectOne.Class = olMail Then DoEvents Set mailOne = objectOne bFound = False If (mailOne.Attachments.Count > 0) Then For Each attOne In mailOne.Attachments If (InStr(1, attOne.FileName, _ tbFileName.Text, vbTextCompare) > 0) _ Then bFound = True End If Next End If If bFound Then ReDim Preserve mailsFounded(UBound(mailsFounded) + 1) Set mailsFounded(UBound(mailsFounded)) = mailOne Set liOne = lvResults.ListItems.Add liOne.Text = mailOne.SenderName liOne.SubItems(1) = mailOne.Subject liOne.SubItems(2) = mailOne.ReceivedTime End If End If Next lblInfo.Caption = "Koniec hľadania" btnSearch.Caption = "Hľadať" End Sub
Pri požiadavke na zobrazenie vybraného emailu sa skontroluje, či je nejaký email vybraný a ak áno, potom sa otvorí.
Private Sub btnOpenMessage_Click()
Dim mailSelected As MailItem Dim liSelected As ListItem If Not (lvResults.SelectedItem Is Nothing) Then Set mailSelected = mailsFounded(lvResults.SelectedItem.Index) mailSelected.Display End If
End Sub
Keď bol formulár hotový (a pár minút testovaný), tak som si do toolbaru pridal ikonku, ktorá mi formulár pustí. To je celkom jednoduché, stačí si pripraviť pomocnú verejnú procedúru, ktorá formulár zobrazí a tú volať z tlačidla, ktoré si do toolbaru pridáte.
Sub ShowFindEmailDialog()
frmFindAttachments.Show
End Sub
Jednoduché, nie? Ak si chcete stiahnuť tento formulár, urobte tak...
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.