VBA-整理邮箱并将重复的主题移至文件夹

VBA-sort through mailbox and move duplicate subjects to folder

我 运行 遇到一个问题,我在 Outlook 2013 中编写一个宏,它通过收件箱,每当遇到重复的主题行时,它会将 2 封电子邮件移动到不同的文件夹。

这些 "duplicates" 在主题行中略有不同,区别在于 "new" 前缀和 "closed" 前缀。

我对如何实现这一点有一个大致的想法,但我相信会有更简洁、更有效的方法来实现,因为有 50 个不同的主题行(不包括前缀)。

目前我的想法是有类似下面的东西:

for i = 1 to inbox.items.count 
    if inbox.items(i) = "new - example subject 1" then
        for x = 1 to inbox.items.count
            if inbox.items(x) = "closed - example subject 1" then
                inbox.items(x).unread = false
                inbox.items(x).move otherFolder
                inbox.items(i).unread = false
                inbox.items(i).move otherFolder
                exit for
            end if
        next x
     end if


    if inbox.items(i) = "new - example subject 2" then
        for x = 1 to inbox.items.count
            if inbox.items(x) = "closed - example subject 2" then
                inbox.items(x).unread = false
                inbox.items(x).move otherFolder
                inbox.items(i).unread = false
                inbox.items(i).move otherFolder
                exit for
            end if
        next x
     end if


'repeating 50 times'


next i

首先,不要使用多点符号:inbox.items(i).move otherFolder - 每个 inbox.items(i) 将 return 一个全新的 COM 对象。

其次,使用 Items。Find/FindNext 或 Items.Restrict 代替循环遍历文件夹中的所有项目。

您需要使用项目 class 的 Find/FindNext or Restrict 方法,而不是遍历文件夹中的所有项目。例如:

Sub DemoFindNext() 
 Dim myNameSpace As Outlook.NameSpace 
 Dim tdystart As Date 
 Dim tdyend As Date 
 Dim myAppointments As Outlook.Items 
 Dim currentAppointment As Outlook.AppointmentItem 

 Set myNameSpace = Application.GetNamespace("MAPI") 
 tdystart = VBA.Format(Now, "Short Date") 
 tdyend = VBA.Format(Now + 1, "Short Date") 
 Set myAppointments = myNameSpace.GetDefaultFolder(olFolderCalendar).Items 
 Set currentAppointment = myAppointments.Find("[Start] >= """ & tdystart & """ and [Start] <= """ & tdyend & """") 
 While TypeName(currentAppointment) <> "Nothing" 
   MsgBox currentAppointment.Subject 
   Set currentAppointment = myAppointments.FindNext 
 Wend 
End Sub

有关详细信息和示例代码,请参阅以下文章:

此外,您可能会发现应用程序 class 的 AdvancedSearch 方法很有帮助。下面列出了使用 AdvancedSearch 方法的主要好处:

  • 搜索在另一个线程中执行。您不需要手动 运行 另一个线程,因为 AdvancedSearch 方法 运行 会自动在后台运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 Restrict 和 Find/FindNext 方法可以应用于特定的项目集合(请参阅 Outlook 中文件夹 class 的项目 属性)。
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的过滤文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的 IsInstantSearchEnabled 属性)。
  • 您可以随时使用搜索的停止方法停止搜索过程 class。