【问题标题】:How to filter by subject and age?如何按主题和年龄过滤?
【发布时间】:2019-06-18 13:45:50
【问题描述】:

我正在尝试删除超过 30 天的主题中包含“发票”的已发送项目。

它适用于超过 30 天的电子邮件,但不对主题应用过滤器。

我目前使用的代码

Sub MoveAgedMail()

    Dim objOutlook As Outlook.Application
    Dim objNamespace As Outlook.NameSpace
    Dim objSourceFolder As Outlook.MAPIFolder
    Dim objDestFolder As Outlook.MAPIFolder
    Dim objVariant As Variant
    Dim lngMovedItems As Long
    Dim intCount As Integer
    Dim Items As Outlook.Items
    Dim Filter As String
    Dim intDateDiff As Integer
    Dim strDestFolder As String
    
    Set objOutlook = Application
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    Set objSourceFolder = objNamespace.GetDefaultFolder(olFolderSentMail)
    
    Set objDestFolder = objNamespace.GetDefaultFolder(olFolderDeletedItems)

    Filter = "[Subject] = '%" & "invoice" & "%' And [SenderEmailAddress] = _
    'abc @hotmail.com'"

    Set Items = objSourceFolder.Items.Restrict(Filter)

    For intCount = objSourceFolder.Items.Count To 1 Step -1
        Set objVariant = objSourceFolder.Items.Item(intCount)
        DoEvents
        If objVariant.Class = olMail Then
            
            intDateDiff = DateDiff("d", objVariant.SentOn, Now)
             
            If intDateDiff > 30 Then

                objVariant.Move objDestFolder
              
                'count the # of items moved
                lngMovedItems = lngMovedItems + 1

            End If
        End If
    Next
    
    MsgBox "Moved " & lngMovedItems & " messages(s)."
    Set objDestFolder = Nothing
End Sub

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    您必须使用一组受限制的项目,而不是获取新的项目集合,例如:

     For intCount = objSourceFolder.Items.Count To 1 Step -1
       Set objVariant = objSourceFolder.Items.Item(intCount)
    

    应该改写如下:

     For intCount = Items.Count To 1 Step -1
       Set objVariant = Items.Item(intCount)
    

    您可能会发现以下文章对您有所帮助:

    【讨论】:

      【解决方案2】:

      不要将 Items 用作变量。

      Sub MoveAgedMail()
      
      'Dim objOutlook As Outlook.Application
      
      'Dim objNamespace As Outlook.NameSpace
      Dim objNamespace As NameSpace
      
      'Dim objSourceFolder As Outlook.MAPIFolder
      Dim objSourceFolder As Folder
      
      'Dim objDestFolder As Outlook.MAPIFolder
      Dim objDestFolder As Folder
      
      Dim objVariant As Variant
      Dim lngMovedItems As Long
      Dim intCount As Integer
      
      'Dim Items As Outlook.Items ' Do not use Items as a variable
      Dim resItems As Items
      
      Dim Filter As String
      Dim intDateDiff As Integer
      Dim strDestFolder As String
      
      'Set objOutlook = Application   ' not necessary
      'Set objNamespace = objOutlook.GetNamespace("MAPI")
      Set objNamespace = GetNamespace("MAPI")
      
      Set objSourceFolder = objNamespace.GetDefaultFolder(olFolderSentMail)
      Debug.Print "objSourceFolder.Items.Count: " & objSourceFolder.Items.Count
      
      Set objDestFolder = objNamespace.GetDefaultFolder(olFolderDeletedItems)
      
      ' ?
      Filter = "[Subject] = '%" & "invoice" & "%' And [SenderEmailAddress] =" 'abc @hotmail.com'"
      Debug.Print Filter
      
      Filter = "[Subject] = '%" & "invoice" & "%'"
      Debug.Print Filter
      
      Set resItems = objSourceFolder.Items.Restrict(Filter)
      Debug.Print "objSourceFolder.Items.Count: " & objSourceFolder.Items.Count
      Debug.Print "resItems.Count: " & resItems.Count
      
      'For intCount = objSourceFolder.Items.Count To 1 Step -1
      For intCount = resItems.Count To 1 Step -1
      
          Set objVariant = resItems.Item(intCount)
      
          DoEvents
      
          If objVariant.Class = olMail Then
      
              intDateDiff = DateDiff("d", objVariant.SentOn, Now)
      
              If intDateDiff > 30 Then
      
                  objVariant.Move objDestFolder
      
                  'count the # of items moved
                  lngMovedItems = lngMovedItems + 1
      
              End If
          End If
      Next
      
      MsgBox "Moved " & lngMovedItems & " messages(s)."
      Set objDestFolder = Nothing
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-31
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        相关资源
        最近更新 更多