034 イベントマクロの基本

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

Outlook VBAでイベントマクロを操れるようになると、いろいろな自動化を行うことができるようになります。

例えば、「メールの送信」イベントをトリガーとして、「本当に送っていいんですか?」と警告を表示するマクロなどを作ることができます。(この記事参照

イベントマクロはExcel VBAでも作ることができますが、Excelのイベントはあまり使っている方は少ないのではないかと思います。

でもOutlookのメール処理でイベントが使えると、いろんな便利ツールを自作できるようになるため、Excelでイベントコードの学習をパスした人でも、是非OutlookVBAでは挑戦して頂きたいと思います。

なお、途中で「アイテムレベルのイベント」が出てきますが、これは習得コストが高いですし、応用するためにはアイディアの閃きが要るため、「アプリケーションレベルのイベント」だけを習得することで止めても良いと思います。

まずは作ってみよう

次の手順でイベントマクロを作ります。まずは「メール等の送信」というイベントをトリガーとして「添付資料を忘れてませんか?送りますよ?」と注意喚起してくれるマクロを作ります。

手順は次の通りです。

1.ThisOutlookSessionを開く
2.オブジェクトボックスからApplicationを選択する
3.(もし必要なら)プロシージャボックスからItemSendを選択する
4.コードウィンドウにイベントマクロが記述されたことを確認する
5.メッセージボックスを表示させる

この手順を実際に行っていきましょう。

1.ThisOutlookSessionを開く

VBEの左上のプロジェクトウィンドウの[Microsoft Outlook Objects]の中に[ThisOutlookSession]というモジュールがあります。
イベントマクロはこの中に記述します。
標準モジュールに記述しても動きませんので注意してください。

2.オブジェクトボックスからApplicationを選択する

コードウィンドウの上に[オブジェクトボックス]と[プロシージャボックス]があります。
このオブジェクトボックスを開いてApplicationを選択してください。

環境によって、Applicationを選択するだけで、プロシージャボックスにItemSendが入力されるかもしれません。その場合は手順3はスルーして手順4に進んで下さい。

3.(もし必要なら)プロシージャボックスからItemSendを選択する

手順2でプロシージャボックスにItemSendが自動入力されない場合は、下の図のようにプロシージャボックスからItemSendを選んでください。


4.コードウィンドウにイベントマクロが記述されたことを確認する

上述の3項の図のようにPrivate Subから始まるコードが自動入力されます。
これが「メール等の送信」をトリガーとして動くイベントコードです。

5.メッセージボックスを表示させる

次のようにコーディングします。

このコードは以下の通りです。コピペで動くと思います。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

  If MsgBox("添付資料を忘れてませんか?送りますよ", vbYesNo) = vbNo Then
    Cancel = True
  End If

End Sub

このように記述すると、「添付資料を忘れてませんか?送りますよ?」というメッセージボックスを表示させ、Noが選択されると送信しないようにすることができます。

イベントマクロの作り方の雰囲気を理解頂けたでしょうか?
通常のマクロと違って、プロシージャ名は書く必要ありません。プロジェクトボックスとプロシージャボックスをクリックして外殻を作り、中の処理を追記するように作ります。

なお、今回サンプルとして作成したイベントマクロは割と使えます。
メールに添付資料を忘れて送ってしまうことはよくあるミスだと思われます。
メールを誤送信すると、謝罪付きメールを再送する手間で数分かかりますし、僅かながら相手の時間を奪ってしまいます。
このイベントマクロで添付資料忘れのミス確率を下げることができます。

イベントマクロの基本

上記にてイベントマクロを1例作ってみました。
これをベースにイベントマクロの基本事項を体系的に解説します。

イベントマクロを記述する場所

イベントマクロは標準モジュールではなく、ThisOutlookSessionに記述します。
標準モジュールに記述しても動作しないのでご注意ください。

イベントマクロは大きく分けて2種類ある

イベントマクロは大きく分けて次の2種類あります。

-アプリケーションレベルのイベント
-アイテムレベルのイベント

先ほど作成したイベントマクロは、オブジェクトボックスからApplicationを選択したので、「アプリケーションレベルのイベント」になります。

先ほどのイベントマクロは「今開いているメールアイテムが送信された」という個別アイテム&動きをトリガーとしていたわけではなく、「Outlookアプリの送信ボタンが押された」というアプリケーションの動きをトリガーとして動いています。

そのため、先ほどのイベントマクロはメールだけではなく、スケジュールから送る「会議案内」などでも動作します。

このようにオブジェクトが「Application」で動くイベントをアプリケーションレベルのイベントといいます。

一方、「アイテムレベルのイベント」はメールアイテムオブジェクトなどの個別のアイテムの動作をトリガーとして動作します。
この「アイテムレベルのイベント」のアイテムには「Inspectorsオブジェクト(=つまりメールウィンドウなど)」なども含み、極めて多くの種類があります。

アイテムレベルのイベントの基本事項は後述します。

イベントマクロの書式

イベントマクロは次のような書式で記述します。

Private Sub オブジェクト_イベント(引数)
  処理
End Sub

オブジェクトとイベントをアンダーバーで繋ぐという独特な書き方をします。

「オブジェクト」をApplicationにすればアプリケーションレベルのイベント、メールアイテムを示すオブジェクトにすればアイテムレベルのイベントを設定できます。

「イベント」にはItemSend(アイテムを送信した時)や、Startup(Outlookを起動したとき)のように、「〇〇したとき」というイベントを記述します。

ただし、実際には記述する必要はなく、オブジェクトボックス、プロシージャボックスをクリックするだけでイベントプロシージャを作成することができます。

アイテムレベルのイベントを作成する

アイテムレベルのイベントを作成するのは事前準備が必要です。
具体的には、WithEvenstステートメントを使って、各アイテムを示すオブジェクトを作る必要があります。
次の手順でメールアイテムに対するアイテムレベルのイベントを作ってみましょう。

1.WithEventsでMailItemを示すmyMailItemオブジェクトを作成する
2.オブジェクトボックスからmyMailItemを選択する
3.プロシージャボックスからイベントを選択する

具体的に操作を見てみましょう。

1.WithEventsでMailItemを示すmyMailItemオブジェクトを作成する

コードウィンドウの最初にWithEventsステートメントでオブジェクトを作ります。このように記述します。

コードはこのように書きます。なお、「WithEvents」は「s」が付くので注意してください。「WithEvent」のように「s」を付け忘れると動きません。

Private WithEvents myMailItem As MailItem

WithEventsステートメントはオブジェクト変数を定義するコードであり、「Dimとほとんど同じ」と思っていいと思います。ただし、WithEventsで定義したオブジェクト変数はイベントに応答するようになります。

WithEventsの書式は次の通りです。

Private WithEvents オブジェクト名 As オブジェクト型

オブジェクト名は好きな名前を付けてよいのですが、Microsoft社の公式DocsではmyMailItemのように「my + オブジェクト型」で記述されることがほとんどです。
そのため、私はイベントマクロに使うオブジェクト名は「my + オブジェクト型」を使ってます。

次に、オブジェクト型ですが、「Object」は使えません。ObjectはVariantのようにどのようなオブジェクトでもセットすることができる便利な型なのですが、イベントマクロではWithEventsで宣言する際にオブジェクトの具体的な型を決める必要があります。

主要なオブジェクトの型式はこちらです。

オブジェクト型内容
MailItemメールアイテム
AppointmentItem予定表アイテム
TaskItemタスクアイテム
Inspectorsインスペクター(アイテムをダブルクリックした時に表示されるウィンドウ)

オブジェクト型は非常に多くのものがあり覚えきれません。

そこで作りたいイベントに応じてオブジェクトを調べることになります。
このページの下部にてMicrosoftの公式Docsで調べる方法を後述します。

2.オブジェクトボックスからmyMailItemを選択する

オブジェクトボックスをクリックすると、先ほどはなかったmyMailItemが選択しにあらわれます。

このmyMailItemをクリックするとメールアイテムレベルのイベントを作成することができます。

3.プロシージャボックスからイベントを選択する

前述の2項ですでのOpenイベントが選択されているかもしれません。今回はReplyAllイベントを使ってみようと思いますので、ReplyAllを選択します。

これで「全員に返信」でメールが作られたときに動作するイベントを作成することができます。
次のようなサンプルコードを書いてみましょう。

コードはこちら

Private Sub myMailItem_ReplyAll(ByVal Response As Object, Cancel As Boolean)

  MsgBox ("宛先を確認してください")

End Sub

これで「全員に返信」を押したときに「宛先を確認してください」と表示されると思いきや、まだ動きません。アイテムレベルのイベントにはコツがいります。

アイテムレベルのイベントを使うコツ

アイテムレベルのイベントを使うのは、ちょっとコツがいります。

WithEventsステートメントでmyMailItemを作ったとして、このオブジェクト変数にイベント操作したいメールアイテムをセットする必要があるのです。

これを実現するため、回りくどいですが次のような操作を行います。

1.Outlook起動時にApplication.InspectorsオブジェクトをmyInspectorsオブジェクトとしてセット。
2.NewInspectorイベントを使い、新しいメールウィンドウが開いたときに、myInspectorsオブジェクトのCurrentItemをmyMailItemにセット。

これを実現するためのコードは次のようになります。

Private WithEvents myInspectors As Inspectors


Private Sub Application_Startup()
  
  Set myInspectors = Application.Inspectors

End Sub


Private Sub myInspectors_NewInspector(ByVal Inspector As Inspector)

'メールなどのアイテムを開く時に、「myMailItem」に開いたアイテムを登録する
  If Inspector.CurrentItem.Class = olMail Then
    Set myMailItem = Inspector.CurrentItem
  Else
    Set myMailItem = Nothing
  End If

End Sub

まず1行目でWithEventsを使いmyInspectorsオブジェクトを定義
2行目~4行目でOutlook起動時にmyInspectorsオブジェクトにApplication.Inspectorsをセット。
5行目~11行目で新しいメール等のウィンドウ(インスペクター)を開いたときに、それがメールだったらmyMailItemにセットする。

というコードです。
このコードを加筆することで開いたメールアイテムがmyMailItemにセットされるため、アイテムレベルのイベントを作成することができます。

以上でアイテムレベルのイベントの解説は以上です。

サンプルコードをすべて記載し、対象のメールをダブルクリックして新しいウィンドウで開き、その状態で全員に返信ボタンを押すと、「宛先を確認してください」とメッセージボックスが表示されるようになります。

Microsoftの公式Docsでオブジェクトとイベントを調べる方法

まずはMicrosoftのOutlookVBAのページに行きます。

https://docs.microsoft.com/ja-jp/office/vba/api/overview/outlook

そして左下の[オブジェクトモデル]を展開します。

展開したものが次の画像になりますが、これすべてがオブジェクト型です。

例えばMailItemを探して展開してみましょう。

展開すると「MailItemオブジェクト」「イベント」「メソッド」「プロパティ」が表示されます。例えば「MailItemオブジェクト」を開くと、MailItemオブジェクトに関わる解説文書を読むことができます。

では「イベント」を展開してみましょう。

展開するとこのようにイベントが一覧で出てきます。

このイベントはVBEのプロシージャボックスに出てくるイベントと一致しています。(次図)
そのため、VBEのプロシージャボックスに出てくるイベントの詳細を調べたい時にMicrosoft公式Docsを調べれば色々と分かります。

ただし、Microsoft公式Docsはかなり難解です。Googleで使いたいイベントを調べる方が先に見つかったりします。


イベントについてきっちりした記事を書いてみました。
ぶっちゃけApplicationレベルのイベントだけでも色々なものが作れるので、是非使ってみてください。

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

くのへスタジオはこちら。
Outlook-VBAコーナーはこちら。

コメントを残す

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