OUTLOOK VBA Categories 分類項目 まとめ

#今回のポイント

 1. 分類項目はCategoryオブジェクトと言われる。
 2. CategoryオブジェクトはNamesapece直下に分類項目マスターがある。
 3. 一応分類項目マスターは追加、削除ができる（たぶんやる人はいない）
 4. 実は枠、トップ、ボトムはグラデーションになっている。これは自動的に決まる。（一応RGBに変換するVBAは下記に紹介。
 5. TASｋItemなどの分類項目の追加は、マスターに登録したものを追加すると色がつく。なおこの各ITEMレベルで分類項目マスターにないものを設定しても、分類項目マスターに反映しない。
 6. アイテムに追加するときは Taskitem.categories = "AU;DOCOMO;"のようにセミコロンで区切って代入する。
 7. ただし Taskitem.categories からコレクションを返すことはできない。
 8. マイクロソフトの機械翻訳は頭がおかしい。


[[方法] 分類項目を列挙および追加する]( https://msdn.microsoft.com/ja-jp/library/office/ff424467.aspx)
Outlook のオブジェクト モデルは、ユーザーの受信トレイのアイテムを整理しやすくするための分類項目をサポートしています。高レベルな整理を維持するために、以下を行うことができます。

 - Outlook アイテムを分類し、分類項目ごとに表示します。
 - 単一の Outlook アイテムに複数の色の分類項目を適用します。
 - 色の分類項目により Outlook アイテムのグループ化と並べ替えを行います。
 - 色の分類項目のそれぞれにショートカット キーを割り当てて、ユーザーがアイテムを分類しやすくします。
 - プログラムにより、または Outlook のユーザー インターフェイスでのユーザー操作により、色の分類項目を作成、削除、および変更します。

Outlook のオブジェクト モデルには、分類項目の機能を利用するための Category オブジェクトがあります。このオブジェクトは、メイン分類項目リストの中の単一のユーザー定義の色分類項目を表します。メイン分類項目リストには、Outlook のユーザー インターフェイスに表示される色の分類項目が含まれます。このリストは NameSpace オブジェクトの Categories コレクションで表されます。Category オブジェクトを作成するには、Categories コレクションの Add(String, Object, Object) メソッドを使用します。Category オブジェクトを作成すると、グローバル一意識別子 (GUID) が作成され、この識別子は変更できません。これは CategoryID プロパティで表されます。ただし、Category オブジェクトの Name、Color、および ShortcutKey の各プロパティを設定することで、色の分類項目と関連付けられた名前、色、およびショートカット キーは変更できます。Color プロパティは、OlCategoryColor 定数を設定または取得することで変更できます。カスタム コントロールで色を再現するには、Category オブジェクトの次の読み取り専用プロパティを使用します。
• CategoryBorderColor
• CategoryGradientBottomColor
• CategoryGradientTopColor

これらのプロパティは OLE_COLOR 値を返します。この値は Category オブジェクトの Color プロパティに依存します。

Outlook アイテムは分類項目名に基づいて表示されます。各アイテムのオブジェクトには、分類項目名を表すコンマ区切り文字列を格納した Categories プロパティがあります (たとえば、MailItem オブジェクトの場合は MailItem の Categories プロパティを使用します)。これにより、メイン分類項目リストに存在しない分類項目もアイテムに追加できます。
アイテムの Categories プロパティに、NameSpace オブジェクトの Categories コレクションにない分類項目名が含まれている場合、Outlook アイテムに関連付けられたその分類項目名は表示されますが、関連付けられた色はありません。***Item オブジェクトの Categories プロパティは Categories コレクションを返しません***。

#### メモ
アイテムの Categories プロパティに、NameSpace オブジェクトの Categories コレクションにない分類項目名が含まれている場合、Outlook アイテムに関連付けられたその分類項目名は表示されますが、関連付けられた色はありません。Item オブジェクトの Categories プロパティは Categories コレクションを返しません。

### コードの例
次のコード例で、最初のプロシージャ olCatlist では、NameSpaceのCategories コレクションが表す現在のユーザーのメイン分類項目リストを取得します。次に、そのコレクションの Category オブジェクトに対して順に処理を行い、Name プロパティおよび CategoryID プロパティを Listeners コレクションのトレース リスナーに書き込みます。2 番目のプロシージャ AddOlCategory では、現在のユーザーのメイン分類項目リストを取得し、IsCategoryExists メソッドを使用して、"ISV" という名前の分類項目がコレクションに存在するかどうかをチェックします。"ISV" という名前の分類項目が存在しない場合、AddCategory は、Categories コレクションの Add メソッドを使用して、メイン分類項目リストに "ISV" という名前の分類項目を追加し、濃い青色を割り当てます。また、この分類項目のショートカット キーに Ctrl + F11 を割り当てます。
このあとがC言語になっているが、VBAでできるん。

```vbnet:
Sub olCatlist()
'VBA For OUTLOOK
Dim Ns As Outlook.NameSpace: Set Ns = Application.GetNamespace("MAPI")
Dim olCats As Categories, olCat As Outlook.Category, olCatCon As Outlook.CategoryRuleCondition
For Each olCat In Ns.Categories
Debug.Print olCat.Name, olCat.CategoryID, olCat.ShortcutKey
Next
Set Ns = Nothing
End Sub

Sub AddOlCategory()
If IsCategoryExists("ISV") = False Then
Application.Session.Categories.Add "ISV", Outlook.OlCategoryColor.olCategoryColorDarkBlue, Outlook.OlCategoryShortcutKey.olCategoryShortcutKeyCtrlF11
End If
End Sub

Sub RemoveOutlookNamespaceCategory()
If IsCategoryExists("ISV") = True Then
Application.Session.Categories.Remove ("ISV")
End If
End Sub

Function IsCategoryExists(CatName As String) As Boolean
'VBA for OUTLOOK
Dim Ns As Outlook.NameSpace: Set Ns = Application.GetNamespace("MAPI")
Dim olCats As Categories, olCat As Outlook.Category
If CatName = "" Then Exit Function
For Each olCat In Ns.Categories
If CatName = olCat.Name Then IsCategoryExists = True: Set Ns = Nothing: Exit Function
Next
IsCategoryExists = False: Set Ns = Nothing: Exit Function
End Function
```

[方法] アイテムに分類項目を割り当てる]( https://msdn.microsoft.com/ja-jp/library/office/ff424469.aspx)
アイテムに分類項目を割り当てるには、アイテムの Categories プロパティを使用します。このコード サンプルは、「[方法]ヘルパー クラスを作成し、Outlook アイテムの共通メンバーにアクセスする」で定義された OutlookItem ヘルパー クラスを使用して、最初にアイテムをキャストせずに、利便性の高い方法で OutlookItem.Categories プロパティを呼び出します。Categories プロパティは、コンマで区切られた ***255 文字以内の文字列***で表される分類項目を取得または設定します。各分類項目の値は、コンマと空白文字で区切られます。***NameSpaceオブジェクトの Categories コレクションに含まれない分類項目を割り当てると、色の表示されない分類項目になります***。

以下のコード例の AssignCategories では、まず、DAV Searching and Locating (DASL) クエリを使用して受信トレイ内のアイテムをフィルター処理し、件名に "ISV" が含まれるアイテムを抽出します。次に、AssignCategories では、OutlookItem クラスを使用して、フィルターで抽出されたアイテムを反復処理します。item.Categories から返される文字列が null 参照ではなく、既に ISV に割り当てられている場合は、ISV 分類項目がアイテムに割り当てられています。

[OlCategoryShortcutKey 列挙 (Outlook)](https://msdn.microsoft.com/ja-jp/VBA/Outlook-VBA/articles/olcategoryshortcutkey-enumeration-outlook)

|名前		 |値 |説明 |
|:---------------------:|:-----------------------:|:------|
|olCategoryShortcutKeyCtrlF10|10|CTRL キーを押しながら F10 キー|
|olCategoryShortcutKeyCtrlF11|11|CTRL + F11 キーを押します|
|olCategoryShortcutKeyCtrlF12|12|CTRL + F12 キーを押す|
|olCategoryShortcutKeyCtrlF2|2|CTRL + F2|
|olCategoryShortcutKeyCtrlF3|3|CTRL キー + F3|
|olCategoryShortcutKeyCtrlF4|4|CTRL + F4|
|olCategoryShortcutKeyCtrlF5|5|CTRL + F5|
|olCategoryShortcutKeyCtrlF6|6|CTRL + F6 キーを押します|
|olCategoryShortcutKeyCtrlF7|7|CTRL キー + F7 キー|
|olCategoryShortcutKeyCtrlF8|8|CTRL キーを押しながら F8 キーを押す|
|olCategoryShortcutKeyCtrlF9|9|CTRL + F9 キーを押します|
|olCategoryShortcutKeyNone|0|ショートカット キーを指定しません。|

お判りいただけるだろうか？そうこの説明、上から下まで同じことが書いてあるのにもかかわらず、表記が揺れているのである！なお英語の説明は CTRL キーを押しながら F10 キー
は
Ctrl + F10のようになっておりどこにも押すという単語はない。

[OlCategoryColor 列挙体 (Microsoft.Office.Interop.Outlook)]( https://msdn.microsoft.com/ja-jp/library/office/microsoft.office.interop.outlook.olcategorycolor.aspx)
Category オブジェクトの Color プロパティで指定された色を示します。

|メンバ名 |説明 |色名 |十進数|
|:---------------------:|:-----------------------:|:------:|:---:|
|Outlook.OlCategoryColor|olCategoryColorBlack |黒 |15 |
|Outlook.OlCategoryColor|olCategoryColorBlue |青 |8 |
|Outlook.OlCategoryColor|olCategoryColorDarkBlue |濃い青 |23 |
|Outlook.OlCategoryColor|olCategoryColorDarkGray |濃い灰色|14 |
|Outlook.OlCategoryColor|olCategoryColorDarkGreen |濃い緑 |20 |
|Outlook.OlCategoryColor|olCategoryColorDarkMaroon|濃い茶色|25 |
|Outlook.OlCategoryColor|olCategoryColorDarkOlive |濃いオリーブ|22 |
|Outlook.OlCategoryColor|olCategoryColorDarkOrange|濃いオレンジ|17 |
|Outlook.OlCategoryColor|olCategoryColorDarkPeach |濃いピーチ|18 |
|Outlook.OlCategoryColor|olCategoryColorDarkPurple|濃い紫 |24 |
|Outlook.OlCategoryColor|olCategoryColorDarkRed |濃い赤 |16 |
|Outlook.OlCategoryColor|olCategoryColorDarkSteel |濃いスチール|12 |
|Outlook.OlCategoryColor|olCategoryColorDarkTeal |濃い青緑|21 |
|Outlook.OlCategoryColor|olCategoryColorDarkYellow|濃い黄 |19 |
|Outlook.OlCategoryColor|olCategoryColorGray |灰色 |13 |
|Outlook.OlCategoryColor|olCategoryColorGreen |緑 |5 |
|Outlook.OlCategoryColor|olCategoryColorMaroon |茶色 |10 |
|Outlook.OlCategoryColor|olCategoryColorNone |色の割り当てなし|0 |
|Outlook.OlCategoryColor|olCategoryColorOlive |オリーブ|7 |
|Outlook.OlCategoryColor|olCategoryColorOrange |オレンジ|2 |
|Outlook.OlCategoryColor|olCategoryColorPeach |ピーチ |3 |
|Outlook.OlCategoryColor|olCategoryColorPurple |紫 |9 |
|Outlook.OlCategoryColor|olCategoryColorRed |赤 |1 |
|Outlook.OlCategoryColor|olCategoryColorSteel |スチール |11 |
|Outlook.OlCategoryColor|olCategoryColorTeal |青緑 |6 |
|Outlook.OlCategoryColor|olCategoryColorYellow |黄 |4 |

ここで指定する色定数は、Category オブジェクトによって使用される実際の色の近似色です。Color プロパティを近似色の定数に設定した後で、Category オブジェクトの表現に使用する OLE_COLOR 色値を取得するには、[CategoryBorderColor]( https://msdn.microsoft.com/ja-jp/library/office/microsoft.office.interop.outlook._category.categorybordercolor.aspx)、[CategoryGradientBottomColor]( https://msdn.microsoft.com/ja-jp/library/office/microsoft.office.interop.outlook._category.categorygradientbottomcolor.aspx)、および [CategoryGradientTopColor]( https://msdn.microsoft.com/ja-jp/library/office/microsoft.office.interop.outlook._category.categorygradienttopcolor.aspx) プロパティを使用します。

いずれも読み取り専用。色見本のOLE_COLOR値を返す。(というのは方法が不明なのでVBAではRGBに分解する方法を下記に紹介。) 

- Color メインの色 定数が使える。OlCategoryColor 定数を返すか、設定。読み取り/書き込み可能。以下は読み取り専用
- CategoryBorderColor 境界色
- CategoryGradientBottomColor 色見本の下部グラデーション
- CategoryGradientTopColor Category オブジェクトに対して表示される色見本の上部グラデーション色を表す OLE_COLOR 値を返します。読み取り専用です。

```vbnet:catColor
Sub catColor()
'For Outlook
'分類項目の名前、枠の色、トップの色、下の色をイミディエイトに表示
Dim Ns As Outlook.NameSpace: Set Ns = Application.GetNamespace("MAPI")
Dim olCats As Categories, olCat As Outlook.Category
Dim olcatolecolor As stdole.OLE_COLOR
Set olCats = Ns.Categories
For Each olCat In olCats
Debug.Print olCat.Name, olCat.CategoryBorderColor, olCat.CategoryGradientTopColor, olCat.CategoryBorderColor
Next
End Sub
```

```vbnet
Public Type iColorRGB
R As Double
B As Double
G As Double
End Type
Public Const Max_ColorValue = 16777215
Public Const BLUE_OFFSET = 65536
Public Const GREEN_OFFSET = 256
Public Const RED_OFFSET = 1
Public Const ColVbBl = 16711680
Public Const ColVbR = 255
Public Const ColVBW = 16777215
Public Const ColVBB = 0
Public Const ColVBM = 16711935
Public Const ColVBC = 16776960
Public Const ColVBG = 65280
Public Const ColVBY = 65535

Sub testcat()
Dim Ns As Outlook.NameSpace: Set Ns = Application.GetNamespace("MAPI")
Dim olCats As Categories, olCat As Outlook.Category
Dim olcatolecolor As stdole.OLE_COLOR
Dim iRGB As iColorRGB
Dim buf As String
Dim objCol As Collection
Set olCats = Ns.Categories
For Each olCat In olCats
Set objCol = rgbarray(olCat.CategoryBorderColor)
iRGB.R = objCol(1): iRGB.G = objCol(2): iRGB.B = objCol(3)
buf = "CatBoderRGB(" & iRGB.R & "," & iRGB.G & "," & iRGB.B & ")"
Set objCol = rgbarray(olCat.CategoryGradientBottomColor)
iRGB.R = objCol(1): iRGB.G = objCol(2): iRGB.B = objCol(3)
buf = buf & ",CatBottomRGB(" & iRGB.R & "," & iRGB.G & "," & iRGB.B & ")"
Set objCol = rgbarray(olCat.CategoryGradientTopColor)
iRGB.R = objCol(1): iRGB.G = objCol(2): iRGB.B = objCol(3)
buf = buf & ",CatTopRGB(" & iRGB.R & "," & iRGB.G & "," & iRGB.B & ")"
Debug.Print olCat.Name, buf
Next
End Sub

Function rgbarray(colorvalue) As Collection
'For Outlook VBA and Other
' この関数は、ユーザーによる入力内容を配列に挿入し、
' 配列を返します。
'Refference https://msdn.microsoft.com/ja-jp/library/cc376074.aspx

Dim astrItems As New Collection
Dim iRGB As iColorRGB
Dim Blue2Green As Long
Dim ar, br, i As Long
Dim strColorString As String

ar = Array(ColVBB, ColVBW, ColVbBl, ColVBM, ColVbR, ColVBY, ColVBG, ColVBC)
br = Array("Black", "White", "Blue", "Magenta", "Red", "Yellow", "Green", "Cyan")
If colorvalue > Max_ColorValue Then colorvalue = Max_ColorValue
For i = LBound(ar) To UBound(ar)
If ar(i) = colorvalue Then strColorString = br(i): Exit For
Next i
'Caluculate RGB Color Number
iRGB.B = Fix(colorvalue / BLUE_OFFSET)
Blue2Green = colorvalue - (iRGB.B * BLUE_OFFSET)
iRGB.G = Fix(Blue2Green _
/ GREEN_OFFSET)
iRGB.R = Blue2Green - (iRGB.G * GREEN_OFFSET)
'End:Caluculate RGB Color Number
astrItems.Add (iRGB.R)
astrItems.Add (iRGB.B)
astrItems.Add (iRGB.G)
astrItems.Add (strColorString)
Set rgbarray = astrItems
If Not astrItems Is Nothing Then Set astrItems = Nothing
End Function
```

[TaskItem.Categories プロパティ (Outlook)]( https://msdn.microsoft.com/ja-jp/vba/outlook-vba/articles/taskitem-categories-property-outlook)
Outlook アイテムに割り当てられているカテゴリを表す文字列を設定または返します。読み取り/書き込み。

#####構文
expression.categroies
expression TaskItemオブジェクトを表す変数です。

#####注釈
カテゴリは、Outlook アイテムに割り当てられているカテゴリの名前の区切り記号付きの文字列です。このプロパティは、複数の分類項目の区切り記号として、値の名前、 sList 、Windows レジストリにHKEY_CURRENT_USER\Control Panel\Internationalの下に指定された文字を使用します(ふつうは半角セミコロン)。カテゴリ名の文字列を項目名の配列に変換するには、Microsoft Visual Basic 関数Splitを使用します。実際に現在OUTLOOKのエクスプローラー画面で選択されているオブジェクトに分類項目を２つ追加するVBAマクロが下記のとおりである。なおAU,DOCOMOは下記の場合分類項目マスターにあらかじめ登録しておいた方が色がつく。

```vbnet
Sub OutlookObjectCategoriesAdd()
'VBA for Outlook QIIQ from Qita
Dim ns As Outlook.NameSpace: Set ns = Application.GetNamespace("MAPI")
Dim AEX As Explorer: Set AEX = Application.ActiveExplorer
Dim myItem As Object
Dim cat As Outlook.Category, cats As Outlook.Categories
Set myItem = AEX.Selection
myItem(1).Categories = "AU;DOCOMO;"
End Sub
```

#その他のOUTLOOKまとめ
メイン [OUTLOOK VBA オブジェクトまとめ](https://qiita.com/Q11Q/items/ac14d96c00e707de5d13)