共用方式為


使用日期時間比較篩選項目

篩選行事曆資料夾中的週期性項目

若要篩選含有週期性約會的約會項目集合,您必須使用 Items 集合。 使用 Items.IncludeRecurrences 屬性指定 Items.FindItems.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.RestrictApplication.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 支援與意見反應