Outlookの自動操作

これまではVBAの基礎からIEの自動操作までを解説してきました。
今回はOutlookの自動操作についての説明をしていきたいと思います。

まずはこちらのコードを見てください。
Sub Sample()
Dim objOL As Object   'Outlook本体
Dim myNS As Object   'NameSpace
Dim myB As Object   '対象メールボックス
Dim myF As Object   '対象フォルダ
Dim myItem As Object    'メール本体
Dim bnam As String  'メールボックス名
Dim fnam As String  'フォルダ名
Dim s As Integer
'bnamとfnamの変数の代入
bnam = "ここにメールボックス名を入力"
fnam = "ここにフォルダ名を入力"

'Outlookの起動
Set objOL = CreateObject("Outlook.Application")

'NameSpaceの代入
Set myNS = objOL.GetNameSpace("MAPI")

'メールボックスの代入
Set myB = myNS.Folders(bnam)

'メールボックスの対象のフォルダ階層まで移動
Set myF = myB.Folders("受信トレイ").Folders(fnam)

'myFまで移動したOutlookを表示
myF.Display

'myFのフォルダのメールの数だけ繰り返す
For s = 1 To myF.Items.Count
    DoEvents

'メールを変数に代入する
    Set myItem = myF.Items(s)
'メールの本文を切り取る
    h = Trim(myItem.Body)
'対象のセルに本文を貼り付ける
    Cells(s + 1, 1).Value = h
'メールの変数を空にする
    Set myItem = Nothing
'本文の変数を空にする
    h = ""
Next
MsgBox "終了"
objOL.Quit
Set objOL = Nothing
End Sub
上記のコードを実行すると、情報のシートのA1のセルに入れた名前のメールボックスの情報のシートのA2のセルに入れたフォルダにあるメールを、全てExcelへ取り出してきます。

例えば仕事でメールで届いたものを「今まで何件も何十件もExcelへ取り出していた」という方の場合、このマクロを覚えてしまえば全て自動でExcelに取り出してきます。
また今までマクロでと考えていた人でもネットで情報が少なくて出来なかった人などいるかと思います。

そういう人はこの解説をよく読んで自分なりに新しく開発してみるのも良いかと思います。

Outlookの起動~NameSpaceの代入

まずはOutlookの起動からNameSpaceの指定までを解説します。
'Outlookの起動
Set objOL = CreateObject("Outlook.Application")
'NameSpaceの代入
Set myNS = objOL.GetNameSpace("MAPI")
Set objOL = CreateObject("Outlook.Application")
ここはIE操作【IE起動~読み込み】を勉強している人はわかると思います。
objOLへCreateObjectで作ったOutlook.Applicationを代入し、Outlookを起動しています。

Set myNS = objOL.GetNameSpace("MAPI")


次のNameSpaceの指定は始めて見ますよね?
このNameSpaceはVBAでは基本的に使用しませんので、このコードを丸暗記してもらえれば大丈夫です。

ちなみに簡単にNameSpaceを説明すると、例えば2人のプログラマーがそれぞれのパーツを作って1つのプログラムを作る時、同じ名前の変数を二人ともが宣言していると、実際にプログラムを動かす時、それぞれの変数の名前がぶつかり合います。
そうして変数が衝突してしまうとエラーが起こってしまうので、そういう時にNameSpaceを使い、「AさんのAという変数ですよ」とプログラムに教えるわけです。

メールボックスの代入~対象フォルダの表示

次に自動で操作したいメールボックスの選択から自動操作の対象になるフォルダの表示までを解説します。
'メールボックスの代入
Set myB = myNS.Folders(bnam)
'メールボックスの対象のフォルダ階層まで移動
Set myF = myB.Folders("受信トレイ").Folders(fnam)
'myFまで移動したOutlookを表示
myF.Display

Set myB = myNS.Folders(bnam)


このコードはメールボックスの変数先ほど指定したネームスペースの中のbnamに代入した名前のフォルダを代入」という処理をしています。
つまりOutlook内のbnamのメールボックスを変数にしています。

Set myF = myB.Folders("受信フォルダ").Folders(fnam)


このコードではフォルダの変数先ほど指定したメールボックス受信フォルダの中のfnamに代入した名前のフォルダを代入」という処理をしています。
こちらも同じようにOutlook内のfnamのメールボックスを変数にしています。

myF.Display


これはmyFに代入したフォルダを可視化=見えるようにしています。
今までのIEの自動操作だと「Visible = True」として可視化していましたが、Outlookでは.Displayを使います。

メールの取り出し

最後にメールの取り出し方です。
'myFのフォルダのメールの数だけ繰り返す
For s = 1 To myF.Items.Count
    DoEvents
'メールを変数に代入する
    Set myItem = myF.Items(s)
'メールの本文を切り取る
    h = Trim(myItem.Body)
'対象のセルに本文を貼り付ける
    Cells(s + 1, 1).Value = h
'メールの変数を空にする
    Set myItem = Nothing
'本文の変数を空にする
    h = ""
Next
For s = 1 To myF.Items.Count
このコードでは「1~myFのフォルダの中にあるメールの数だけ繰り返し」という処理をします。
IEの自動操作で言うところの「For Each」でオブジェクトの数だけ繰り返しをするイメージです。

DoEvents


これはIEの自動操作の読み込み待ちでも使っていたようにOSに処理を戻すということでPCを操作出来る状態にしてくれます。

Set myItem = myF.Items(s)


このコードではmyItemmyFのフォルダs番目のメールを代入」という処理を実行しています。
今更ですが、ところどころに出てきているItemsとはフォルダ内のアイテム=メールになります。
勘の良い方はとっくに気付いてたでしょうけどね。笑

h = Trim(myItem.Body)


これはhという変数に前後の空白を切り取った状態myItemBody部分=本文を代入」ということになります。
例えばmyItem.Bodyをそのまま代入すると本文の最初や最後に空白があった場合、そのままセルの中に入れてしまうので、私が使う時には邪魔になるのでこのように削除しています。

Cells(s + 1, 1).Value = h


これはもう大丈夫ですよね?
s+1行目の1列目のセルにhに代入したメールの本文を貼り付けます。

Set myItem = Nothing
h = ""


この2つのコードはmyItemとhの変数の中身を空にしています。
これは念の為に2つの変数の中身を空にすることで誤って変数が上書きされないことを防ぐ為に入れました。
Outlookの自動操作はあまりしていないので不安なところがあるので確実に動いているかのチェックの為に入れています。

最後に

ここまでの操作が出来るようになったらメールの本文の取出しが出来るようになると思います。
例えばBodyを使用したら本文を指定することになりますが、Toを使用したら宛先を指定する事になります。
他にもOutlookに対するプロパティやメソッドがあるので、その辺についてはまた次の機会に説明したいと思います。