【问题标题】:Delete duplicate mails Outlook 2013删除重复邮件 Outlook 2013
【发布时间】:2020-06-21 07:12:29
【问题描述】:

我正在尝试创建一个 VBA 宏来检查是否有重复的邮件(查看主题)然后删除邮件。

此代码有效,但正在删除最旧的重复项。它按降序计数,我似乎无法对项目进行排序。

基本上,我需要帮助来确定如何确保删除接收时间的“最新”副本。

Sub RemoveDuplicates()
    Dim oFolder As Folder
    Dim oEmail As MailItem, oItems As ItemProperties, oItem As ItemProperty
    Dim cMail As Collection
    Dim i As Long
    Set oFolder = Application.ActiveExplorer.CurrentFolder
    Set cMail = New Collection

    With oFolder
        ' .Items.Sort "[ReceivedTime]", True
        If olMailItem <> .DefaultItemType Then Exit Sub
        For i = .Items.Count To 1 Step -1
            Set oItems = .Items(i).ItemProperties
            Debug.Print oItems("ReceivedTime")

            If Not oItems("ReceivedTime") Is Nothing Then
                Set oItem = oItems("ReceivedTime")

                '// Week old
                If oItem >= Date - 7 Then
                    On Error GoTo ErrHandler
                    '// Delete Duplicate Subject
                    cMail.Add oItems("Subject"), oItems("Subject")
                    On Error GoTo 0
                End If
            End If
        Next i
    End With

    Exit Sub

ErrHandler:
    Debug.Print Err.Number, oItems("Subject"), oItems("ReceivedTime")
    oFolder.Items(i).Delete

    Resume Next
End Sub

【问题讨论】:

    标签: vba outlook duplicates


    【解决方案1】:

    在进入循环之前缓存 Items 集合(否则每次都会得到一个全新的 Items COM 对象),按 ReceivedTime (Items.Sort) 对其进行排序,然后从 Count 向下循环到 1。

    【讨论】:

      【解决方案2】:

      扩展@DmitryStreblechenko 的回答:

      以下将保留日期最旧的MailItem,并删除具有相同主题的较新日期。

      为方便起见,TargetFolderMinDate 是可配置但可选的。它们默认为当前可见的文件夹和 7 天前。

      Sub RemoveDuplicates(Optional TargetFolder As Folder, Optional MinDate As Date)
          Dim Items As Items, Email As MailItem
          Dim i As Long, Dupes As Object
      
          If MinDate = vbEmpty Then MinDate = Date - 7
          If TargetFolder Is Nothing Then Set TargetFolder = ActiveExplorer.CurrentFolder
      
          Set Dupes = CreateObject("Scripting.Dictionary")
          Set Items = TargetFolder.Items
          Items.Sort "[ReceivedTime]"
      
          Debug.Print "Dedupe <" & TargetFolder.FolderPath & ">, " & Items.Count & " items"
      
          For i = Items.Count To 1 Step -1
              If TypeOf Items(i) Is MailItem Then
                  Set Email = Items(i)
                  If Email.ReceivedTime >= MinDate Then
                      If Dupes.Exists(Email.Subject) Then
                          Debug.Print "DELETE: " & Email.Subject
                          'Item.Delete
                      Else
                          Dupes.Add Email.Subject, 0
                      End If
                  End If
              End If
          Next i
      End Sub
      

      这使用了Scripting.Dictionary,因为与Collection 对象不同,它支持方便的Exists() 方法。

      【讨论】:

      • 感谢工作就像一个魅力! Scripting.Dictionary 对于其他一些宏会很方便:)
      • 当他发布他的答案时,我几乎已经准备好了,我不想把它扔掉。请注意TypeOf 检查和从Items(i)(即Object)到MailItem 的显式类型转换,这将为VBA IDE 中的EMail 变量启用IntelliSense。你也可以Objects(i).Subject,但是你不会得到自动完成。
      • 当将其用于邮件脚本 Sub RemoveDuplicates(Email As Outlook.MailItem) 时,它不包括收到的触发脚本的电子邮件。假设我必须创建一个单独的事件处理程序
      • 是的,我想也是。
      猜你喜欢
      • 2015-07-22
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多