用于标记带有类别的电子邮件的Outlook VBA脚本正在创建重复的类别

时间:2016-05-06 15:30:29

标签: vba outlook outlook-vba categories office-automation

我正在尝试编写一个规则,将类别应用于所有传入邮件。

最终我想使用它来标记C和C ++相关的电子邮件,其中包含"编程 - C"和"编程 - C ++"标签,但我简化了SO的例子。

我还希望能够在已具有指定类别的邮件上运行此规则,但我不希望它对已标记的电子邮件进行双重标记。

以下是添加类别而不创建副本的子例程:

' Add a category but don't create duplicates
Sub AddCategory(ByRef Item As MailItem, strCategory As String)
    Dim exists As Boolean
    Dim arrCategories As Variant

    ' Initialize variables
    exists = False
    arrCategories = Split(Item.categories, ",")

    ' Loop through all categories
    For i = LBound(arrCategories) To UBound(arrCategories)

        ' Check if the specified category already exists
        If StrComp(strCategory, arrCategories(i)) = 0 Then
            exists = True
            Exit For
        End If
    Next i

    ' If the category does not exist, add it
    If Not exists Then
        Item.categories = Item.categories & "," & strCategory
    End If
End Sub

以下是调用它的子程序:

Sub filter(Item As MailItem)
    Call AddCategory(Item, "Programming - C")
    Call AddCategory(Item, "Programming - C++")
    Item.Save
End Sub

从规则调用此filter子例程并应用于所有传入邮件。 问题是,如果我在" Inbox"中的所有项目上运行此规则并且电子邮件已被标记为"编程-C"和"编程 - C ++"即使我正在检查重复项,它也会添加重复的标记!

(它将复制"编程 - C"或"编程 - C ++"标签,但不是两者。重复哪一个似乎是随机的,是完全不一致......)

我试图想出这个问题几天都在摸不着头脑。

如何正确检查现有代码以避免重复?

修改

我注意到,当电子邮件已被标记为"编程 - C"和"编程 - C ++"这两个标签的顺序似乎有影响。当我运行脚本时,它将始终复制第二个标记,而不是第一个标记。

所以如果"编程 - C"它是第一个复制的标签" Programming - C ++"反之亦然。

1 个答案:

答案 0 :(得分:0)

在弄清楚如何使用VBA逐行调试器后,我最终发现了问题...

事实证明Item.Categories以格式字符串返回类别:

“Category1,Category2,...”

每个类别用逗号和空格分隔。

解决方案是更改线路:

arrCategories = Split(Item.categories, ",")

arrCategories = Split(Item.categories, ", ")