日付/時刻を比較してアイテムをフィルターにかける
予定表フォルダーの定期的な予定をフィルターにかける
定期的な予定を含む予定アイテムのコレクションをフィルター処理するには、 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 のサポートおよびフィードバックを参照してください。