Outlook で VBA ってどんな感じ

概要

  • Outlook のオブジェクトモデルは、Explorer > Folder > Item の構造
  • メールの実体は、MailItem オブジェクト


経緯

Outlook をメールクライアントとして使っていて、特定の内容のメールが届いたら、その内容を元に何か自動処理を行いたい。

でも Outlook の VBA はどう使ったらいいのかわからないため調査。

Outlook のオブジェクトモデル概観

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 オブジェクト

MailItemAppointmentItemContactItemTaskItemNoteItem などの *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 プロシージャを実行すると、

image

こうなる。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 の間のシーケンス値でも、フォルダ名の文字列でも、どちらでも使えるようだ。

参考文献

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>