Share via


日付/時刻を比較してアイテムをフィルターにかける

予定表フォルダーの定期的な予定をフィルターにかける

定期的な予定を含む予定アイテムのコレクションをフィルター処理するには、 Items コレクションを使用する必要があります。 Items.IncludeRecurrences プロパティを使用して、 Items.Find または Items.Restrict の処理に定期的なアイテムを含めるように指定します。 Table オブジェクトは、繰り返された予定ごとに行を返すのではなく、定期的なアイテムを表す行を 1 つだけ返します。

比較文字列の日付と時刻の書式

日付と時刻の値は、Windows のコントロール パネルの [地域と言語のオプション] アプレットで設定されている時刻の形式、短い日付形式、および長い日付形式に従って評価されます。 特に、Outlook は秒のない指定された時刻の形式に従って時刻を評価します。 日時の比較文字列に秒を指定すると、フィルターが期待通りに動作しません。

日付と時刻は、通常、日付の書式で格納されますが、Jet 構文および DAV Searching and Locating (DASL) 構文を使用するフィルターでは、日付と時刻の値を文字列表記に変換する必要があります。 Jet 構文では、日付と時刻の比較文字列は二重引用符または単一引用符のどちらかで囲む必要があります。 DASL 構文では、日付と時刻の比較文字列は単一引用符で囲む必要があります。

日付と時刻の比較文字列が Microsoft Outlook で想定どおりに書式設定されていることを確認するには、Visual Basic for Applications Format 関数 (またはプログラミング言語で同等のもの) を使用します。 次の例は、現地時刻で 2005 年 6 月 12 日午後 3 時 30 分より前に変更されたすべての連絡先を検索する Jet フィルターを作成します。

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 への変換を簡単に行う 1 つの方法は、 Row オブジェクトの LocalTimeToUTC というヘルパー関数を使用することです。 次のコード行は、このヘルパー関数を使用して LastModificationTime プロパティ (すべての Table オブジェクトに含まれる既定の列) の値を変換します。

Row.LocalTimeToUTC("LastModificationTime")

Outlook の日付と時刻のマクロ

次に示す日付マクロは、指定された日付と時刻のプロパティの値を、特定の UTC の日付と比較するフィルター文字列を返します。SchemaName は、名前空間によって参照される任意の有効な日付と時刻のプロパティです。

メモ Outlook の日時マクロは DASL クエリでのみ使用できます。

Macro 構文 説明
今日 %today(" SchemaName")% SchemaName プロパティの値が今日のアイテムに制限
tomorrow %tomorrow(" SchemaName")% SchemaName プロパティの値が明日のアイテムに制限
yesterday %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 に適用する 3 つのフィルター文字列を示しています。 この例では、まず PropertyAccessor.LocalTimeToUTC を使用して今日の日付を UTC 日付文字列に変換します。 最初のフィルターでは、Outlook の today というマクロを使用して、 ReceivedTime プロパティを UTC の今日の日付と比較するフィルター文字列を取得します。 2 番目と 3 番目のフィルターでは、別々の名前空間によって ReceivedTime プロパティを参照します。

最後にこの例では、まず Items.Restrict を使用し、次に Application.AdvancedSearch を使用して、3 番目のフィルターを受信トレイのアイテムに 2 回適用します。 そして、受信トレイにあるアイテムの数と、それぞれのフィルターの適用により返されたアイテムの数を表示します。

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 のサポートおよびフィードバックを参照してください。