【Outlook VBA】Outlook VBAのオブジェクトについて

今回は少し難しい内容となります。

Outlook VBAを扱うにあたり、サンプルコードをコピペだけで済ませるように構成を考えていましたが、設定が必要なケースがほとんどであり、その設定操作の対象となるオブジェクトについてその概念を理解しておかないと設定でつまずくことになるので説明が必要だと判断しました。

そこで今回はオブジェクトについてなるべくカンタンに説明をしたいと思います。


オブジェクトとは

オブジェクトとは、受信アイテムやフォルダ、受信者の情などVBAで何か操作をしようとする対象となるそのものを指し、Outlookではそれをオブジェクトモデルと呼びます。
Outlookの主なオブジェクトモデルは次のようなものがあります。

要素名 概要
Application Outlookアプリケーションそのもののこと。
NameSpace メールボックスのデータへアクセスする空間のこと。名前は”MAPI”の一択。
Folders 受信トレイなどOutlook のフォルダのコレクション。
Items メールアイテム(メール、予定、連絡先、タスクなど)のコレクション。
Attachment 添付ファイルにアクセスするためのオブジェクト。
AddressList アドレス帳にアクセスするためのオブジェクト。
Inspector 表示中のウインドウのアイテムにアクセスするためのオブジェクト。
Search Outlookで検索に関する情報にアクセスするためのオブジェクト。
Results Search オブジェクトと AdvancedSearchメソッドで取得されたデータおよび結果を格納するためのオブジェクト。

また、オブジェクトのFoldersやItemsなど一つのオブジェクトに複数の子オブジェクトが含まれるケースがあります。これをコレクションと言い、そのオブジェクトを利用する際にはコレクション内に含まれるオブジェクトの場所を指定をする必要があります。
また、コレクションは以下のような階層構造になっています。

Application
  |
  +- NameSpace "MAPI"
  |    |
  |    +- Folders
  |         |
  |         +- Folder
  |         +- 受信トレイ
  |         +- 下書き
  |         +- 送信済みアイテム
  |               |
  |               +- Items
  |                    |
  |                    +- Item
  |                    +- Attachment
  |
  |
  +- Inspectors
  |    |
  |    +- Inspector
  |
  +- Search
       |
       +- Results

最上位には「Application」オブジェクトがあり、Outlook というアプリケーション ソフトそのものをあらわすオブジェクトです。いわゆる木の根っこの部分に該当し、順に空間、フォルダコレクション、各フォルダ、と枝分かれし階層が深くなっていく構造となっています。

またこの図からわかる通り下位層のオブジェクトを扱う場合は「Application」オブジェクトと「NameSpace “MAPI”」を経由することになるので、指定が必要になってきます。

気になる”MAPI”についてですが、公式サイトでは、

NameSpace オブジェクトは、MAPIのセッションに該当するものであり、アドレス帳やメッセージ ストアのプロバイダによって提供されるデータにアクセスするためのインターフェイスとなるものです。

とありましたので、”MAPI”はメールボックスに保管されているメールデータをPC側のOutlookからアクセスする上で必要な通信手段ぐらいに覚えておきましょう。まあ、呪文ぐらいに思ったほうがよいかもしれませんね。
なお現時点では “MAPI” 以外の NameSpace を取得することはできないようです。


オブジェクトの使い方

使い方はまず「Dim」で変数をオブジェクト型に定義し、その変数に値を格納する時、左に「Set」を付けます。

Dimでオブジェクト型の変数を定義します。

Dim myNameSpace As Outlook.NameSpace
Dim myFolder As Outlook.Folder

MAPI空間をセットします。
Set myNameSpace = Application.GetNameSpace(“MAPI”)
続いて受信トレイフォルダをセットします。引数の「olFolderInbox」は種類を指定するものになります。また値“6”でも指定が可能です。

フォルダの種類指定は主に以下のものがあります。

指定値 説明
olfoldercalendar 9 予定表フォルダー。
olfolderconflicts 19 競合フォルダー (同期の失敗フォルダーのサブフォルダー)。?Exchange アカウントの場合のみ。
olfoldercontacts 10 連絡先フォルダー。
olFolderDeletedItems 3 削除済みアイテム フォルダー。
olfolderdrafts 16 下書きフォルダー。
olfolderinbox 受信トレイフォルダー。
olfolderjournal 11 履歴フォルダー。
olfolderjunk 23 迷惑メール フォルダー。
olfolderlocalfailures 21 ローカルの失敗フォルダー (同期の失敗フォルダーのサブフォルダー)。?Exchange アカウントの場合のみ。
olFolderManagedEmail 29 管理対象のフォルダー。グループの最上位フォルダー。
olfoldernotes 12 メモフォルダー。
olfolderoutbox 4 送信トレイフォルダー。
olfolder 5 送信済みアイテムフォルダー。
olfolderserverfailures 失敗 22 サーバーの失敗フォルダー (同期の失敗フォルダーのサブフォルダー)。?Exchange アカウントの場合のみ。
olFolderSuggestedContacts 30 連絡先候補フォルダー。
olfoldersyncissues 問題 20 同期の失敗フォルダー。?Exchange アカウントの場合のみ。
olfoldertasks 13 タスクフォルダー。
olfoldertodo 28 To Doフォルダー。
olpublicfolders allpublicfolders 18 Exchange パブリックフォルダー。ストア内の All Public Foldersフォルダー。Exchange アカウントの場合のみ。
olFolderRssFeeds 25 RSS フィードフォルダー。

上記の受信トレイなどOutlook 起動時に作成される既定のフォルダについては NameSpace オブジェクトの GetDefaultFolder メソッドを利用し取得する方法が一般的のようです。

Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)

数字でも位置指定をすることができます。(6)は上記表の値から受信トレイを指すことになります。また数字の部分をインデックス番号と呼びます。

Set myFolder = myNameSpace.GetDefaultFolder(6)

続いてフォルダ名を取得してみます。受信トレイ内のフォルダはFoldersに格納され、複数個ありますのでその場合はコレクション扱いとなります。
サンプルは1番目を指定し「受信トレイ」がイミディエイトウィンドウに表示されます。

Debug.print myFolder.Folders(1)

Inspectorオブジェクトについて

オブジェクトを語る上でInspector(インスペクター)オブジェクトも欠かせない存在になっています。

Inspectorオブジェクトは今開いているOutlookのウインドウ(メール、予定、連作先など)のアイテム(メール本文や宛先アドレスや件名、添付ファイルなどなど)が含まれ、アクセスする際に使用します。

MAPI経由でオブジェクトを作成する場合では最大でOutlookアプリケーション全体のアイテムが含まれることになりますが、このInspectorオブジェクトを使うと開いているウインドウのアイテムのみに絞られますので軽量化がされ効率的にアイテムの利用ができるようになります。

記述もCurrentItemのほうが効率的ですね。
・MAPI経由の記述
Application.GetNameSpace(“MAPI”).GetDefaultFolder(6).Items(1)

・CurrentItem指定の記述
ActiveInspector.CurrentItem

エク短でもハイパーリンクに関する操作で利用しています。使用例としてご参考いただければと思います。

【Outlook VBA】ボタンクリック一発でハイパーリンクを一括追加、またはハイパーリンクを一括削除する

カンタンに説明しますと、Inspectorオブジェクトを取得するメソッドはActiveInspectorメソッドとなります。

サンプルはActiveInspectorメソッドでメール本文のワード編集領域を取得し、オブジェクトとして定義しています。

Set objWord = ActiveInspector.WordEditor

また、CurrentItemプロパティを使うと今開いているメールのうち一番手前のメールのアイテムを取得できます。こちらのほうが多くのアイテムが含まれますので、参照したり編集する領域が広範囲であればこちらを選択したほうがよいでしょう。

Set objWord = ActiveInspector.CurrentItem

またプロパティ指定でさらに絞り込むことができます。
たとえば、
CurrentItem.Subject:件名
CurrentItem.Body:本文
CurrentItem.To:宛先
CurrentItem.receivedTime:受信日時
CurrentItem.Attachments:添付ファイル
のようなものが可能です。

図にするとこのような感じです。

Application
  |
  +- ActiveInspector
       |
       +- CurrentItem
            |
            +- 件名
            +- 本文
            +- 宛先
            +- 受信日時

今回のオブジェクトはここまでとし、次回はオブジェクトを操作するためのプロパティメソッドについてご説明をいたします。

【Outlook VBA】Outlook VBAのプロパティとメソッドについて




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です