概要
- 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>