【问题标题】:Block calender entry with specific categories阻止具有特定类别的日历条目
【发布时间】:2020-01-07 10:30:35
【问题描述】:

我有一个会议/约会项目,并让这个表格具有一个固定的类别。 我希望现在能够决定我是否将其中的哪些输入到我的日历中。

我是 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

现在我的想法是,当我找到该项目时,我想查看约会并能够决定是否要将其添加到我的日历中。

编辑: 也许我在这里找到了解决我的问题的聪明方法https://support.office.com/en-us/article/Show-a-declined-meeting-on-my-calendar-24E81B9B-3906-4C02-8B63-F97B02161763 如果我删除了我设定的所有收入项目,我希望它们不会被添加到我的日历中。 然后我运行搜索脚本,在要删除的对象列表中找到它并显示给用户。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

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

    不清楚使用什么代码搜索具有特定类别集的项目,很可能您只是遍历文件夹中的所有项目,这并不好。相反,您需要使用ItemsFind/FindNextRestrict 方法来仅获取与您的条件相对应的项目。例如:

    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 字段属于关键字类型,旨在保存多个值。以编程方式访问它时,Categories 字段的行为类似于Text 字段,并且字符串必须完全匹配。文本字符串中的值由逗号和空格分隔。这通常意味着如果关键字字段包含多个值,则不能对关键字字段使用 FindRestrict 方法。例如,如果您在 Business 类别中有一位联系人,在 Business 和 Social 类别中有一位联系人,则无法轻松使用 FindRestrict 方法来检索 Business 类别中的所有项目。相反,您可以遍历文件夹中的所有联系人,并使用Instr 函数来测试字符串“Business”是否包含在整个关键字字段中。

    一个可能的例外是,如果您将Categories 字段限制为两个或少量值。然后,您可以使用带有 OR 逻辑运算符的 FindRestrict 方法来检索所有项目。例如(在伪代码中):“企业”或“企业、个人”或“个人、企业”。

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

    在以下文章中详细了解这些方法:

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

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

    【讨论】:

    • 我将搜索更改为不使用 for 循环,希望这是您向我推荐的内容。现在我想被问到是否要将找到的带有类别的日历条目添加到我的日历中。我不知道该怎么做。
    • 你可以使用Move方法。
    • 好的,我试试,但有一些问题。我需要将 myItems 声明为 AppointmentItem(或 MeetingItem)以使用移动命令“myItems.Move (olFolderDeletedItems)”。还是有其他可能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多