017 Outlook VBA オブジェクト構造その2(Outlook.Application、Explorer、Inspector)

こんにちは、くのへ@MasazaneKunoheです。

前回の記事でMapiの下のオブジェクト構造を解説しました。
実は、MAPIのさらに上のオブジェクト構造があります。
Outlook.Applicationです。

そこで、今回はOutlook.ApplicationとMAPI、そしてExplorerとInspectorオブジェクト構造を解説します。
これで、Outlook-VBAの全体像がもう少し理解しやすくなると思います。

なお、この記事もちょっと難しいです。

Outlook.Applicationオブジェクト構造

Outlook.Applicationは次のような構造になっており、Outlook.Applicationの直下にExplorers、Inspectors、Sessionがあります。

Outlook.Application
 ┗Explorers
  ┗Item 1 ←今開いているOutlookの画面のこと
    ┗Caption ←表示しているアイテムの場所情報(受信トレイや予定表など)
    ┗Selection ←画面上で選択しているアイテム(複数でもOK)
     Item 1 ←選択している1番目のアイテム
      ┗Subject ←件名
      ┗Body ←本文

 ┗Inspectors ←アイテムをダブルクリックして開いたウィンドウ情報の集合体
  ┗Item 1 ←1番目に開いたウィンドウ
    ┗CurrentItem ←アイテム情報が入っているところ
      ┗Subject ←件名
      ┗Body ←本文
  ┗Item 2 ←2番目に開いたウィンドウ
  ┗・・・ ←・・・に開いたウィンドウ

 ┗Session ←MAPIのこと
  ┗Folders
    ┗Item 1 ←メールアカウントのこと
     ┗Name ←メールアカウントアドレス
     ┗Folders
       ┗Item 1 ←ゴミ箱
       ┗Item 2 ←受信トレイ
         ┗Items ←メールアイテムが入っている場所
           ┗Item 1 ←1番目のメール
             ┗To ←宛先
             ┗Subject ←件名
             ┗Body ←本文

これを確かめてみましょう。
次のコードを実行するとstopでコードが停止します。その際にローカルウィンドウでappOLを開くと、上記のオブジェクト構造を確かめることが出来ます。(ローカルウィンドウの開き方は前回記事参照

Sub testAppOL()

Dim appOL As Outlook.Application
Set appOL = Application

Stop

End Sub

このExplorers、Inspectors、Sessoinの3つの構造のうち、Sessionは前回の記事のMAPIのことです。
Microsoftの公式Docsにも、同じものであると書かれています(出典リンク)。

次の章でExplorersとInspectorsについて解説します。

Explorers

ExplorersはOutlookを開いた時の、↓このウィンドウのことです。

Outlookウィンドウは、(仮想デスクトップなどを使うと)2個以上表示することが出来ます。
ExplorersはこのOutlookウィンドウ画面の集合体(コレクション)であり、Explorersの直下の「Item 1」「Item 2」、、、で識別されています。(↓下記図参照)
ちなみにOutlookウィンドウを1つしか開いていない場合は、Item 1しかありません。

Explorers.Item(1).Selection.Item(1)

このExplorers.Item(1)のプロパティにSelectionというプロパティがあります。
これは読んで字のごとく、Outlookウィンドウにて選択しているアイテムを指します。

下の図のようにメールアイテムを2つ選択している状態だと、図のような関係になります。

このような構造になっていることから、上のメールを操作したい場合には、Selection.Item(1)を使えばよいので、
 Explorers.Item(1).Selection.Item(1)
で操作することが出来ます。例えば件名をメッセージボックスに表示させたい時には、
 Msgbox Explorers.Item(1).Selection.Item(1).Subject
と書けば件名を表示できます。

ActiveExplorerが便利

選択中のOutlookウィンドウはActiveExplorerで取得することが出来ます。
ExplorersではなくExplorerなのでスペルミス注意!!(複数形のsはつけちゃダメ)

例えば
Explorers.Item(1).Selection.Item(1)

ActiveExplorer.Selection.Item(1)
とほぼ等価です。

Outlookウィンドウを2つ以上開いている時にマクロを動かしたい時は、選択中のOutlookウィンドウに対してマクロを動かしたいはずなので、ActiveExplorerの方が便利に使えます。

メールを一発保存マクロではこのActiveExplorer.Selection.Item(1)の仕組み使ってます😀
(ちょっとオブジェクト変数が違うけど同義の仕組み)

Inspectors

Inspectorsはメールなどのアイテムをダブルクリックした時に出てくるウィンドウのことです。

アイテムウィンドウは、別のメールなどを開くこと2個以上表示することが出来ます。
Inspectorsはこのアイテムウィンドウ画面の集合体(コレクション)であり、Inspectorsの直下の「Item 1」「Item 2」、、、で識別されています。(↓下記図参照)

Inspectors.Item(1).CurrentItem

このInspectors.Item(1)のプロパティにCurrentItemというプロパティがあります。
これはインスペクターで選択したアイテム本体を指します。

Inspectorsを用いて、件名をメッセージボックスに表示させたい時には、
 Msgbox Inspectors.Item(1).CurrentItem.Subject
と書けば件名を表示できます。

ActiveInspectorが便利

選択中のアイテムウィンドウはActiveInspectorで取得することが出来ます。
InspectorsではなくInspectorなのでスペルミス注意!!(複数形のsはつけちゃダメ)

例えば
Inspectors.Item(1).CurrentItem

ActiveInspector.CurrentItem
とほぼ等価です。

メールなどのアイテムウィンドウを2つ以上開いている時にマクロを動かしたい時は、選択中のアイテムウィンドウに対してマクロを動かしたいはずなので、ActiveInspectorの方が便利に使えます。

メールを一発保存マクロシンプル版ではこのActiveInspector.CurrentItemの仕組み使ってます😀
(ちょっとオブジェクト変数が違うけど同義の仕組み)

実はこの3か所は等価です

冒頭に出てきたOutlook.ApplicationのExplorers、Inspectors、Sessionの赤く塗った部分は等価です。
同じメールを操作している場合、これらの下位プロパティはすべて同一になります。

Outlook.Application
 ┗Explorers
  ┗Item 1 ←今開いているOutlookの画面のこと
    ┗Caption ←表示しているアイテムの場所情報(受信トレイや予定表など)
    ┗Selection ←画面上で選択しているアイテム(複数でもOK)
     Item 1 ←選択している1番目のアイテム
      ┗Subject ←件名
      ┗Body ←本文

 ┗Inspectors ←アイテムをダブルクリックして開いたウィンドウ情報の集合体
  ┗Item 1 ←1番目に開いたウィンドウ
    ┗CurrentItem ←アイテム情報が入っているところ
      ┗Subject ←件名
      ┗Body ←本文
  ┗Item 2 ←2番目に開いたウィンドウ
  ┗・・・ ←・・・に開いたウィンドウ

 ┗Session ←MAPIのこと
  ┗Folders
    ┗Item 1 ←メールアカウントのこと
     ┗Name ←メールアカウントアドレス
     ┗Folders
       ┗Item 1 ←ゴミ箱
       ┗Item 2 ←受信トレイ
         ┗Items ←メールアイテムが入っている場所
           ┗Item 1 ←1番目のメール
             ┗To ←宛先
             ┗Subject ←件名
             ┗Body ←本文

この特性を理解しておくと、Parentプロパティとの組み合わせが便利に使えます。(Parentプロパティの使い方はこちら

↓この図の通り、ParentプロパティでMAPIの上流にさかのぼることができるので、選択中のメールやInspectorで開いているメールがどのフォルダに含まれているか調査することが出来ます。

例えば、ActiveInspector.CurrentItemで選択したアイテムについて、Parentを使って保存トレイを調査する方法がこちらの記事に出てきます。是非その記事も見てください😃


このような構造が理解できると、色々と応用できそうですね!!
でも、ちょっと難しいよね~

ではまた別の記事で~
🦅バサバサ~

感想等はツイッターにお願いします。こちら。
くのへスタジオはこちら。
Outlook-VBAコーナーはこちら。

謝辞

こちらのQiita記事が大変勉強になりました。(実はTwitterで御本人からご紹介頂きました)
この記事よりも、もっと厳密に詳しく知りたい方はこちらもご参照ください。

https://qiita.com/sewege11/items/488c6d518dc25ca35d00

コメントを残す

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