Vba 具有特定类别的块日历条目

Vba 具有特定类别的块日历条目,vba,outlook,Vba,Outlook,我有一个会议/约会项目,并将此表格与设置的类别一起提供。 我希望现在能够决定我是否在日历中输入其中的哪一个 我是VBA的初学者,有一个代码可以找到我的特定类别,这就是工作 ' Outputs all elements without set category Sub SearchCategoryRestriction() Dim myFolder As Outlook.Folder Dim myItems As Outlook.Items Dim Filter As String Dim

我有一个会议/约会项目,并将此表格与设置的类别一起提供。 我希望现在能够决定我是否在日历中输入其中的哪一个

我是VBA的初学者,有一个代码可以找到我的特定类别,这就是工作

' Outputs all elements without set category
Sub SearchCategoryRestriction()
 Dim myFolder As Outlook.Folder
 Dim myItems As Outlook.Items
 Dim Filter As String
 Dim myNamespace As Namespace

 'This will return all items that have the set category.
 Filter = "[Categories] = 'myKeyword'"
 Set myNamespace = GetNamespace("MAPI")
 Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
 Set myItems = myFolder.Items.Restrict(Filter)
 Debug.Print myItems.Count

End Sub
现在我的想法是,当我找到项目后,我希望看到约会,并能够决定是否将其添加到我的日历中

编辑: 也许我在这里找到了解决问题的聪明方法 如果我删除了设置类别的所有收入项目,我希望它们不会添加到我的日历中。
然后我运行搜索脚本,在要删除的对象列表中找到它,并将其显示给用户。

首先,我建议使用
Instr
函数,而不是比较字符串。类别字符串可能包含其他标记,而不仅仅是单个标记

目前还不清楚使用什么代码来搜索设置了特定类别的项目,很可能您只是迭代了文件夹中的所有项目,这是不好的。相反,您需要使用
Items
Find
/
FindNext
Restrict
方法来仅获取与您的条件相对应的项。例如:

Sub MoveItems()  
    Dim myNamespace As Outlook.NameSpace  
    Dim myFolder As Outlook.Folder  
    Dim myItems As Outlook.Items  
    Dim myRestrictItems As Outlook.Items  
    Dim myItem As Outlook.MailItem  

    Set myNamespace = Application.GetNamespace("MAPI")  
    Set myFolder = _  
        myNamespace.GetDefaultFolder(olFolderInbox)  
    Set myItems = myFolder.Items  
    Set myRestrictItems = myItems.Restrict("[Categories] = 'testword'")  
    ' do whatever you need with items found, for example, move to a subfolder
    For i =  myRestrictItems.Count To 1 Step -1  
        myRestrictItems(i).Move myFolder.Folders("Business")  
    Next  
End Sub
Categories
字段为关键字类型,用于保存多个值。以编程方式访问时,
类别
字段的行为类似于
文本
字段,字符串必须完全匹配。文本字符串中的值由逗号和空格分隔。这通常意味着,如果关键字字段包含多个值,则不能对其使用
Find
Restrict
方法。例如,如果您在业务类别中有一个联系人,在业务和社会类别中有一个联系人,则无法轻松使用
Find
Restrict
方法检索业务类别中的所有项目。相反,您可以循环浏览文件夹中的所有联系人,并使用
Instr
函数测试字符串“Business”是否包含在整个关键字字段中

如果您将
类别
字段限制为两个或少量值,则可能会出现例外情况。然后,您可以使用带有OR逻辑运算符的
Find
Restrict
方法检索所有项目。例如(伪代码):“业务”或“业务,个人”或“个人,业务”

请注意
Category
字符串不区分大小写

请在以下文章中阅读有关这些方法的更多信息:

此外,您可能会发现该方法很有用。在Outlook中使用
AdvancedSearch
方法的主要好处是:

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

首先,我建议使用
Instr
函数,而不是比较字符串。类别字符串可能包含其他标记,而不仅仅是单个标记

目前还不清楚使用什么代码来搜索设置了特定类别的项目,很可能您只是迭代了文件夹中的所有项目,这是不好的。相反,您需要使用
Items
Find
/
FindNext
Restrict
方法来仅获取与您的条件相对应的项。例如:

Sub MoveItems()  
    Dim myNamespace As Outlook.NameSpace  
    Dim myFolder As Outlook.Folder  
    Dim myItems As Outlook.Items  
    Dim myRestrictItems As Outlook.Items  
    Dim myItem As Outlook.MailItem  

    Set myNamespace = Application.GetNamespace("MAPI")  
    Set myFolder = _  
        myNamespace.GetDefaultFolder(olFolderInbox)  
    Set myItems = myFolder.Items  
    Set myRestrictItems = myItems.Restrict("[Categories] = 'testword'")  
    ' do whatever you need with items found, for example, move to a subfolder
    For i =  myRestrictItems.Count To 1 Step -1  
        myRestrictItems(i).Move myFolder.Folders("Business")  
    Next  
End Sub
Categories
字段为关键字类型,用于保存多个值。以编程方式访问时,
类别
字段的行为类似于
文本
字段,字符串必须完全匹配。文本字符串中的值由逗号和空格分隔。这通常意味着,如果关键字字段包含多个值,则不能对其使用
Find
Restrict
方法。例如,如果您在业务类别中有一个联系人,在业务和社会类别中有一个联系人,则无法轻松使用
Find
Restrict
方法检索业务类别中的所有项目。相反,您可以循环浏览文件夹中的所有联系人,并使用
Instr
函数测试字符串“Business”是否包含在整个关键字字段中

如果您将
类别
字段限制为两个或少量值,则可能会出现例外情况。然后,您可以使用带有OR逻辑运算符的
Find
Restrict
方法检索所有项目。例如(伪代码):“业务”或“业务,个人”或“个人,业务”

请注意
Category
字符串不区分大小写

请在以下文章中阅读有关这些方法的更多信息:

此外,您可能会发现该方法很有用。在Outlook中使用
AdvancedSearch
方法的主要好处是:

  • 搜索在另一个线程中执行。你不需要运行另一个thr