概要
- Outlook のオブジェクトモデルは、Explorer > Folder > Item の構造
- メールの実体は、MailItem オブジェクト
経緯
Outlook をメールクライアントとして使っていて、特定の内容のメールが届いたら、その内容を元に何か自動処理を行いたい。
でも Outlook の VBA はどう使ったらいいのかわからないため調査。
Outlook のオブジェクトモデル概観
Outlook のオブジェクトモデル(1) Application オブジェクト
他の Office アプリケーションと同様、Outlook も、アプリケーションの実行プロセスに相当する(と思われる) Application クラスがある。この Application クラスが Outlook のオブジェクトモデルの中で、コンポジションの観点からいうと、最も根元/外側に位置する。
Outlook のオブジェクトモデル(2) Explorer オブジェクト
Explorer オブジェクトを取得するには、以下の方法がある。
- 現在使用中の Explorer オブジェクトを取得するには、Application#ActiveExplorer
- Explorer オブジェクトのコレクションを取得するには、Application#Explorers
しかし、この Explorer オブジェクトの実体が一体何なのかよくわからない。msdn によると、「フォルダが表示されているウィンドウ」を示すらしい。一方 Application オブジェクトは、「Outlook アプリケーション全体」を意味するらしい。でも、Outlook が複数のウィンドウを持ってるのは見たことがない。
Outlook のオブジェクトモデル(3) Folder オブジェクト
Folder オブジェクトを取得するには、以下の方法がある。
- 現在選択中のフォルダを取得するには、Explorer#CurrentFolder
- 特定のフォルダを取得するには、Explorer#Session#GetDefaultFolders
- いまいち使いどころが分からないけど、Explorer#Session#Folders からも、Folder オブジェクトのコレクションを取得できる
- 特定のフォルダの更にサブフォルダを取得するには、Folder#Folders
この Folder オブジェクトの実体には、Outlook の左ペインに並んでいる「メール」「予定表」「連絡先」「仕事」「メモ」などのトップレベルのフォルダのほか、メールボックス内に階層状に存在するフォルダも含まれる。
なお、Office 2003 までは、MAPIFolder というクラスだったようだ。MAPIFolder が Folder になぜ変わったのか、何が変わったのかはよくわからない。
Session というプロパティ/クラスも何なのかよくわからないけど、さらっと流す。
Outlook のオブジェクトモデル(4) *Item オブジェクト
MailItem、AppointmentItem、ContactItem、TaskItem、NoteItem などの *Item オブジェクトを取得するには、以下の方法がある。
- 現在選択中の *Item オブジェクトを取得するには、Explorer#Selection
- 特定のフォルダに含まれる全ての *Item を取得するには、Folder#Items
- *Item オブジェクトの新しいインスタンスを作成すれば、新しい項目を作成できる
MailItem オブジェクトは、「受信トレイ」や「送信済みアイテム」フォルダの中にある一通一通のメールに相当する。AppointmentItem オブジェクトは、「予定表」の予定。その他も名前通り。
コードの目的が、Outlook にあるデータを利用することにあるならば、この *Item オブジェクトを取得することが手段となる。例えば、メールのメッセージ本文は、MailItem オブジェクトの Body プロパティを通してアクセスできる。
| トップレベルフォルダ | *Item の クラス名 | *Item#Class : OlObjectClass |
|---|---|---|
| 予定表 | ApplointmentItem | 26 |
| 連絡先 | ContactItem | 40 |
| ? | DistributionListItem | 69 |
| ? | JournalItem | 42 |
| メール | MailItem | 43 |
| メモ | NoteItem | 44 |
| ? | PostItem | 45 |
| 仕事 | TaskItem | 48 |
コードの例(1) 選択しているメールの件名を表示
Sub Test()
Dim out As String
Dim selectedFolder As Outlook.Folder
Set selectedFolder = ActiveExplorer.CurrentFolder
out = out & "CurrentFolder:" & vbTab & selectedFolder.Name & vbCrLf
If 0 < ActiveExplorer.Selection.Count Then
Dim selObject As Object
Set selObject = ActiveExplorer.Selection.Item(1)
out = out & "Selectd item: " & selObject.Class & vbCrLf
If selObject.Class = OlObjectClass.olMail Then
out = out & selObject.Subject & vbCrLf
End If
Else
out = out & "No items selected"
End If
MsgBox out
End Sub
例えば、MyFolder というメールフォルダの中に、TEST という件名のメールがあって、それを選択した状態で、上記 Sub プロシージャを実行すると、
こうなる。43 というのは、MailItem#Class の値で、OlObjectClass.olMail の値。
コードの例(2) 特定のフォルダにあるメールをループ処理
Sub Test2()
Dim out As String
Dim f As Outlook.Folder
Set f = ActiveExplorer.Session.GetDefaultFolder(olFolderInbox).Folders.Item("MyFolder")
For i = 1 To f.Items.Count
out = out & "[" & i & "] " & f.Items.Item(i).Subject & vbCrLf
Next i
MsgBox out
End Sub
メールボックスの「受信トレイ」直下に「MyFolder」サブフォルダがあるという前提で、その中のメールをループ処理して、件名を出力するサンプル。
「MyFolder」の参照の取得は4行目で行っているが、トップレベルフォルダの「受信トレイ」を取得し、そのサブフォルダを更に取得し、という2段階の手順を踏んでいる。
Folders#Item プロパティの引数には、1 ? Item.Count の間のシーケンス値でも、フォルダ名の文字列でも、どちらでも使えるようだ。
参考文献
- Outlook オブジェクト モデルの概要 <http://msdn.microsoft.com/ja-jp/library/ms268893(v=VS.80).aspx>
- 方法 : 現在の Outlook のアイテムを確認する <http://msdn.microsoft.com/ja-jp/library/ms268994(VS.80).aspx>