有没有办法比较所有Rss提要的所有标题并删除重复项?

时间:2017-07-30 20:27:37

标签: vba outlook outlook-vba

我想知道是否有办法比较所有RSS FEEDS中的所有标题并删除重复项。

我阅读了很多RSS Feed,很明显很多人都会在几个论坛上交叉发帖,然后我最终会多次看到相同的RSS Feed。

我真的只想一次看一次。如果我在整个MS Outlook RSS Feed列表中实际存在重复项,是否有办法列出所有Feed并删除重复项?

这是0m3r的脚本,略有修改。

Option Explicit
Public Sub Example()
Dim olNs As Outlook.NameSpace
Dim RSS_Folder As Outlook.MAPIFolder
Dim Item As Object
Dim Items As Items
Dim DupItem As Object
Dim i As Long
Dim j As Long

For j = 1 To 21
    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds).Folders(j)

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = RSS_Folder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.Subject) Then
                Debug.Print Item.Subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
                Item.Delete
            Else
                'Debug.Print Item.Subject
                DupItem.Add Item.Subject, 0
            End If
        End If
    Next i
    Debug.Print RSS_Folder
Next j

Set olNs = Nothing
Set RSS_Folder = Nothing
Set Item = Nothing
Set Items = Nothing
Set DupItem = Nothing
End Sub

enter image description here

2 个答案:

答案 0 :(得分:0)

Dictionary Object合作,比较Items.Subject

中的olFolderRssFeeds
  

Dictionary in VBA 是一个集合对象:   你可以存储各种各样的东西:数字,文本,日期,数组,范围,变量和对象,字典中的每个项目都有自己独特的键和   使用该键,您可以直接访问该项目(读/写)。

以下是快速示例代码

Option Explicit
Public Sub Example()
    Dim olNs As Outlook.NameSpace
    Dim RSS_Folder As Outlook.MAPIFolder
    Dim Item As Object
    Dim Items As Items
    Dim DupItem As Object
    Dim i As Long

    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds) _
                         .Folders("Microsoft At Home")

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = RSS_Folder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.subject) Then
                Debug.Print Item.subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
'               Item.Delete
            Else
                DupItem.Add Item.subject, 0
            End If
        End If
    Next i

    Set olNs = Nothing
    Set RSS_Folder = Nothing
    Set Item = Nothing
    Set Items = Nothing
    Set DupItem = Nothing
End Sub

此示例显示如何处理 RSS Feed 文件夹

下的所有文件夹
Option Explicit
Public Sub DupeRSS()
    Dim olNs As Outlook.NameSpace
    Dim RSS_Folder As Outlook.MAPIFolder

    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds)

'   // Process Current Folder
    Example RSS_Folder
End Sub
Public Sub Example(ByVal ParentFolder As Outlook.MAPIFolder)
    Dim Folder As Outlook.MAPIFolder
    Dim Item As Object
    Dim DupItem As Object
    Dim Items As Items
    Dim i As Long

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = ParentFolder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.subject) Then
                Debug.Print Item.subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
                Item.Delete
            Else
                DupItem.Add Item.subject, 0
            End If
        End If
    Next i

'   // Recurse through subfolders
    If ParentFolder.Folders.Count > 0 Then
        For Each Folder In ParentFolder.Folders
            Example Folder
            Debug.Print Folder.Name
        Next
    End If

    Set Folder = Nothing
    Set Item = Nothing
    Set Items = Nothing
    Set DupItem = Nothing
End Sub

请记住,代码只会比较单个文件夹中的重复

答案 1 :(得分:0)

迭代文件夹中的所有项目并不是一个好主意。

 For Each myItem In subFolder.Items
    If InStr(myItem.Subject, "[on hold]") > 0 Then

您可以使用Items类的Find / FindNextRestrict方法查找与您的条件对应的所有项目。在以下文章中阅读有关它们的更多信息:

另外,您可能会发现Application类的AdvancedSearch方法很有帮助。

在Outlook中使用AdvancedSearch方法的主要好处是:

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

Advanced search in Outlook programmatically: C#, VB.NET文章中详细了解相关内容。