VisualBasic(Outlookマクロ:Outlook起動時、メール受信時のマクロ実行)

■手動以外でのマクロ実行。
前回までのサンプルでは、「開発」ー「マクロ」ー「Sample(マクロの名前)」でマクロを実行したけど、これはすべて手動で行う。もともと、今、毎日行っていることの中に、普段やらないことを組み入れようとの考えからマクロを見てきたけど、マクロの実行を忘れては意味がない。そのため、Outlook内のイベントに対してマクロ実行する方法がないか探してみた。

マクロの編集の画面では、下のようにMicrosoft Outlook Objects、標準モジュール、クラスモジュールがあるけど、この中の Microsoft Outlook Objects の ThisOutlookSession にイベント関連のコードを入れることでOutlookの操作からマクロ実行ができるよう。

簡単なサンプルとして、下のコードを ThisOutlookSession に入れた。保存の仕方がよく分からないので、Outlookを一端閉じて、閉じる際の修正を保存するかの確認ダイアログで保存。そのあと、Outlookを起動した。

Private Sub Application_Startup()
 
 MsgBox "start"

End Sub

すると、Outlookの起動時に、MsgBox "start"の通り、メッセージボックスが表示された。
Application_Startupを使用すれば、Outlookの起動時にマクロ実行ができそう。

他のイベントに対してもマクロ実行ができないか調べてみると、 WithEvents が使えるよう。
メール受信の際に、同じようにメッセージボックスを出すコードを作ってみた。

Private WithEvents sampleMailItems As Outlook.Items

Private Sub Application_Startup()
 
 MsgBox "start"
 
 Set myNameSpace = Application.GetNamespace("MAPI")
 Set sampleMailItems = myNameSpace.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub sampleMailItems_ItemAdd(ByVal item As Object)
 MsgBox "Mail received"
End Sub

ここで、WithEventsとしてsampleMailItemsと名前を付けて、Outlookの起動時に受信トレイのItemsと紐づけている。何度か試してみたけど、この紐づけをやらないとイベントが起こったことを判定できない。sampleMailItems_ItemAdd は、WithEventsの変数名+"_"+イベント名(おそらく決まった名称)で、これにより指定したイベントが起きたときに内部のコードを実行。

実行結果が下の図。「すべてのフォルダーを送受信」ボタンを押して、メールを受信した際に、メッセージボックスが表示される。

今回、Outlookの起動時やメール受信時のマクロの実行を試してみたけど、いろいろと使えそう。