コメントにて以下のご要望をいただきました。
いつも素晴らしいVBA、その他の情報ご提供ありがとうございます。
アイテム右クリックメニューについてお伺いします。かなり以前ですが、「右クリックメニューにフォルダーの移動コマンドを追加するマクロ」を公開いただいておりました。
ここで紹介いただいたApplication_ItemContextMenuDisplay というVBAのイベントは、Web上の情報でサポートされなくなったと聞きました。実際、同マクロは動作しないようです。
現時点で、例えば、特定メールを右クリックしてフォルダに移動する等のコマンドを実行する方法はありますでしょうか? 企業の o365のパッケージ上での Outlook を想定しています
コメントのご指摘の通り、ItemContextMenuDisplay は現在のバージョンでは使用できなくなっています。
現在のバージョンでコンテキスト メニューを拡張するには IRibbonExtensibility オブジェクトを使用してリボンのカスタマイズを行う必要があるのですが、このオブジェクトはマクロでは使用できず、アドインとして実装しなければなりません。
そこで、今回はコンテキスト メニューでフォルダーの移動を行う VSTO アドインの作成方法について説明します。
まず、Outlook の VSTO アドインを作成する方法 に記載されている手順の「アドインのコードの記述」まで実行します。
次にコンテキスト メニューを追加するコードの記述なのですが、その前にメニューを定義した Ribbon XML を作成します。
手順は以下の通りです。
- [プロジェクト] の [新しい項目の追加] をクリックする
- [新しい項目の追加] で [すべてのテンプレートの表示] をクリックする
- [新しい項目の追加 – プロジェクト名] で [リボン (XML)] を選択する
- [名前] に適切な名前 (“MyItemMove” など) を入力する
- [OK] をクリックする
- 右ペインの [ソリューション エクスプローラー] に追加された XML ファイルをダブルクリックする
- 既定で追加される XML を以下の XML で置き換える
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<contextMenus>
<contextMenu idMso="ContextMenuMailItem">
<button id="ButtonMoveAAA" label="AAA に移動" onAction="MoveToAAA" />
<button id="ButtonMoveBBB" label="BBB に移動" onAction="MoveToBBB" />
</contextMenu>
</contextMenus>
</customUI>
上記の XML において、label
はボタンに表示されるテキスト、onAction
はボタンをクリックすると呼び出されるメソッドを意味します。
メニューを増やす場合は、<button
… の行を追加し、id
、label
、onAction
にそれぞれ一意のものを指定します。
そして、呼び出されるメソッドは XML を追加した際に同時に追加された vb (例: MyItemMove.vb) ファイルの Public Class MyItemMove
から End Class
の間のどこかに以下のように記載します。
' AAA というフォルダーに移動
Public Sub MoveToAAA(ByVal control As Office.IRibbonControl)
MoveToFolder("AAA")
End Sub
' BBB というフォルダーに移動
Public Sub MoveToBBB(ByVal control As Office.IRibbonControl)
MoveToFolder("BBB")
End Sub
' 指定した名前のフォルダーに移動
Private Sub MoveToFolder(strFolder As String)
Dim fldDest As Folder
Dim objMove As Object
'
Try
With Globals.ThisAddIn.Application
fldDest = .Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox).Folders(strFolder)
For Each objMove In .ActiveExplorer.Selection
objMove.Move(fldDest)
Next
End With
Catch ex As System.ExceptionEnd Try
End Sub
今回は、アイテムを移動するという共通処理を MoveToFolder
というメソッドとして実装し、メニューから呼び出されるメソッド内でフォルダー名を指定して呼び出す形にしました。
ちなみに、Outlook の Application オブジェクトを VSTO アドインで使用する場合、ThisAddin.vb の中であれば Me.Application
として参照可能ですが、それ以外のモジュールから参照する場合は Globals.ThisAddin.Application
とします。
最後に、このコンテキスト メニューを使用できるように、既定で追加される ThisAddin.vb の中の Public Class ThisAddIn
から End Class
の間のどこかに以下の記述を追加します。
Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
Return New MyItemMove()
End Function
今回の例ではリボン XML の追加の際に MyItemMove という名前を付けたので、Return New MyItemMove()
となっていますが、他の名前を付けた場合は Return New リボン名()
というコードになります。
この後は、Outlook の VSTO アドインを作成する方法 に記載されている手順のアドインのビルド以降を実行して完成です。