【问题标题】:How to search for appointments in Outlook via VBA/DASL?如何通过 VBA/DASL 在 Outlook 中搜索约会?
【发布时间】:2021-09-07 14:11:06
【问题描述】:

我正在尝试循环浏览当天的特定约会并在 m​​sgbox 中显示他们的详细信息。

我发现了 DASL 过滤器查询。

但是,它只会显示找到的第一个约会。 FindNext 方法永远不会进入下一个约会,即使它来自我在网上找到的一个非常相似的示例。

当我直接在 Outlook 中设置相同的 DASL 过滤器时,它会按预期显示约会。

这是我现在的子:

Sub GetAppointments()
     Dim sFilter As String
     Dim oExplorer As Outlook.Explorer
     Dim oFolder As Outlook.Folder
     Dim oAppointment As Outlook.AppointmentItem
     sFilter = "@SQL=" & _
                 "%today(""urn:schemas:calendar:dtstart"")% AND " & _
                 "%today(""urn:schemas:calendar:dtend"")% AND " & _
                 """urn:schemas-microsoft-com:office:office#Keywords"" LIKE '%Meeting%'"
     Set oExplorer = Application.ActiveExplorer
     Set oFolder = oExplorer.CurrentFolder
     Set oAppointment = oFolder.Items.Find(sFilter)
     While TypeName(oAppointment) <> "Nothing"
         MsgBox oAppointment.Subject & vbCr & _
                oAppointment.Start & vbCr & _
                oAppointment.End
         Set oAppointment = oFolder.Items.FindNext
     Wend
End Sub

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    如果要获得更多结果,则需要处理相同的 Items 集合:

    Dim appItems as Outlook.Items
    Set appItems = oFolder.Items
    
    Set oAppointment = appItems.Find(sFilter)
         While TypeName(oAppointment) <> "Nothing"
             MsgBox oAppointment.Subject & vbCr & _
                    oAppointment.Start & vbCr & _
                    oAppointment.End
             Set oAppointment = appItems.FindNext
         Wend
    

    当您从文件夹询问 Items 属性时,会返回一个新的 Items 实例,因此进一步的 FindNext 调用没有任何意义。

    在以下文章中详细了解Find/FindNext 方法:

    您还可能希望包含重复出现的事件,在这种情况下,您需要在 Items 集合上设置相应的属性:

    Dim appItems as Outlook.Items
    Set appItems = oFolder.Items
    
    appItems.Sort "[Start]"  
    appItems.IncludeRecurrences = True
    
    Set oAppointment = appItems.Find(sFilter)
         While TypeName(oAppointment) <> "Nothing"
             MsgBox oAppointment.Subject & vbCr & _
                    oAppointment.Start & vbCr & _
                    oAppointment.End
             Set oAppointment = appItems.FindNext
         Wend
    

    如果Items 集合应包含重复模式,则该属性返回一个布尔值,指示True

    此属性仅在Items 集合包含约会且未按Start 以外的任何属性按升序排序时才有效。默认值为False。当您想要检索给定日期的所有约会时使用此属性,其中经常性约会通常不会出现,因为它们与任何特定日期无关。如果您需要对包含重复约会的约会项目进行排序和筛选,则必须按以下顺序进行:按升序对项目进行排序,将IncludeRecurrences 设置为True,然后筛选项目。

    【讨论】:

    • 您好,谢谢!我已经找到了一个不同的解决方案,使用restrict 而不是find/findnext,它几乎完全符合我的要求。它有时无法找到所有约会。背景是,我想删除它找到的这些约会,所以我只是将整个事情包装到一个 while 循环中,直到限制从查询中返回 0 个约会。不是 100% 完美,但现在可以正常工作。
    猜你喜欢
    • 2019-11-25
    • 2014-02-28
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多