我正在尝试编写一个规则,将类别应用于所有传入邮件。
最终我想使用它来标记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 ++"反之亦然。
答案 0 :(得分:0)
在弄清楚如何使用VBA逐行调试器后,我最终发现了问题...
事实证明Item.Categories
以格式字符串返回类别:
“Category1,Category2,...”
每个类别用逗号和空格分隔。
解决方案是更改线路:
arrCategories = Split(Item.categories, ",")
到
arrCategories = Split(Item.categories, ", ")