今回は、Outlook のマクロを作成します。
Outlook でマクロを作成する方法は、前回の「C#だけじゃなくVBも覚えてOfficeマクロ(Visual Basic for Applications: VBA)を始めよう!」で紹介しています。
目次
今回作成するマクロの機能
- Outlook の 受信トレイ から、他のフォルダにメールをドラッグ&ドロップした時に、「仕分けルールの作成」ダイアログを表示する
技術的なポイント
- Outlook 起動時のイベント処理を実装
- 受信トレイ のイベント処理を実装
- Outlook の メニューの項目を実行
マクロのコード
次のコードは右上の “view sourec” と表示されるアイコンからコピーできます。
ThisOutlookSession
[vb]' Inbox (受信トレイ) のオブジェクトです。アプリケーションの開始時に割り当てられます。
Public WithEvents myInboxFolder As Folder
' アプリケーションの開始時に実行される処理です。
'
Private Sub Application_Startup()
' Inbox (受信トレイ) のオブジェクトを取得して、変数に格納します。
Set myInboxFolder = Me.Application.Session.GetDefaultFolder(olFolderInbox)
End Sub
' 受信トレイからアイテムが移動される前に実行される処理です。
' ユーザーに仕分けルールを作成するかどうか確認するダイアログを表示し、その結果に応じて仕分けルール作成画面を表示します。
'
' 引数 Item - イベントが発生したオブジェクトです。
' 引数 MoveTo - 異動先のフォルダを表すオブジェクトです。
' 引数(参照) Cancel - True を設定すると、アイテムの移動を中止します。規定値は False です。
'
Private Sub myInboxFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean)
Select Case MsgBox("仕分けルールを作成しますか?", vbInformation Or vbYesNoCancel)
Case vbYes
' 仕分けルールを作成のダイアログを表示します。
Me.Application.ActiveExplorer.CommandBars("Standard").FindControl(ID:=721).Execute
Case vbNo
' 仕分けルールを作成しません(ここでは何もしません)
Case vbCancel
' アイテムの移動をしないで処理を終了します。
Cancel = True
Exit Sub
End Select
End Sub[/vb]
解説
今回は初めてのマクロということなので、とりあえずコードをそのまま貼り付けてみてください。このマクロは初めて Outlook が起動したときに、イベント処理が出来るように初期化を行っているので、マクロを保存できたら、一度 Outlook を再起動してください。
再起動後に、受信トレイに入っているメールを、他のフォルダにドラッグ&ドロップすると、仕分けルールを作成するか?聞かれます。そこで [はい] を選択すると仕分けルールを作成するウィンドウが表示されます。このウィンドウが表示されれば成功です。
1. Outlook起動時のイベント処理を実装
まず、C# と VB ではイベントハンドラをコードエディタに挿入する方法が違います。VBでは(VB.net ではC#と同様プロパティウィンドウからの追加も出来ますが)コードエディタの上に部分にある オブジェクトの名称 と イベントの名称 を選択すると、自動的にイベントハンドラ のコードが挿入されます。
C# では既に実装済みのイベントしかここに表示されませんが、VBでは実装済みのものが太字で表示され、全てのイベントが表示されます。
ここで Application の Startup を選択すると、Outlook が起動した時の処理を実行するコードを記述することが出来ます。(6行目~9行目)
2. 受信トレイのイベント処理を実装
今回自動化したい機能は、受信トレイからメールを他のフォルダに移動したときに、「仕分けルールの作成」ウィンドウを自動で表示することです。
そこで、「受信トレイからアイテムが移動される時」に発生するイベントのイベントハンドラを記述します。そのためには、まず、受信トレイオブジェクトの参照を、コードに追加する必要があります。(2行目)
VB(とVB.net)には、C# にはない WithEvents という機能があります。
このキーワードをつけて宣言された変数は、変数にオブジェクトの参照が代入された瞬間に、AddEventHandler されたのと同じようにイベントハンドラにイベントが伝わるようになります。(なので VB.net の方がC#よりイベント処理を書くのが楽です。イベントハンドラ削除時にもデザイナCSファイルの AddEventHandler コードを削除する必要があありません。)
WithEvents を除くと、この2行目の書き方は C# でいうと
[csharp]Public Folder myInboxFolder;[/csharp]
と書いたのと同じです。C# と VB では 型 を書く位置が前後逆になります。
さて、ここで宣言した変数には、9行目で GetDefaultFolder メソッドからオブジェクトの参照をもらって代入しています。
VB の Me は C# の this です。自分のオブジェクトにある Application プロパティの Session プロパティの GetDefaultFolder メソッドを実行して、戻り値を変数に代入しています。この瞬間から、myInboxFolder で発生するイベントを処理できるようになります。
それではイベントハンドラを記述しましょう。
コードエディタの上部で、同様に、左で「myInputFolder」を選択し、右で「BeforeItemMove」を選択すると、「受信トレイからアイテムが移動される時」に発生するイベントのイベントハンドラがコードエディタに挿入されます。(20行目~36行目)
ユーザーがOutlookで、メールを受信トレイから他のフォルダに移動すると、ここに記述したプログラムが実行されます。
ところで BeforeItemMove は「アイテムの移動をする前」という意味で、移動した後ではないのは理由があります。ここで、Cancel = True を設定して処理を抜けると、メールは移動されずに処理がおわります。Cancel = False(規定値なので実際には書かなくてかまいません)で処理を抜けると、メールがそのまま移動されます。
メッセージボックスを表示して、仕分けを作成するか?しないか?選択する他に、移動もキャンセル出来るように出来ます。
3. Outlook のメニューの項目を実行
25行目で、Application の ActiveExplorer の CommandBars から何か探して実行している処理があります。これは Outlook のメニュー項目から、「仕分けルールの作成」を探して実行しています。
どの項目がどこにどういう名前・IDでオブジェクトとして存在しているのか?は、ちょっと資料が無くてわかりませんでした。なので私は、項目のタイトルを全て表示させてみて調べました。その方法はまた後日紹介します。ここでは、この名前とIDで探せば「仕分けルールの作成」が表示される、ぐらいで。
まとめ
以上の仕組みで、今回のマクロの機能は実装されています。
なんだか、As とか Set とか Select Case とかの説明を全くしませんでしたが、何となく C# と同じ考え方でコードが書けることは伝わったでしょうか。