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
有关详细信息和示例代码,请参阅以下文章:
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
- How To: Use Restrict method to retrieve Outlook mail items from a folder
此外,您可能会发现应用程序 class 的 AdvancedSearch 方法很有帮助。下面列出了使用 AdvancedSearch 方法的主要好处:
- 搜索在另一个线程中执行。您不需要手动 运行 另一个线程,因为 AdvancedSearch 方法 运行 会自动在后台运行它。
- 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 Restrict 和 Find/FindNext 方法可以应用于特定的项目集合(请参阅 Outlook 中文件夹 class 的项目 属性)。
- 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的过滤文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的 IsInstantSearchEnabled 属性)。
- 您可以随时使用搜索的停止方法停止搜索过程 class。
我 运行 遇到一个问题,我在 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
有关详细信息和示例代码,请参阅以下文章:
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
- How To: Use Restrict method to retrieve Outlook mail items from a folder
此外,您可能会发现应用程序 class 的 AdvancedSearch 方法很有帮助。下面列出了使用 AdvancedSearch 方法的主要好处:
- 搜索在另一个线程中执行。您不需要手动 运行 另一个线程,因为 AdvancedSearch 方法 运行 会自动在后台运行它。
- 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 Restrict 和 Find/FindNext 方法可以应用于特定的项目集合(请参阅 Outlook 中文件夹 class 的项目 属性)。
- 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的过滤文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的 IsInstantSearchEnabled 属性)。
- 您可以随时使用搜索的停止方法停止搜索过程 class。