使用日期時間比較篩選項目
篩選行事曆資料夾中的週期性項目
若要篩選含有週期性約會的約會項目集合,您必須使用 Items 集合。 使用 Items.IncludeRecurrences 屬性指定 Items.Find 或 Items.Restrict 應包含週期性約會。 Table 物件只傳回代表週期性約會項目的一列,而不是每個約會發生點各有一列。
比較字串的日期時間格式
Outlook 會依照 Windows [控制台] 的 [地區及語言選項] Applet 中的時間格式、簡短日期格式及完整日期格式設定,來評估日期時間值。 亦即,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 查詢中以命名空間參照屬性時,比較會將屬性值及日期時間比較字串評估為 Coordinated Universal Time (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 屬性值等於今天的項目 |
明天 | %tomorrow (「 SchemaName」) % | 限制 SchemaName 屬性值等於明天的項目 |
昨天 | %yesterday (「 SchemaName」) % | 限制 SchemaName 屬性值等於昨天的項目 |
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 支援與意見反應。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應