Outlook のオブジェクト モデル


前々回の記事で述べたように、Outlook で VBA マクロを使いこなすには、Outlook のオブジェクト モデルというものを理解することが必要となります。インターネット上でサンプルコードなどを検索し、見よう見まねで作成するという方法でもマクロは作成できるかもしれませんが、サンプルがないようなことを実現したい場合などには、やはりオブジェクト モデルの理解が欠かせません。
というわけで、今回は Outlook のオブジェクト モデルについて説明したいと思います。

オブジェクト モデルとは?

「オブジェクト モデル」という言葉をこれまで何の説明もせずに使ってきましたが、おそらく「オブジェクト モデルって何?」という方もいるでしょう。そこで、まずはオブジェクト モデルという言葉について説明します。

コンピュータの世界では、処理するデータとそのデータにまつわる操作をオブジェクトという単位でまとめて扱うことにより、柔軟性や拡張性を高めるための「オブジェクト指向」という考え方があります。

たとえば、Windows 上ではディスク上のデータを「ファイル」として扱いますが、「ファイル」にはファイル名やファイル サイズといったデータ (プロパティと呼びます) があり、コピーや移動、削除などの操作 (メソッドと呼びます) があります。これらのデータと操作をまとめてファイル オブジェクトとして扱うというのがオブジェクト指向です。(オブジェクト指向について説明しだすときりがないので、とりあえず「データと操作をまとめたものがオブジェクト」と覚えておいてください。)

そして、あるアプリケーションやシステムが持つオブジェクトを体系的にまとめたものがオブジェクト モデルになります。たとえば、フォルダにはファイルが含まれるため、ファイルをフォルダのプロパティとして扱うことができますが、ファイル自体もプロパティとメソッドを持つオブジェクトになります。つまり、オブジェクトの中にオブジェクトを含むという入れ子の状態を作ることができるので、これらのオブジェクトの親子関係をまとめてオブジェクト モデルとして定義できるのです。

つまり、Outlook オブジェクト モデルとは「Outlook でアクセスできるデータとそのデータにまつわる操作をデータごとに整理し、体系的にまとめたもの」です。たとえば、アイテムやフォルダ、受信者の情報などが Outlook のオブジェクト モデルに含まれます。

Outlook のオブジェクト モデルは https://learn.microsoft.com/ja-jp/visualstudio/vsto/outlook-object-model-overview で見ることができます。(日本語版は機械翻訳なのでところどころおかしな表現があります。)

以降は主要なオブジェクトについて説明していきます。

Application オブジェクト

Application オブジェクトは、Outlook というアプリケーション ソフトそのものをあらわすオブジェクトです。

Outlook のオブジェクト モデルを木にたとえると、Application オブジェクトは根の部分に相当するものになり、Outlook でオブジェクトとして定義されているデータは Application オブジェクトを基点としてアクセスすることができます。また、現在表示されているアイテムのウィンドウやフォルダのウィンドウなど、ユーザー インターフェイスにも Application オブジェクトを通じてアクセスします。

なお、Word や Excel の VBA にもそれぞれのアプリケーション ソフトをあらわす Application オブジェクトがありますが、Outlook と Word や Excel とではいくつか違う点があります。

たとえば、Word や Excel は複数のプロセスを起動することができ、Application オブジェクトもその数だけ存在することになりますが、Outlook は複数プロセスを起動することができず、Application オブジェクトもひとつとなります。そのため、複数のプログラムで同時に Outlook の Application オブジェクトを操作したり、マクロの実行中に Outlook で操作を行ったりすると予期しない動作をする可能性があります。

また、Word や Excel では、明示的に Application オブジェクトを作成しなくても、Word の Document オブジェクトや Excel の WorkBook オブジェクトを新規作成することで、自動的にそれぞれのアプリケーションが起動しますが、Outlook を VBScript やほかの Office ソフトの VBA から呼び出す場合は、最初に Outlook の Application オブジェクトを生成する必要があります。VBScript で Outook の Application オブジェクトを生成するサンプルは以下の通りです。

Set myOutlook = CreateObject("Outlook.Application")

ただし、Outlook の VBA で Appication オブジェクトを使う場合、上記の記述を行う必要はなく、Application という変数に Outlook の Application オブジェクトが格納されています。むしろ、Outlook の VBA の中で上記の記述を行うと、操作手順によってはハングアップする場合があるので注意してください。

NameSpace オブジェクト

NameSpace オブジェクトは、MAPI のセッションに該当するものであり、アドレス帳やメッセージ ストアのプロバイダによって提供されるデータにアクセスするためのインターフェイスとなるものです。(MAPI セッションについては前回の記事を参照してください。)

NameSpace オブジェクトは Application オブジェクトの GetNameSpace で引数に “MAPI” を指定して取得します。(現時点では “MAPI” 以外の NameSpace を取得することはできませんが、今後増えることも無いでしょう。)
また、Outlook が既に起動していて、MAPI のログオンも完了している場合は、Application オブジェクトの Session プロパティからログオン済みの NameSpace オブジェクトを取得することもできます。というか、既にログオン済みの状態で GetNameSpace により NameSpace オブジェクトを取得し、別な MAPI セッションを確立することはできません。したがって、Outlook の VBA では、GetNameSpace を使わずに、Application オブジェクトの Session プロパティを使うことをお勧めします。

上記の内容をまとめると以下のようになります。

オブジェクト Outlook VBA Outlook 外からの使用
Application Application 変数を使用 CreateObject(“Outlook.Application”) で取得
NameSpace Application.Session を使用 上記で取得した Application オブジェクトの GetNameSpace(“MAPI”) で取得

Explorer オブジェクト

Explorer オブジェクトはフォルダの表示を行っているウィンドウに対応するオブジェクトです。フォルダのウィンドウでどのアイテムを選択しているかといった情報や、表示に使っているビュー、フォルダのコマンド ボタンなどの情報を取得・設定するために使用します。
Application の Explorers コレクションまたは ActiveExplorer プロパティにより Explorer オブジェクトを取得することができ、現在表示されているすべてのフォルダ ウィンドウにアクセスする場合は Explorers コレクションを、アクティブなフォルダ ウィンドウにアクセスする場合は ActiveExplorer プロパティを使用します。

Inspector オブジェクト

Inspector オブジェクトはアイテムの表示を行っているウィンドウに対応するオブジェクトです。表示中のアイテムやアイテム ウィンドウのコマンドボタン、カスタム フォームのコントロールなどの情報を取得・設定するために使用します。
Application の Inspectors コレクションまたは ActiveInspector プロパティにより Inspector オブジェクトを取得することができ、現在表示されているすべてのアイテム ウィンドウにアクセスする場合は Inspectors コレクションを、アクティブなアイテム ウィンドウにアクセスする場合は ActiveInspector プロパティを使用します。

Store オブジェクト

Store オブジェクトは MAPI のメッセージ ストアに対応するオブジェクトであり、Outlook 2007 から新たに追加されたものです。このオブジェクトを通じてメッセージ ストアの詳細な情報にアクセスすることが可能となります。
Store オブジェクトは NameSpace オブジェクトの Stores コレクションから取得できます。

Folder オブジェクト

Folder オブジェクトは、メッセージ ストア中のフォルダに対応するオブジェクトです。Outlook 2003 以前では MAPIFolder オブジェクトと呼ばれていましたが、Outlook 2007 で名前が変わりました。このオブジェクトを通じて、フォルダ中のメッセージやサブフォルダ、ビューなどの情報にアクセスすることが可能になります。
NameSpace オブジェクトや Store オブジェクト、Folder オブジェクト自体の Folders コレクションなどを通じて、すべてのフォルダを再帰的に参照するということができます。
また、受信トレイや送信済みアイテム、予定表、仕事など、Outlook 起動時に作成される既定のフォルダについては NameSpace オブジェクトの GetDefaultFolder メソッドを使用して取得できます。

*Item オブジェクト

フォルダに格納されているアイテムには、それぞれのアイテムの種別に応じたオブジェクトがあります。例えば、メッセージのアイテムは MailItem オブジェクトであり、予定は AppointmentItem、仕事は TaskItem といった具合です。それぞれのオブジェクトでは件名を格納する Subject プロパティや本文を格納する Body プロパティなど共通で使用できるプロパティもありますが、それぞれのオブジェクトに固有のプロパティも存在します。
特に受信トレイには MailItem だけでなく、配信不能通知に対応する ReportItem なども含まれる場合がありますので、事前にオブジェクトの種類を識別して処理する必要があります。
Item オブジェクトは Folder オブジェクトの Items コレクションから取得できます。また、Application オブジェクトの CreateItem メソッドで新規アイテムを作成することもできます。

Attachment オブジェクト

Attachment オブジェクトは、アイテムに添付されている添付ファイルの情報を取得したり、添付ファイルを保存したりする場合に使用されます。
Attachment オブジェクトは Item オブジェクトの Attachments コレクションから取得できます。

AddressList オブジェクト

AddressList オブジェクトは、アドレス帳にアクセスするためのオブジェクトです。NameSpace オブジェクトの AddressLists コレクションから取得できます。


以上、Outlook の主要なオブジェクトを簡単に説明してみました。ただ、これでもまだ 10 分の 1 にも満たないという位、多くのオブジェクトが Outlook オブジェクト モデルには含まれています。
特に Outlook 2007 では、これまでのバージョンで CDO を使用しなければ実現できなかったことを実現するために、さまざまなオブジェクトやメソッドなどが追加されており、かなり奥が深いものとなっています。
興味がある方は、前述の learn.microsoft.com の Outlook オブジェクト モデルのリファレンスを調べてみてください。

Outlook のオブジェクト モデル」への6件のフィードバック

  1. 素人でも分かりやすい解説ありがとうございます。
    さて、「NameSpace オブジェクト」の項の2つ目の( )内、「現時点では “MAPI” 以外の NameSpace を取得することはできませんが、今後増えることも無いと思いでしょう。」はキーボード入力ミスと思われますが、「・・・、今後も増えることがないでしょう」の意味でしょうか?
    あと、私の欲張りでしょうが同項の1つ目の( )「・・前回の記事を参照・・」に同ページへのリンクが張られていればいいなと思いました

コメントを残す