首页 > 解决方案 > 如何通过 VBA/DASL 在 Outlook 中搜索约会?

问题描述

我正在尝试循环浏览当天的特定约会并将其详细信息显示在 msgbox 中。

我发现了 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

标签: vbaoutlook

解决方案


如果要获得更多结果,则需要处理相同的 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

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

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


推荐阅读