OUTLOOK VBA 検索に関するリンクのまとめ

#はじめに
[OUTLOOK VBA オブジェクトまとめ](http://qiita.com/Q11Q/items/ac14d96c00e707de5d13)
[OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足 StoreオブジェクトはVBSで使用できる](http://qiita.com/Q11Q/items/c42099d1365a2f8a6298)
[OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足2 未完のSearchFolder](http://qiita.com/Q11Q/items/476fd5c6c5d54d65e19e)
[OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足3 SearchFolderを別角度から](http://qiita.com/Q11Q/items/1f1199a3faefd8978d86)
と続いてきているのですが、とにかく検索に関するVBAで必要な知識が多すぎる気がします。
 とくに検索に関しては非常に混乱するところです。
読むのが嫌な人が大半だと思うので、サンプルを集めています。[OUTLOOK VBA 検索のサンプル](http://qiita.com/Q11Q/items/419f52a8e6fa3504c9ff)今メール中心ですが、大体メール以外検索しないと思うので、参考になるかと思いますし、サンプルを改造した方がはるかに速いです。なぜこうなるのかというのを考えるほうが大変です。
　これはOutlook2007の新機能からスタートしたようです。
　検索の考え方は次のようになっているようです。

    - 検索するフォルダを決める
    - 検索するフィルタを決める。
    - 検索したアイテムのコレクションを作るかテーブルを作る。（人間には見えませんがOUTLOOKは表を作っているようです）
    - というかMSは表のことをテーブルと言ったりシートと言ったりバラバラですね・・・
    - 検索したコレクションかテーブルにフィルタをさらにかける（かけられない場合もあります）
    - この結果を出力する、検索フォルダを作るなどする


####検索は9種類、使うのは３つ
　検索の手法はまず8種類ありますが、主に使うのはResitrict、Advancedsearch、Tabeleです。
　なぜかというと、コレクションやテーブルをつくるのがこの3種類だからです。
　そして、検索には検索する条件をどのように書くか、が問題となります。
　この検索に関するフィルターはJETとDAV（DASL)ある。
　フィルターには Jet 構文または DASL 構文で記述したクエリを含める必要がありますが、両方の構文を混在させることはできない。
  Jetはこんな感じでわかりやすいが、ADVANCEDSeachで使えないという欠点がある。また~~Items.FindはJetのみ~~Item.Findも制限はあるがDASLが使える。~~したがって、ItemsFindを忘れると、捨てようと思えば捨てられますが~~DASLやPropIDは非常にわかりにくいという欠陥がある。
 Jetの書式         Filtere:= "[Subject] = ’hogehoge’"
 DAV or DASL       Filtere:= "@SQL=urn:schemas:httpmail:datereceived
 PropertyAccessor  Filter = "@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'can''t'"
のような書き方があり、DASLのurn:Shemaまでが人間の忍耐の限界でしょう。またDSALの場合、日付をutcに変える必要があります。
　また**@SQL**をプレフィックスとマイクロソフトは呼んでおり、メソッドによってつけない場合があります。
　urn:Schemaのリストもこのページの下の方にあります。
　Propタグは[OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足2 未完のSearchFolder](http://qiita.com/Q11Q/items/476fd5c6c5d54d65e19e)の下の方にありますが800種類を超えており、人間が検索に使える代物とは到底思えません。
 OUTLOOKの検索のスキルはまずMailItemで検索の仕方をつかんで、必要ならタスク、アドレス、予定表に広げるほうが良いでしょう。
　そしてどうしても上の２つで見つからないとき3番目のPropertyAccessorを使用するか全リストをAccessにExportすることを検討してください。
　現在開いているメールフォルダのアイテムのACCESSのデータベースはこちらで造ることができます。
　[ACCESS VBA OutLookのメールのプロパティをテーブルに記録するマクロを改造する（2） How to make Mail Property access table](http://qiita.com/Q11Q/items/669d56af1d90fed48fa6)


##OUTLOOKのVBAで検索をするための事前準備
これは以前も書いていますが、あらためて
1.ThisoutlookSessionに下記のコードをかく
2.モジュールレベルの変数の宣言
3.クィック検索を有効にする

3は2013以降は無効にはできず、範囲を変える程度のようです、
Outlook2007は[こちらから クイック検索を有効または無効にする](https://support.office.com/ja-jp/article/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E6%A4%9C%E7%B4%A2%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%BE%E3%81%9F%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-1a3bb0b3-49ce-4ce4-abae-7cc8ec82b494)
Outlook2010は[こちらから クイック検索を有効または無効にする](https://support.office.com/ja-jp/article/%25E3%2582%25AF%25E3%2582%25A4%25E3%2583%2583%25E3%2582%25AF%25E6%25A4%259C%25E7%25B4%25A2%25E3%2582%2592%25E6%259C%2589%25E5%258A%25B9%25E3%2581%25BE%25E3%2581%259F%25E3%2581%25AF%25E7%2584%25A1%25E5%258A%25B9%25E3%2581%25AB%25E3%2581%2599%25E3%2582%258B-97975193-8f1f-4f0e-b8cd-0cfd35a5703b?ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1)
OUTLOOK 2013は[こちらがわかりすいかも WaniちゃんのHP](http://www.wanichan.com/pc/outlook/2013/1/39.html)
OUTLOOK 2016は[こちらがわかりすいかも WaniちゃんのHP](http://www.wanichan.com/pc/outlook/2016/1/36.html)
1のコードは次の通り

```vbnet:AdvancedSearchComplete
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
'タグがTestから始まる時は以外は検索オブジェクトに格納されたデータの整合性を確保するため、 AdvancedSearchCompleteイベント サブルーチンとなります

’https://msdn.microsoft.com/ja-jp/library/office/ff869970.aspx
 Dim objRsts As Outlook.Results
  Dim Item As Outlook.MailItem
  Debug.Print "The AdvancedSearchComplete Event fired"  
    If SearchObject.Tag Like "Test*" Then  
        blnSearchComp = True  
 Else 
  MsgBox "The search " & SearchObject.Tag & "has finished. The filter used was " & _
 SearchObject.Filter & "."
 Set objRsts = SearchObject.Results
 
 'Print out number in results collection
 MsgBox objRsts.Count
  'Print out each member of results collection
For Each Item In objRsts
 MsgBox Item
Next
 End If 
End Sub
Private Sub Application_AdvancedSearchStopped(ByVal SearchObject As Search)
    'Inform the user that the search has stopped.
    MsgBox "An AdvancedSearch has been interrupted and stopped. "
    blnSeachStop = True
End Sub

```

##AdvancedSearchのためのパブリック変数を宣言
標準モジュールのDeclareに

```vbnet
Public blnSearchComp As Boolean
Public blnSearchStop As Boolean
```
と書く。

##サブルーチンと関数

###Items.restrict用メールをMSG形式で保存するProsedure
```vbnet
Sub DownloadSearchedMailItem(MyMailItm As Object)
Dim myItem As MailItem
Dim NS As NameSpace
Dim objOutlook
Dim olIns As Inspector
Dim EX As Explorer
Dim objFol As Outlook.Folder
Dim FSO As New FileSystemObject
Dim tempFol As Object, strtempFOl As String
Dim strfile As String, strSender As String, Dt As Date
'Dim ADOS As New ADODB.Stream
Dim strMal()
Dim adreadall As String
Dim objTempFile As Object, strBase
'Dim wDoc As Word.Document
Dim StrSPFolder As String, cnt As Integer
Dim oSFol As Object, RSChr As String, strSub As String
Dim objOlFolder As Outlook.Folder
Dim Ar As Variant
Dim ArR() As Variant, iArR As Long, strRecip As String
Dim Reg As RegExp
Const SendFolderName As String = "送信済みアイテム"
Const ReceiveFolderName As String = "受信トレイ"
Const strSendChr = "S"
Const strReceiveChr = "R"
Set myItem = MyMailItm
With CreateObject("WScript.Shell")
StrSPFolder = .SpecialFolders("mydocuments")
Set oSFol = FSO.GetFolder(StrSPFolder)
End With
'Set objOutlook = CreateObject("Outlook.Application")
Set NS = Application.GetNamespace("MAPI")
Set olIns = myItem.GetInspector: DoEvents
Ar = Split(olIns.CurrentItem.Parent.FullFolderPath, "\"): DoEvents
cnt = 0: RSChr = ""
For cnt = UBound(Ar) To LBound(Ar) Step -1
If Ar(cnt) = SendFolderName Or Ar(cnt) = "Sent Items" Or Ar(cnt) = "送信トレイ" Then
RSChr = strSendChr: Exit For
ElseIf Ar(cnt) = ReceiveFolderName Or Ar(cnt) = "Inbox" Or olIns.CurrentItem.Parent.FullFolderPath = ReceiveFolderName Then
RSChr = strReceiveChr: Exit For
End If
Next
If RSChr = "" Then Exit Sub

Dt = myItem.ReceivedTime
strSub = replaceNGchar("件名_" & Left(myItem.Subject, 15) & "_")
strfile = ""
'////sstrSenderの定義
strSender = ""
'////送信の場合
If RSChr = strSendChr Then
For iArR = 1 To myItem.Recipients.Count
ReDim Preserve ArR(1 To iArR)
strRecip = CStr(myItem.Recipients.Item(iArR))
Set Reg = New RegExp
Reg.Global = True
Reg.IgnoreCase = False
Reg.Pattern = "（.+?.）$"
strRecip = Reg.Replace(strRecip, " ")
ArR(iArR) = Replace(strRecip, " ", "", 1, -1, vbTextCompare)
Set Reg = Nothing
Next
If UBound(ArR) = 1 Then strSender = Replace(CStr(ArR(1)), "'", "", 1) & "_全" & "1名" Else strSender = Replace(CStr(ArR(1)), "'", "", 1) & "他" & UBound(ArR) - 1 & "名"
'////受信の場合
ElseIf RSChr = strReceiveChr Then
Set Reg = New RegExp
strSender = Mid(CStr(myItem.Sender), 1, 10)
Reg.Global = True
Reg.IgnoreCase = False
Reg.Pattern = "（.+?.）$"
strSender = Replace(Replace(Reg.Replace(strSender, " "), " ", ""), "　", "")
Set Reg = Nothing
End If

'////ファイルの重複を回避
strBase = StrSPFolder & "\" & Format(CDate(Dt), "YYYYMMDDhhmmss") & RSChr & strSender & "_" & strSub
strfile = strBase & ".msg"
If FSO.FileExists(strfile) = True Then
i = 1
Do
If FSO.FileExists(strBase & "(" & i & ")" & ".msg") = False Then
strfile = strBase & "(" & i & ")" & ".msg"
myItem.SaveAs strBase & "(" & i & ")" & ".msg", olMSGUnicode
Exit Do
End If
i = i + 1
Loop
Else
myItem.SaveAs strfile, olMSGUnicode
End If
End Sub

'[OUTLOOK VBA クィックアクセスツールバー用 選択したメールをmsg形式で保存する](http://qiita.com/Q11Q/items/30f4234b9b191cf17618)をすでにコピペしている場合、以下は重複するので不要です
Public Function replaceNGchar(ByVal sourceStr As String, _
Optional ByVal replaceChar As String = "") As String

Dim tempStr As String

tempStr = sourceStr
tempStr = Replace(tempStr, "\", replaceChar)
tempStr = Replace(tempStr, "/", replaceChar)
tempStr = Replace(tempStr, ":", replaceChar)
tempStr = Replace(tempStr, "*", replaceChar)
tempStr = Replace(tempStr, "?", replaceChar)
tempStr = Replace(tempStr, """", replaceChar)
tempStr = Replace(tempStr, "<", replaceChar)
tempStr = Replace(tempStr, ">", replaceChar)
tempStr = Replace(tempStr, "|", replaceChar)
tempStr = Replace(tempStr, "[", replaceChar)
tempStr = Replace(tempStr, "]", replaceChar)

replaceNGchar = tempStr
End Function
```

MicroSoftのヘルプにはこのApplication_AdvancedSearchCompleteに2パターンある

```vbnet
'https://msdn.microsoft.com/ja-jp/library/office/ff866933.aspx
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)  
    Debug.Print "The AdvancedSearchComplete Event fired"  
    If SearchObject.Tag = "Test" Then  
        m_SearchComplete = True  
    End If  
End Sub
```

```
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search) 

  Dim objRsts As Outlook.Results 
  Dim Item as Outlook.MailItem 
 MsgBox "The search " & SearchObject.Tag & "has finished. The filter used was " & _ 
 SearchObject.Filter & "." 
 Set objRsts = SearchObject.Results 
 'Print out number in results collection 
 MsgBox objRsts.Count 
 'Print out each member of results collection 
 For Each Item In objRsts 
 MsgBox Item 
 Next 
End Sub
Private Sub Application_AdvancedSearchStopped(ByVal SearchObject As Search)
    'Inform the user that the search has stopped.
    MsgBox "An AdvancedSearch has been interrupted and stopped. "
    blnSeachStop = True
End Sub
```
しかしイベントにはどちらか一つしか書けない。上のものはWhile Wendで検索が終わるまで待つために使う。
そこでタグを利用し上の待機機能を使う場合はタグをtestに設定し、後者の場合はそれ以外の名前のタグを使うようにするとよいと思う。



##[ビューのフィルターと高度な検索のクエリ ビルダーを使用する方法を [OL]](https://support.microsoft.com/ja-jp/help/307922/ol-how-to-use-the-query-builder-for-view-filters-and-advanced-searches)
クエリ ビルダーは、Microsoft Outlook 98、Outlook 2000 および Outlook 2002 で使用できる機能です。
しかしこの機能のためにはレジストリを設定する必要があった。
##[Search オブジェクトの使用](https://msdn.microsoft.com/ja-jp/library/cc326051.aspx)
 - Outlook Version 2002 が最初のようだ。
 - Search オブジェクトは、さまざまな異なる種類のデータに対して、複雑なクエリの作成と実行を可能にするために、SQL と似た構文を使用する。
 - この新しい検索機能以外にも、クエリの結果を使ってプログラムからの検索を可能にする Results コレクションを装備しています。

この記事では、Outlook の検索機能を説明し、以下の項目に関する詳細な例を提供します。 
[Win32OLE 活用法 【第 5 回】 Outlook - Rubiest Magazine](http://magazine.rubyist.net/?0007-Win32OLE)[魚拓](http://megalodon.jp/2017-0407-1904-16/magazine.rubyist.net/?0007-Win32OLE)
　Ruby用だが、ここにもSearchという観点からオブジェクトの順位があるので参考になる。
 これが悲劇の始まりだが、このころはMSも丁寧に書いている。システムの概要が一番親切なのはここではないか。
#[<開発者向け> Microsoft Office Outlook 2007 の新機能 (2/2)](https://msdn.microsoft.com/ja-jp/library/bb226714(v=office.12).aspx)


#以下、検索とフィルター処理 (Outlook)の一覧
#[概要 (Outlook の検索とフィルター処理） ](https://msdn.microsoft.com/ja-jp/library/office/jj973106.aspx)
##[フォルダー内のアイテムの列挙、検索、フィルター](https://msdn.microsoft.com/ja-jp/library/office/ff869362.aspx)
###[アイテムの列挙](https://msdn.microsoft.com/ja-jp/library/office/ff869362.aspx#%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%AE%E5%88%97%E6%8C%99)
###[アイテムの検索及びフィルタ](https://msdn.microsoft.com/ja-jp/library/office/ff869362.aspx#%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%8A%E3%82%88%E3%81%B3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC)
####Application.AdvancedSearch
 Search オブジェクトの条件を設定し、その Search オブジェクトを返します。検索結果は Search.Results に設定されます。Search.Save は、検索結果を使用して検索フォルダーを更新します。
**@SQL= のプレフィックスがない DASL クエリのみ使用可能です。**
**検索の整合性を保つため、イヴェントプロシージャを使う必要がある**
標準モジュールに上記のパブリック変数の宣言
Public blnSearchComp As Boolean
Public blnSearchStop As Boolean
とThisOutlookSessionに上記の2つのイヴェントプロシージャが入っているという前提で、標準モジュールのパターンは基本的に次のようになる。

```vbnet:AdvancedSearchPattern
Sub StartAdvSerch()
blnSearchComp = False
blnSearchStop = False

SearchForSubject strFilter:= _
                     "urn:schemas:httpmail:subject = 'Fiftieth Birthday Party'", _
                     strScope:="'Inbox', 'Calendar', 'Tasks'", blnSubfolderMatch:=False, strTag:="Test"
End Sub
Sub SearchForSubject(ByVal strFilter As String, ByVal strScope As String, ByVal blnSubfolderMatch As Boolean, ByVal strTag As String)
'複数のフォルダ内で特定の件名を持つ
'すべてのアイテムを検索します。
Dim objSch As Outlook.Search
Dim olRsts As Outlook.Results
On Error GoTo olSearchErr_Handle
    Set objSch = Application.AdvancedSearch(strScope, strFilter, blnSubfolderMatch, strTag)
While blnSearchComp = False
        DoEvents
Wend
If objSch > 0 Then Set olRsts = objSch Else Exit Sub

Exit Sub
olSearchErr_Handle:
If Not objSch Is Nothing Then
  objSch.Stop
Else
  If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description
  Exit Sub
End If
While blnSearchStop = False
DoEvents
Wend
End Sub
Public Function AddQuotes(ByVal SchemaName As String) As String 
    On Error Resume Next 
    AddQuotes = Chr(34) & SchemaName & Chr(34) 
End Function 
```

####Folder.GetTable
指定されたフィルターに基づいて、フォルダー内のアイテムの Table を返します。
バイナリ プロパティ、HTML 形式または RTF 形式の本文の内容など、特定のプロパティは Table フィルターでサポートされていません。詳細については、「Table オブジェクトまたは Table フィルターのサポートされていないプロパティ」を参照してください。

####Items.Find
指定されたフィルターに一致する最初のアイテムを検索します。
Body など、特定のプロパティはフィルターでサポートされていません。詳細については、Items.Find を参照してください。
Items コレクションでコンテンツのインデックス検索を使用するには、Restrict メソッドを使用します
これだけが使えるフィルタがJetのみ。最初のアイテムだけしか検索しないといういい加減。(Offic2010以前)
Office2013以降はDASLが使えるが、フィルター内でクエリ キーワード ci_phrasematch または ci_startswithは使えない(エラーになる）。 
https://msdn.microsoft.com/ja-jp/library/office/ff869362.aspx
この表ではDASLは適用なし
https://msdn.microsoft.com/ja-jp/library/office/ff863965.aspx
こちらの表ではDASL適用可能（制限アリ）
https://msdn.microsoft.com/ja-jp/library/office/ff869662.aspx
Find MethodではDASLは適用可能と説明があり、しかも
####Items.Restrict
指定されたフィルタに基づいて現在のアイテムのセットにフィルターをかけ、新しい Items コレクションを返します。
Body など、特定のプロパティはフィルターでサポートされていません。詳細については、Items.Restrict を参照してください。
Outlook 2007よりItems.Restrict に対して DASL クエリを使用できるようになった。DASL クエリにはプレフィックス @SQL= を使用する必要がある。

####Search.GetTable
Application.AdvancedSearch から派生した任意のフィルターに基づいて、検索フォルダー内のアイテムの Table を返します。
検索フォルダー
なし
Search.GetTable は、Application.AdvancedSearch から返された Search オブジェクト (具体的には Search.Filter プロパティ) からフィルターを派生します。

####Table.Restrict
指定されたフィルターに基づいて現在のテーブルの行にフィルターをかけ、新しい Table オブジェクトを返します。
バイナリ プロパティ、HTML 形式または RTF 形式の本文の内容など、特定のプロパティは Table フィルターでサポートされていません。詳細については、「Table オブジェクトまたは Table フィルターのサポートされていないプロパティ」を参照してください。
###Table.FindRow
 Outlook2007より追加された
 ci_phrasematch または ci_startswith を使用するとエラーが発生します。 
####View.Filter
ビューの XML を変更せずに、ビューのフィルターを設定します。ビューのフィルターを設定しても、ユーザー インターフェイスのビューが変更されるだけで、Items コレクションにフィルターが適用されるわけではありません。
フォルダー
なし
@SQL= のプレフィックスがない DASL クエリのみ使用可能です。
####View.XML
View XML の使用は適切ではありません。ビューをプログラミングするには、View オブジェクト モデルを使用してください。 

##]フォルダー内のアイテムを並べ替える](https://msdn.microsoft.com/ja-jp/library/office/ff868804.aspx)
###フォルダー内のアイテムを並べ替える

#[テーブル](https://msdn.microsoft.com/ja-jp/library/office/jj973094.aspx)
##[Table オブジェクトに列を追加する](https://msdn.microsoft.com/ja-jp/library/office/ff868916.aspx)
###Table オブジェクトに列を追加する
##[Table オブジェクトに表示される既定のプロパティ](https://msdn.microsoft.com/ja-jp/library/office/ff865868.aspx)
###[すべての種類のフォルダーで返される列](https://msdn.microsoft.com/ja-jp/library/office/ff865868.aspx#%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%A7%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B%E5%88%97)
###[予定表フォルダ](https://msdn.microsoft.com/ja-jp/library/office/ff865868.aspx#%E4%BA%88%E5%AE%9A%E8%A1%A8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AE%E5%88%97)
###連絡先フォルダ
###タスクフォルダ

##[Table クラスと View クラスのプロパティ値表示に影響を与える要因](https://msdn.microsoft.com/ja-jp/library/office/ff861324.aspx)
###文字列プロパティに対すするストアプロバイダーの影響
###日付のプロパティ、バイナリプロパティ、及び複数値を持つプロパティを参照する影響

##[Table オブジェクトまたは Table フィルターのサポートされていないプロパティ](https://msdn.microsoft.com/ja-jp/library/office/ff861005.aspx)
###Table オブジェクトに追加できないプロパティ、または Table フィルターで使用できないプロパティの一覧

###計算が必要なプロパティはサポートしていない
####Columns.Add を使用して追加しようとすると、そのプロパティが明示的なプロパティ名または名前空間のどちらで参照されたかにかかわらず、エラーIDS_ERR_BLOCKED_PROPERTY
このトピックでは、Table オブジェクトに追加できないプロパティ、または Table フィルターで使用できないプロパティの一覧を示します。これらのプロパティを Columns.Add によって追加したり、次のメソッドで使用されるフィルターに指定したりすることはできない。
- Folder.GetTable
- Search.GetTable (このフィルターは Application.AdvancedSearch によって返される Search オブジェクトから派生していることに注意してください)
- Table.FindRow
- Table.Restrict

#[フィルター](https://msdn.microsoft.com/ja-jp/library/office/jj973053.aspx)
##[アイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff863965.aspx)
###Outlook では、次のエントリ ポイントを通じてフィルター機能を提供している。
###プロパティの指定方法ガイドライン
###フィルターの構文

##[ユーザー定義フィールドをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff863459.aspx)
###JETクエリ
###DASLクエリ
###MAPI 文字列名前空間で参照されるカスタム プロパティのフィルター処理

##[ブール値を比較してアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff868827.aspx)
###ブール値の指定方法は、Microsoft Jet 構文と DAV Searching and Locating (DASL) 構文で異なります
###Jetクエリ
###DASLクエリ

##[キーワードのプロパティを比較してアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff867581.aspx)
###複数値を持つ文字列プロパティ
###Jetクエリ
###DASLクエリ

##[日付/時刻を比較してアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff866013.aspx)
###予定表フォルダーの定期的な予定をフィルターにかける
###比較文字列の日付と時刻の書式
###比較で使用されるタイム ゾーン
###DASL クエリのための UTC への変換
###LocalTimeToUTC
###Outlook の日付と時刻のマクロ
###UTC への変換の例

##[文字列を比較してアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff867646.aspx)
###このトピックでは、Microsoft Jet 構文および DAV Searching and Locating (DASL) 構文による文字列プロパティのフィルターのサポートについて説明します。
###文字列の区切り文字とエスケープ文字の使用

###Jet構文を使用した文字列比較
###DASL構文を使用した文字列比較
###等価一致
###先頭一致、語句一致、およびサブ文字列の一致
####Ci_startswith
####ci_phrasematch
####like

##[変数を使ってアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff864711.aspx)
###Microsoft Jet 構文または DAV の検索および検索 (DASL) 構文内のフィルターの一部として変数の値を使用できる
###フィルターの一部として変数を使用した例

##[整数値を比較してアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff869011.aspx)
###Microsoft Jet 構文または DAV Searching and Locating (DASL) 構文では、フィルター文字列の中で整数型のプロパティを整数値と比較できます。
####整数値を指定するときは、区切り文字の引用符を付けても付けなくてもかまいません。
###使用例：3 つのフィルター文字列は、重要度 (Importance) の値が "高" であるという条件でフィルターを実行します。

##[比較演算子と論理演算子を使ってアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff862140.aspx)
###[比較演算子](https://msdn.microsoft.com/ja-jp/library/office/ff862140.aspx#Anchor_0)
Microsoft Jet 構文または DAV Searching and Locating (DASL) 構文では、次の比較演算子をフィルター文字列で使用できます。
< > >= <= <> =
###[論理演算子](https://msdn.microsoft.com/ja-jp/library/office/ff862140.aspx#Anchor_1)
Jet 構文または DASL 構文では、論理演算子 And、Not、および Or をフィルター文字列で使用できます。これらの演算子の優先順位は、高いものから順に Not、And、Or となります。フィルターでかっこを使用すると、優先順位を明示的に指定できます。論理演算子の大文字と小文字は区別されません。
##[クエリ キーワードを使ってアイテムをフィルターにかける](https://msdn.microsoft.com/ja-jp/library/office/ff869374.aspx)
クエリ キーワードは、DAV Searching and Locating (DASL) クエリでのみ使用できます。
#### ci_startwith および ci_phrasematch
#####これらのコンテンツ インデックス キーワードは、インデックス ストア内のアイテムにそれぞれ一致するフレーズとプレフィックスを提供します。たとえば、次の DASL クエリは "Smith " で始まる姓のフィルターを作成し、結果を取得するためにコンテンツ インデックス キーワードを使用する。 
criteria = "@SQL=" & Chr(34) & "urn:schemas:contacts:sn" & Chr(34) & " ci_startswith 'Smith'"
#####次の DASL クエリは、姓が "Smith" である名前のフィルターを作成し、 結果を取得するためにコンテンツ インデックス キーワードを使用する。 
criteria = "@SQL=" & Chr(34) & "urn:schemas:contacts:sn" & Chr(34) & " ci_phrasematch 'Smith'"
####Is Null
プロパティが null であるかを評価します。プロパティが null の場合は True、プロパティが null でない場合は False を返します。Is Null は、日付プロパティが設定されているか、また文字列プロパティが空でないかを判断するのに有効です。日付が null の場合、日付の現地時刻の値は 1/1/4501 になります。
プロパティが null でないことを評価するために、Is Null キーワードを Not 演算子と組み合わせて使用することができます。
次の DASL クエリは、カスタム プロパティ 注文日 が null でなく、CompanyName プロパティが正確に Microsoft であるすべての連絡先を取得します。 
criteria = "@SQL=" & "(NOT(" & Chr(34) & "http://schemas.microsoft.com/mapi/string/" & "{00020329-0000-0000-C000-000000000046}/Order%20Date" & Chr(34) & " IS NULL) AND "  & Chr(34) & "urn:schemas-microsoft-com:office:office#Company" & Chr(34)  & " = 'Microsoft')"

####Categoryは連続した文字列として扱われて、このフィルタのパターンが適用される
####クエリ キーワードは、DAV Searching and Locating (DASL) クエリでのみ使用できる
####キーワードの大文字と小文字は区別されません。
####[Jet クエリ](https://msdn.microsoft.com/ja-jp/library/office/ff867581.aspx#Anchor_0)
Jetクエリでは、キーワード プロパティに関する語句一致のみを実行できます。Jet クエリで前方一致またはサブ文字列の一致を実行することはできない。
Table.Restrct
string filter  = "[Categories] = 'Partner'"
Partner の語句一致が見つかるアイテム Partner,Tier1 Parterは返るが PartenerShipは返らない
###[DASLクエリ](https://msdn.microsoft.com/ja-jp/library/office/ff867581.aspx#Anchor_1)
部分一致が可能
criteria = "@SQL=" & Chr(34) _ 
& "urn:schemas-microsoft-com:office:office#Keywords" _ 
& Chr(34) & " ci_startswith 'Partner'"

等価一致
criteria = "@SQL=" & Chr(34) _ 
& "urn:schemas-microsoft-com:office:office#Keywords" & Chr(34) _ 
& " = 'Book'"

 - このクエリでは、分類項目として Book を持つアイテムがすべて返され、そこには Book を含めた複数の分類項目で分類されるアイテムも含まれる。分類項目として Book を持たないアイテムは返されません。
 - 複数値を持つプロパティが名前空間による参照を使用して Table に追加された場合、そのプロパティの値の形式は配列になります。それぞれの値にアクセスするには、配列の要素を解析します。直前の例でこの方法を使用すると、分類項目として Partner だけを含むアイテムを取得することもできます。
#[検索](https://msdn.microsoft.com/ja-jp/library/office/jj973112.aspx)
###上記リンクの下に[アイテムを検索する](https://msdn.microsoft.com/ja-jp/library/office/ff869846.aspx)という重要な検索の方法の一覧表がある
|   | Application.AdvancedSearch   |Explorer.Search   |Search.GetTable|   
|:-:|:-----------------------------|:-----------------|:--------------|
|目的|指定されたフォルダー内のアイテムに対し、フィルターに基づいた検索をプログラムから実行します。|プログラムからコンテンツ インデクサー検索を実行します。これは、ユーザーが Outlook のユーザー インターフェイスから検索を実行した場合と同じように動作します。|以前の Application.AdvancedSearch から返された (Table 内の) アイテムにアクセスする効率的な方法を提供します。このエントリ ポイントでは、検索そのものは実行されません。|
|検索の範囲|検索パラメーターとして指定されたフォルダー。|SearchAllItemsパラメーターによって決定されます。SearchAllItemsが True の場合、メソッドは、入力 ( Explorer.CurrentFolderのDefaultItemTypeプロパティで指定された) 現在のフォルダーと同じフォルダーにあるすべてのフォルダーと検索の検索オプション] ダイアログ ボックスで選択されているすべてのストアの間で検索されます。 SearchAllItemsが False の場合は、このメソッドはExplorer.CurrentFolderで表されるフォルダーのみを検索します。 | Search オブジェクトは以前の Application.AdvancedSearch 操作から返されるため、Search.GetTable に関連付けられる検索の範囲は、以前に実行された Application.AdvancedSearch の検索範囲になります。|
|検索フィルター|DAV Searching and Locating (DASL) の構文で指定します。|Outlook の検索のユーザー インターフェイスでサポートされている任意の有効なキーワード。検索語句は二重引用符で区切られ、連結して 1 つの検索フィルター文字列を作成できます。|検索範囲と同様に、Search.GetTable に関連付けられる検索のフィルターは、以前に実行された Application.AdvancedSearch のフィルター パラメーターになります。|
|検索の完了|特定の検索が完了したことを確認するには、AdvancedSearchComplete イベントを使用する。|検索の完了を通知するコールバックは用意されていません。|検索は、以前に実行された Application.AdvancedSearch によって完了しています。Search.GetTable は検索結果を返すだけです。|
|検索結果|次のいずれかの方法で検索結果にアクセスします。(注)|検索結果は、現在のフォルダーを表すエクスプローラーに表示されます。エクスプローラーに表示されている検索結果を削除するには、Explorer.ClearSearch を呼び出します。|検索結果は Table に返されます。この結果には、以前の Application.AdvancedSearch から返されたものと同じアイテムのセットが格納されます。Table 内の各アイテムには限定されたプロパティのセットしか含まれないため、一般にこの方法では、より効率的に検索結果にアクセスできます。既定のプロパティ以外のプロパティを検索結果に含めるには、Columns.Add を使用して更新された Table を取得します。また、既定で返されるプロパティの 1 つにアイテムのエントリ ID があるため、GetItemFromID を使用してアイテム オブジェクトを取得することにより、Body や AutoResolvedWinner など、パフォーマンスの理由から Table オブジェクトではサポートされていない他のアイテム プロパティにアクセスすることもできます。|

(注)

 - Search.Results には、検索結果が Results コレクションとして格納されます。このコレクション内の各アイテムには、アイテムのすべてのプロパティが含まれる。
 - Search.Save は、検索結果を検索フォルダーに保存します。
 - これらも同じ結果のコレクションと同様の項目のセットを返しますが、各アイテムのプロパティの既定のセットのみが含まれます、そのため、一般的にパフォーマンスが向上する。

#[方法](https://msdn.microsoft.com/ja-jp/library/office/jj973150.aspx)

####[テーブル内の複数値を持つプロパティの値にアクセスします。](https://msdn.microsoft.com/ja-jp/library/office/ff869694.aspx)
####[効率的にテーブル オブジェクトを使用してフォルダー内のフィルター処理されたアイテムを列挙します。]()
####[メール アイテムの本文にフィルターを適用します。](https://msdn.microsoft.com/ja-jp/library/office/ff861580.aspx)
####[カテゴリを持たないアイテムをフィルターします。](https://msdn.microsoft.com/ja-jp/library/office/ff869279.aspx)
####[受信トレイで件名に"Office"を含むアイテムを検索します。](https://msdn.microsoft.com/ja-jp/library/office/ff862730.aspx)
####[部分的に行われる予定のまたは特定の期間だけでは、予定表を検索します。](https://msdn.microsoft.com/ja-jp/library/office/ff863946.aspx)
####[ある期間内の予定のうちで件名に特定の語を含むものを予定表で検索する](https://msdn.microsoft.com/ja-jp/library/office/ff867729.aspx)
####[検索し、総合的なビュー (Outlook) 内のアイテムを取得します。](https://msdn.microsoft.com/ja-jp/library/office/ff868826.aspx)
C言語のサンプルのみ


#[Restrict メソッド](https://msdn.microsoft.com/ja-jp/library/office/ff869597.aspx)
###アイテム数が少ない場合は、Find メソッドと FindNext メソッドの方が速く処理できます。
###戻り値 Items コレクション。フィルター条件に従って元の Items コレクションから抽出されたアイテムを表します。
###Find メソッドまたは Restrict メソッドでユーザー設定フィールドを使用するときは、ユーザー設定フィールドがフォルダー内で定義されている必要があります。定義されていない場合はエラーが発生します。"を含む" という条件のフィルターを適用することはできない。たとえば、Find または Restrict を使用して、[件名] フィールドに特定の文字列を含むアイテムを検索することはできない。この場合は、AdvancedSearch メソッドを使用してください

#Schemaのリスト
[urn:content-classes:message](https://msdn.microsoft.com/ja-jp/library/aa579702)
[urn:content-classes:appointment](https://msdn.microsoft.com/ja-jp/library/aa564537)
メッセージとアポイントだけのように見えるが、カレンダーなどいろいろなオブジェクトがこの２つに入っている。
[Web Distributed Authoring and Versioning (WebDAV) SEARCH](https://tools.ietf.org/search/rfc5323)

#PropIdのリスト
Propタグともいうかな。タイトルが違いすぎる
日本語は下のリンクですが、機械翻訳で意味があまりわからないうえ、オブジェクト名を中途半端に翻訳しているので英語よりわからないかもしれません。
Propidのリストは左側に出ています。
[MAPI Properties ](https://msdn.microsoft.com/en-us/library/ms529939.aspx?ranMID=24542&ranEAID=TnL5HPStwNw&ranSiteID=TnL5HPStwNw-XnYRxg3kvnfTzU52lflrvQ&tduid=(b47e973dd431f43776edb53922074de9)(256380)(2459594)(TnL5HPStwNw-XnYRxg3kvnfTzU52lflrvQ)())
[MAPI プロパティ(日本語) ](https://msdn.microsoft.com/ja-jp/library/cc815517.aspx)

#その他
[名前空間でプロパティを参照する](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx)
このトピックでは、PropertyAccessor、Table、View、およびこれらのサブオブジェクトによってサポートされる名前空間の一覧を示し、名前付きプロパティの参照について説明します。
##[Outlook オブジェクトによって使用される名前空間](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx#Anchor_0)

| 名前空間 | サポートされる Outlook オブジェクト |
|:---------|:------------------------------------|
|http://schemas.microsoft.com/mapi/proptag|/mapi/proptag|Outlook アイテム オブジェクト、AddressEntry、AddressList、Attachment、ExchangeDistributionList、ExchangeUser、Folder、Recipient、および Store オブジェクト |
|http://schemas.microsoft.com/mapi/id|上に同じ|
|http://schemas.microsoft.com/mapi/string|上に同じ|
|http://schemas.microsoft.com/mapi/exchange|上に同じ|
|urn:schemas-microsoft-com:office:office |Outlook アイテム オブジェクト|
|urn:schemas-microsoft-com:office:outlook|上に同じ|
|DAV:|上に同じ|
|urn:schemas:calendar|上に同じ|
|urn:schemas:contacts|上に同じ|
|urn:schemas:httpmail|上に同じ|
|urn:schemas:mailheader|上に同じ|
[アイテムの種類とメッセージ クラス](https://msdn.microsoft.com/ja-jp/library/office/ff861573.aspx)
アイテムのメッセージ クラスは MessageClass プロパティで定義され、どのフォーム上に表示するかを設定するために使います。次の表は、メッセージ クラスとそれに対応するフォームの一覧です。
というもともとはメールなどの入力フォームの標準のクラスを示すものだが、実はこれを使うことによって、メールかタスクかなどを区別するという検索に使えるクラスである。

|メッセージ クラス ID|対応するアイテム|
|:-------------------|:--------------:|
|IPM.Appointment|予定|
|IPM.Contact|連絡先|
|IPM.Note |電子メール|
|IPM.Task|タスク|
|IPM.Post|メモ|

ややこしいのがPostがメモでノートが電子メールなところ。どうしてこうなのか。

##[Outlook 2007 Auxiliary Reference >Reference > MAPI Additions Properties]( https://msdn.microsoft.com/en-us/library/bb927656(v=office.12).aspx)
####超重要 Prop tagの作り方が記載されている。
　このPR_系統はアドバンスドサーチで使用する。サンプルの6でやっている。
　全体としては主として文字列のプロパティである。日付などはない模様。
　[PR_SENDER_EMAIL_ADDRESS_W](https://msdn.microsoft.com/en-us/library/bb821087(v=office.12).aspx)をみると
　Contains the message sender's e-mail address, encoded in Unicode standard.
　標準のユニコードの送信者の電子メールのアドレスとある。
　 Const PR_SENDER_EMAIL_ADDRESS_W As String = "http://schemas.microsoft.com/mapi/proptag/0x0C1F001F"
　こちらのサンプルが[使用例](http://qiita.com/Q11Q/items/419f52a8e6fa3504c9ff#%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%9D%E3%81%AE6-create-an-outlook-2010-search-folder-using-vba%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%90%91%E3%81%91%E3%81%AB%E6%94%B9%E9%80%A0%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE)だが、
　 Property tag:0x0C1F001F
　 とあるのでPR_SENDER_EMAIL_ADDRESS_W As String は propタグの後に0x0C1F001Fを使えばよいということがわかる。
　 ただBCC系を見ると、未送信のメールはわかるけど、送信したらBCCのあて先は消えるとあり、使うのに注意が必要。

##[MAPI (Messaging Application Programming Interface) の名前空間](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx#Anchor_1)
Outlook がサポートするプロパティの多くは MAPI プロパティです。***PropertyAccessor オブジェクトは、proptag、id、および string という 3 つの MAPI 名前空間のサブ名前空間をサポートします。***次に示す各セクションでは、サブ名前空間についての説明、そのサブ名前空間でプロパティを参照するための形式についての説明、および Augmented Backus-Naur Form (ABNF) で表された構文の定義( [RFC4234](http://ietfreport.isoc.org/idref/rfc4234/) で指定) を示します。
proptag 名前空間
id 名前空間
string 名前空間
##[exchange 名前空間](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx#Anchor_2)
exchange 名前空間は、文字列名の付いた Exchange プロパティにアクセスするときに使用されます。この名前空間のプロパティを参照するための形式は次のとおりです。 
 http://schemas.microsoft.com/exchange/name
name は、文字列として定義されるローカル プロパティ名です。
次の例は、この名前空間が参照するプロパティです。
http://schemas.microsoft.com/exchange/readreceiptrequested 

###[Office 名前空間](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx#Anchor_3)
#####Office 名前空間
 DocumentItem オブジェクトのプロパティにアクセスする
  urn:schemas-microsoft-com:office:office#name
    name は、文字列として定義されるローカル プロパティ名です。
    次に示すのは、Office 名前空間を使用して DocumentItem プロパティを参照する一例です。
        urn:schemas-microsoft-com:office:office#Subject
        urn:schemas-microsoft-com:office:office#Template
#####Outlook 名前空間
    この名前空間は、***Outlookアイテムレベルのプロパティにアクセス***するときに使用されます。プロパティ参照をサポートするその他の名前空間と同様に、この名前空間を使用して、オブジェクト モデルに明示的に公開されていない Outlook プロパティにアクセスします。この名前空間のプロパティを参照するための形式は次のとおりです。
    urn:schemas-microsoft-com:office:officeoutlook#name
    name は、文字列として定義されるローカル プロパティ名です。
    Outlook 名前空間を使用して Outlook アイテムレベルのプロパティを参照する例を以下に示します。
    urn:schemas-microsoft-com:office:outlook
####[DAV (Distributed Authoring and Versioning) 名前空間](https://msdn.microsoft.com/ja-jp/library/office/ff868915.aspx#Anchor_4)
DAV 名前空間は、***Outlook のアイテムレベル プロパティにアクセスするとき***に使用されます。DAV 名前空間のプロパティは、URI (Uniform Resource Identifier) 名前空間の参照を使用して調べられます。***形式は、名前空間 URI 接頭辞と、文字列で表されたローカル プロパティ名が連結されたもの***で、URN (Uniform Resource Name)、または URL (Uniform Resource Locator) のいずれかである名前空間 URI を持っています。
 次の例では、PropertyAccessor オブジェクトがサポートする DAV 名前空間を示しています。
    DAV:
    urn:schemas:calendar
    urn:schemas:contacts
    urn:schemas:httpmail
    urn:schemas:mailheader
次に示すのは、異なる DAV 名前空間が参照するプロパティの一例です。
    DAV:checkintime
    urn:schemas:httpmail:subject
    urn:schemas:mailheader:subject


###[Outlook 2013 MAPI リファレンス 概念  プログラミング要素 プロパティの概要  MAPI 名前付きプロパティ](https://msdn.microsoft.com/ja-jp/library/office/cc765864.aspx)
このセクションには、 MAPI リファレンスのプログラミングの要素の概要が含まれています。
こちらはC言語を対象としたものらしい

[Outlook 2013 プライマリ相互運用機能アセンブリ リファレンス](https://msdn.microsoft.com/ja-jp/library/office/bb612741.aspx)
[検索とフィルター処理](https://msdn.microsoft.com/ja-jp/library/office/ff184609.aspx)
[方法:時間範囲内の予定を検索、取得する](https://msdn.microsoft.com/ja-jp/library/office/gg619398.aspx)
[方法:定期的な予定でフィルター処理した後、件名の文字列を検索する](https://msdn.microsoft.com/ja-jp/library/office/bb611267.aspx)
[Doing more with Outlook filter and SQL DASL syntax](https://blogs.msdn.microsoft.com/andrewdelin/2005/05/10/doing-more-with-outlook-filter-and-sql-dasl-syntax/)
[Outlook SQL DASL syntax – an update](https://blogs.msdn.microsoft.com/andrewdelin/2005/08/08/outlook-sql-dasl-syntax-an-update/)
[Outlook .items.restrict using two filters](http://stackoverflow.com/questions/35508808/outlook-items-restrict-using-two-filters)
重要 絞り込むのは同時には無理なので分けている。この場合
[Searching for newest email with a certain subject - StackOverFlow](http://stackoverflow.com/questions/30201407/searching-for-newest-email-with-a-certain-subject)
タイトルと違い今日と明日の予定表をItems.Find(原文はmyAppointments.Find)で検索するもの
フィルタはJet

##ContactItem（アドレス帳）のプロパティを抽出する例
[VBA Script that gets list of Outlook Contacts using the Property Accessor](http://www.gregthatcher.com/Scripts/VBA/Outlook/GetListOfContactsUsingPropertyAccessor.aspx)
#オンラインヘルプ
Outlook 2010 以前はオフラインヘルプを参照することとされている。が技術文書等は残っている
[Outlook 2010](https://msdn.microsoft.com/ja-jp/library/cc313152(v=office.12).aspx)
[Outlook ヘルプ - Microsoft サポート](https://support.office.com/ja-jp/outlook)
初心者向けだが、意外な操作方法もある。
[ビデオ: Outlook 2013 の新機能](https://support.office.com/ja-jp/article/%E3%83%93%E3%83%87%E3%82%AA-Outlook-2013-%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD-24ba0a8b-9f51-461f-8257-b8707467e323)
[Outlook 2013 での変更点 - technet](https://technet.microsoft.com/ja-jp/library/cc179110.aspx)
[Outlook 2013 SP1 での変更点 - technet](https://technet.microsoft.com/ja-jp/library/dn610984.aspx)

[Outlook 2013の新機能 - wanichan](http://www.wanichan.com/pc/outlook/2013/1/07.html)
Outlook 2013はOutlook 2010とは外観が全然違いますが、基本的に同じです。IMAPメールアカウントの同期範囲を決めることができたり、メールに返信時に新しいウィンドウではなく作業ウィンドウ内で編集できるようになりました。
[Outlook -  Outlook 2013 Later](https://msdn.microsoft.com/ja-jp/library/office/fp161224.aspx)