※この記事の最新版はこちらへ移動しました。
はじめに
VBAを使ってOutlookを操作し、メールや予定の検索を行う際、Items.Find()
やItems.Restrict()
を使用する。このメソッドに指定するフィルター構文について分かった部分をまとめた。
MSドキュメント:https://docs.microsoft.com/ja-jp/office/vba/outlook/how-to/search-and-filter/filtering-items
Outlookのバージョン:Office 365
基礎知識
フィルターに指定できる構文は2つ。Jet構文とDASL構文。
Jet構文の方はSQLのWHERE句のような書き方。ただし前方一致検索がない。
DASL構文には前方一致検索があるが、ci_startswith
などci_
で始まる構文が使用できない。「検索操作にコンテンツ インデックス キーワードを使用することはできません。」のエラーになる。
Jet構文で使用できる列名(ぽいもの)は、VBAのMailItem
などのItemオブジェクトのプロパティと同じだと思われる。
文字列のフィルター
Jet構文のサンプル:
-
[Subject]='あいう'
- 件名が「あいう」に一致する。頭に
RE:
やFW:
が付いているものも含まれる。
- 件名が「あいう」に一致する。頭に
DASL構文のサンプル:
-
@SQL="urn:schemas:httpmail:subject" = 'あいう'
- 件名が「あいう」に一致する。頭に
RE:
などが付いていたら対象外。
- 件名が「あいう」に一致する。頭に
-
@SQL="urn:schemas:httpmail:subject" like 'RE:%'
- 件名が「RE:」で始まる(前方一致)
日付のフィルター
日付の書式は、「yyyy/MM/dd H:mm」。時刻は「HH」でも可。厳密には、Outlookが使っている書式に合わせる。
時刻までちゃんと指定しないと、[Start] >= '2020/06/10 0:00'
としたときに、6月10日0時開始の予定がフィルターに引っかからない。
-
[ReceivedTime] >= '2020/04/15'
- メールの受信日が2020/04/15以降
-
[Start] >= '2020/06/10 0:00' AND [End] <= '2020/06/30 0:00'
- 予定の開始日が6/10以降 かつ 終了日が6/30以前
Booleanのフィルター
-
[UnRead] = True
- メールが未読である
-
[AllDayEvent] = True
- 予定が「終日」である
列挙型のフィルター
Importance(重要度)などはVBAでは列挙型で指定するが、フィルター構文ではすべて数字へ置き換える。
-
[Importance] = 2
- 重要度が「高」である
MailItem (メール)
検索に使いそうなプロパティを載せておく。
プロパティ名 | 型 | 説明 |
---|---|---|
Subject | 文字 | 件名 |
SenderEmailAddress | 文字 | 送信者のメールアドレス |
ReceivedTime | 日付 | 受信日時 |
UnRead | Boolean | 未読かどうか |
AppointmentItem (予定)
プロパティ名 | 型 | 説明 |
---|---|---|
Subject | 文字 | 件名 |
Start | 日付 | 開始日時 |
End | 日付 | 終了日時 |
AllDayEvent | Boolean | 終日かどうか |
Location | 文字 | 場所 |