Как искать элементы с вложением и ключевым словом в теме с помощью фильтра

Я работаю над кодом, вложение которого будет загружено в папку в контексте темы с помощью фильтра темы.

После долгого поиска в Интернете мой код работает, но проблема в том, что я хочу поместить ключевое слово в фильтр темы, чтобы он загружал вложение, поскольку тема меняется каждый день.

например Sub: training_24357 в один день и training_24359 на следующий день.

Кроме того, я хочу автоматически запускать свой код каждые 5 минут, любая помощь будет очень признательна,

ниже мой код.

Sub Attachment()

    Dim OutOpened As Boolean
    Dim App As Outlook.Application
    Dim Ns As Outlook.NameSpace
    Dim Folder As Outlook.MAPIFolder
    Dim Attach As Outlook.Attachment
    Dim Item As Object
    Dim MailItem As Outlook.MailItem
    Dim subject As String
    Dim saveFolder As String
    Dim dateFormat As String

    saveFolder = "D:\Outlook\POS Visit Report"
    If Right(saveFolder, 1) <> "\" Then saveFolder = saveFolder & "\"

        subject = """*POS Visit*"""

        OutOpened = False
        On Error Resume Next
        Set App = GetObject(, "Outlook.Application")
        If Err.Number <> 0 Then
            Set App = New Outlook.Application
            OutOpened = True
        End If
   On Error GoTo 0
        If App Is Nothing Then
            MsgBox "Cannot Start Outlook Mail", vbExclamation
            Exit Sub
        End If
    Set Ns = App.GetNamespace("MAPI")
    Set Folder = Ns.GetDefaultFolder(olFolderInbox)

        If Not olFolder Is Nothing Then
            For Each Item In olFolder.Items
                If Item.Class = Outlook.ObjectClass.olMail Then
                    Set MailItem = Item
                    If MailItem.subject = subject Then
                        Debug.Print MailItem.subject
                        For Each Attach In MailItem.Attachments
                        dateFormat = Format(Now(), "yyyy-mm-dd H-mm")
                        Attach.SaveAsFile saveFolder & "(" & dateFormat & ")" & " " & Attach
                        Next
                    End If
                End If
            Next
        End If


    If OutOpened Then App.Quit
    Set App = Nothing

End Sub

person Toddler    schedule 28.03.2017    source источник
comment
Почему каждые 5 минут? вы можете запускать его для каждого полученного электронного письма, чтобы увидеть, совпадает ли тема, а также начинается ли ваша тема с обучения?   -  person 0m3r    schedule 28.03.2017
comment
@ 0m3r просто чтобы посмотреть, пришло ли новое письмо с вложением в INBOX   -  person Toddler    schedule 28.03.2017
comment
Я думаю, вы можете использовать Application_Startup и настроить, чтобы увидеть, есть ли у элемента вложение, а у темы есть training, это сработает?   -  person 0m3r    schedule 28.03.2017
comment
@ 0m3r да, вы правы, но я хочу найти для этого новые методы, также я пытался запускать сценарии Outlook для каждого вложения :-)   -  person Toddler    schedule 28.03.2017
comment
@ 0m3r Нет, это просто пример.   -  person Toddler    schedule 28.03.2017
comment
Вы запускаете код из Outlook или другого офисного приложения?   -  person 0m3r    schedule 28.03.2017
comment
@ 0m3r Я запускаю код в Outlook   -  person Toddler    schedule 28.03.2017
comment
@ 0m3r Извините, я был занят раньше, теперь код работает нормально, я поделюсь им с вами, ребята. Кроме того, я хочу извлечь вложение из непрочитанной почты, но фильтр показывает проблему.   -  person Toddler    schedule 01.04.2017
comment
@ 0m3r Как мы можем добавить непрочитанную почту в фильтр, потому что, когда я пытался, это выдавало мне ошибку Filter = @SQL= & Chr (34) & urn:schemas:httpmail:subject & _ Chr(34) & Like '%training %' AND & _ Chr(34) & urn:schemas:httpmail:hasattachment & _ Chr(34) & =1   -  person Toddler    schedule 01.04.2017


Ответы (1)


Для поиска элементов с вложением и по строке темы вы можете использовать Метод Items.Restrict для фильтрации коллекции элементов, содержащей все совпадения из фильтра

Пример фильтра: [Attachment & Subject Like '%training%']

Filter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & _
                   Chr(34) & " Like '%training%' AND " & _
                   Chr(34) & "urn:schemas:httpmail:hasattachment" & _
                   Chr(34) & "=1"

Пример VBA https://stackoverflow.com/a/42547062/4539709 Или https://stackoverflow.com/a/42777485/4539709

Теперь, если вы запускаете код из Outlook, вам не нужно GetObject или Set App = New Outlook.Application Просто Set Ns = Application.GetNamespace("MAPI")


Чтобы запустить код при добавлении элементов в папку «Входящие», попробуйте использовать < em>Событие Application.Startup (Outlook) И Событие Items_ItemAdd (Outlook)

Событие Items.ItemAdd Происходит, когда один или несколько элементов добавляются в указанную коллекцию. Это событие не запускается, если в папку одновременно добавляется большое количество элементов.


Пример кода:

Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
    Dim olNs As Outlook.NameSpace
    Dim Inbox  As Outlook.MAPIFolder

    Set olNs = Application.GetNamespace("MAPI")
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox)
    Set Items = Inbox.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)    
    If TypeOf Item Is Outlook.MailItem Then
        '// call sub here
    End If
End Sub
person 0m3r    schedule 28.03.2017
comment
Вот мой вопрос, как мы можем фильтровать непрочитанные письма, потому что это дает ошибку при запуске кода. - person Toddler; 01.04.2017
comment
Filter = @SQL= & Chr(34) & urn:schemas:httpmail:subject & _ Chr(34) & Like '%POS Visit Report%' AND & _ Chr(34) & urn:schemas:httpmail:hasattachment & _ Chr(34) & =1 & _ Chr(34) & urn:schemas:httpmail:read & _ Chr(34) & =0 - person Toddler; 01.04.2017