使用日期-时间比较筛选项目
筛选“日历”文件夹中的定期项目
若要筛选包含定期约会的约会项目集合,必须使用 Items 集合。 使用 Items.IncludeRecurrences 属性指定 Items.Find 或 Items.Restrict 应包含定期约会。 对于一个定期约会项目, Table 对象只返回一行,而不是该约会每出现一次就返回一行。
比较字符串的日期-时间格式
Outlook 根据 Windows"控制面板"中"区域和语言选项"小程序中的时间格式、短日期格式和长日期格式设置来计算日期-时间值。 具体来讲,Outlook 是根据指定的时间格式(忽略秒数)来计算时间。 如果在日期-时间比较字符串中指定了秒数,则筛选器将无法正常运行。
虽然日期和时间通常采用日期格式进行存储,但使用 Jet 和 DAV 搜索和定位 (DASL) 语法的筛选器要求用字符串的形式表示日期-时间值。 在 Jet 语法中,日期-时间比较字符串应用双引号或单引号括起来。 在 DASL 语法中,日期-时间比较字符串应用单引号括起来。
为了确保日期-时间比较字符串的格式符合 Microsoft Outlook 的要求,请使用 Visual Basic for Applications 的 Format 函数(或使用其他编程语言中的等效函数)。 下面的示例创建一个 Jet 筛选器,以查找在本地时间 2005 年 6 月 12 日下午 3:30 以前修改过的所有联系人。
criteria = "[LastModificationTime] < '" _
& Format$("6/12/2005 3:30PM","General Date") & "'"
比较中使用的时区
在 Jet 查询中使用显式字符串名称引用显式内置属性时,比较会将属性值和日期时间比较字符串评估为本地时间值。
在 DASL 查询中通过命名空间引用属性时,比较操作会作为协调世界时 (UTC) 值计算属性值和日期-时间比较字符串。 例如,以下 DASL 查询会查找在 UTC 时间 2005 年 6 月 12 日下午 3:30 以前修改过的所有联系人。
criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _
& " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"
转换为 DASL 查询使用的 UTC
由于 DASL 查询总是采用 UTC 格式执行日期-时间比较,因此如果在比较字符串中使用日期文字,则必须使用它的 UTC 值进行比较。 使用 Row.LocalTimeToUTC 帮助程序函数或 Outlook 日期时间宏来促进转换。
LocalTimeToUTC
帮助将本地时间转换为 UTC 的一种方式是使用 Row 对象的 Helper 函数 LocalTimeToUTC 。 下面的代码行即使用此 Helper 函数转换 LastModificationTime 属性(该属性是所有 Table 对象的一个默认列)的值:
Row.LocalTimeToUTC("LastModificationTime")
Outlook 日期-时间宏
下面列出的日期宏将返回筛选器字符串,这些字符串可将给定的日期-时间属性值与采用 UTC 的指定日期进行比较;SchemaName 可以是任何通过命名空间引用的有效日期-时间属性。
注意 Outlook 日期时间宏只能在 DASL 查询中使用。
宏 | 语法 | 说明 |
---|---|---|
今天 | %today (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于 today |
tomorrow | %tomorrow (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于 tomorrow |
yesterday | %yesterday (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于 yesterday |
next7days | %next7days (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于随后 7 天 |
last7days | %last7days (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于最近 7 天 |
nextweek | %nextweek (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于下周 |
thisweek | %thisweek (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于本周 |
lastweek | %lastweek (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于上周 |
nextmonth | %nextmonth (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于下个月 |
thismonth | %thismonth (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于本月 |
lastmonth | %lastmonth (“ SchemaName”) % | 限定项目的 SchemaName 属性值等于上个月 |
演示转换为 UTC 的示例
下面的代码示例列举了三个返回今天收到的所有邮件的筛选器字符串,并将其中一个筛选器应用到 Items.Restrict 和 Application.AdvancedSearch 。 该示例首先使用 PropertyAccessor.LocalTimeToUTC 将今天的日期转换为 UTC 日期字符串。 第一个筛选器使用 Outlook 宏 today 获取一个筛选器字符串,此字符串将 ReceivedTime 属性与 UTC 格式的今天的日期进行比较。 第二个和第三个宏通过两个不同的命名空间引用 ReceivedTime 属性。
最后,此代码示例将第三个筛选器分两次应用到"收件箱"中的项目,第一次使用 Items.Restrict ,第二次使用 Application.AdvancedSearch 。 该示例将显示"收件箱"中的项目数以及从每次应用筛选器后返回的项目数。
Public blnSearchComp As Boolean
Sub TestDASLDateComparison()
Dim strFilter As String
Dim colItems As Outlook.Items
Dim colRestrict As Outlook.Items
Dim oSearch As Outlook.Search
Dim oResults As Outlook.Results
Dim datStartUTC As Date
Dim datEndUTC As Date
Dim oMail As MailItem
Dim oPA As PropertyAccessor
Const SchemaPropTag As String = _
"https://schemas.microsoft.com/mapi/proptag/"
'Get items from Inbox
Set colItems = _
Application.Session.GetDefaultFolder(olFolderInbox).Items
'This code is a workaround to get today's date
'as UTC for DASL date comparison
Set oMail = Application.CreateItem(olMailItem)
Set oPA = oMail.PropertyAccessor
datStartUTC = oPA.LocalTimeToUTC(Date)
datEndUTC = oPA.LocalTimeToUTC(DateAdd("d", 1, Date))
'All three filters shown below will return the same results
'This filter uses DASL date macro for today
strFilter = "%today(" _
& AddQuotes("urn:schemas:httpmail:datereceived") & ")%"
'This filter uses urn:schemas:httpmail namespace
strFilter = AddQuotes("urn:schemas:httpmail:datereceived") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes("urn:schemas:httpmail:datereceived") _
& " < '" & datEndUTC & "'"
'This filter uses https://schemas.microsoft.com/mapi/proptag
strFilter = AddQuotes(SchemaPropTag & "0x0E060040") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes(SchemaPropTag & "0x0E060040") _
& " < '" & datEndUTC & "'"
'Count of items in Inbox
Debug.Print (colItems.Count)
'This call succeeds with @SQL prefix
Set colRestrict = colItems.Restrict("@SQL=" & strFilter)
'Get count of restricted items
Debug.Print (colRestrict.Count)
Set oSearch = Application.AdvancedSearch("Inbox", strFilter, False)
While blnSearchComp = False
DoEvents
Wend
'Get count from Search object
Set oResults = oSearch.Results
Debug.Print (oResults.Count)
End Sub
Public Function AddQuotes(ByVal SchemaName As String) As String
On Error Resume Next
AddQuotes = Chr(34) & SchemaName & Chr(34)
End Function
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
MsgBox "The AdvancedSearchComplete Event fired"
blnSearchComp = True
End Sub
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。