OUTLOOK VBA 自動仕分けウィザードでカスタムコードを使うときはレジストリを変更する必要がある

#OUTLOOK2010まではルールアクションでスクリプトが使用できていた

>#[Outlook でルールウィザードのスクリプトを作成する方法](https://docs.microsoft.com/ja-jp/office/troubleshoot/office-developer/create-script-for-rule-wizard-in-outlook)
[削除時](https://qiita.com/Q11Q/items/8d0e6d6e3b48ff869d2c)
2019/09/21 < このときより削除時用は更新されていて危ない
適用対象:
Microsoft Outlook 2010, Microsoft Office Outlook 2003
##Summary
Outlook の自動仕訳ルールウィザードを使用すると、特定のルールを作成するときに "スクリプトを実行" することができます。 これにより、開発者は、自動仕訳ルールウィザードの通常の機能を使用しても、受信メールに対してアクションを実行することができます。
##詳細
###重要
***自動仕訳ウィザードはカスタムコードを "script" として参照しますが、***Microsoft Visual Basic Scripting Edition (VBScript) や Microsoft JScript などの他のスクリプト言語ではなく、***Outlook Visual basic for Applications でコードを作成する必要があります。*** また、Outlook Visual Basic for Applications は展開するように設計されていないため、このカスタムコードを展開するには、各ユーザーのコンピューターに手動で構成する必要があります。 Outlook COM アドインでカスタムコードを作成することはできません。 Visual Basic for Applications プロジェクトの配布に関連する制限の詳細については、以下の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
290779 Outlook 2002 Visual Basic for APPLICATIONS (VBA) プロジェクトの管理と配布に関する説明
https://docs.microsoft.com/en-us/exchange/troubleshoot/development/manage-distribute-outlook-vba-project
https://docs.microsoft.com/ja-jp/exchange/troubleshoot/development/manage-distribute-outlook-vba-project

>(注意点の説明)
###サブルーチンの作成
メッセージを処理するカスタムコードを実装するには、Visual Basic for Applications でサブルーチンを作成します。 サブルーチンの名前は重要ではありませんが、ルールウィザードがメールメッセージ (MailItem) または会議出席依頼 (MeetingItem) をサブルーチンに渡すため、1つの引数を受け取る必要があります。 引数は MailItem または MeetingItem 型である必要があります。それ以外の場合、このサブルーチンは自動仕訳ウィザードで使用できません。 Object 型の引数を定義することにより、両方の種類のアイテムを処理する1つのサブルーチンを作成することはできません。 次の Outlook Visual Basic for Applications コードは、サブルーチンの作成方法を示しています。

```vb
Sub CustomMailMessageRule(Item As Outlook.MailItem)
   MsgBox "Mail message arrived: " & Item.Subject
End Sub

Sub CustomMeetingRequestRule(Item As Outlook.MeetingItem)
   MsgBox "Meeting request arrived: " & Item.Subject
End Sub
```

>このサブルーチンは、ThisOutlooksession を含む任意のモジュールに配置できますが、サブルーチンを別のモジュールに移動したり、サブルーチンの名前を変更したりする場合は、更新されたサブルーチンを指すようにルールを変更する必要があります。

###この内容の分析
しかしこのヘルプの内容は自動仕分けウィザードを使わなくてもカスタムコードで仕分けることができるのか、あるいは自動仕分けウィザードにカスタムコードがつけられるのか、分かりづらい説明になっている。多分両方できるのだろう。
自動仕分けではないカスタムコードはイベントをトリガーにする場合である。
そして自動仕分けのカスタムコードとしてはScriptから起動する場合である。
<UL>
<li>自動仕分けウィザードでScriptを起動させる場合、VBAのカスタムコードしか受け付けていない。
<li>自動仕分けウィザードで「Scriptを実行する」が選択できるのは、MeetingItemとMailItemの場合。ほかは自動仕分けウィザードには表示されない。
<li>その展開（配布）は手動になる。
<li>上記のコードはThisOutlookSessionかClassに置くのが通常。
</UL>

そして次の内容がもっと重要。
#Outlook2019-2010において特定の月以降の更新ではセキュリティが変更されレジストリを変えないと作成及び動作できなくなった
[[アプリケーションを開始する] および [スクリプトを実行する] の処理を実行する仕分けルールが動作しない、または作成できなくなる](https://blogs.technet.microsoft.com/outlooksupportjp/2017/12/29/rule_security/)
Outlook Support Team Blog
>こんにちは。日本マイクロソフト Outlook サポート チームです。

>Outlook 2016 (Office 365 ProPlus : クイック実行版) のビルドを更新すると、もしくは Outlook 2010 / 2013 / 2016 (Office Professional Plus 2016 : MSI 版) の特定の月以降にリリースされた更新プログラムを適用すると、セキュリティ強化のため、[アプリケーションを開始する] および [スクリプトを実行する] の処理を実行する仕分けルールが動作しないように変更されます。
どのように動作が変更となるか？

>セキュリティ強化のため、以下の通り既定の動作が変更となります。

> 1. [アプリケーションを開始する] および [スクリプトを実行する] の処理を実行する、既存の仕分けルールが動作しなくなります。
> 2. [アプリケーションを開始する] もしくは [スクリプトを実行する] の処理を実行する、新規の仕分けルールを作成できなくなります。

>以下の通り、仕分けルール作成画面が変更となります。

仕分けルール作成画面で選択肢自体が消えてしまう。
(このあとバージョンについてブログは詳細に説明しているが省略）

##回避策
>以下の通りレジストリを登録することで元の動作に戻すことができます。

>###(A) 手動でレジストリを登録する方法

> 1. Windows の [スタート] ボタンをクリック後に "regedit" と入力し、検索結果の regedit をクリックします。
> 2. 以下のキーを登録します。

>キー : HKEY_CURRENT_USER\Software\Microsoft\Office\xx.0\Outlook\Security
名前: EnableUnsafeClientMailRules
種類: REG_DWORD
値: 1 (有効)

>※レジストリ キーのパス中にある xx は以下の通りです。
Outlook 2010 の場合 : 14
Outlook 2013 の場合 : 15
Outlook 2016 の場合 : 16

Outlook 2019 の場合 : 16
この他にグループポリシーを変更する方法等がある。
なお、下記サイトにあるように
[https://support.microsoft.com/en-us/help/3191893/how-to-control-the-rule-actions-to-start-an-application-or-run-a-macro](https://support.microsoft.com/en-us/help/3191893/how-to-control-the-rule-actions-to-start-an-application-or-run-a-macro)
このキーを無効にしたい場合はキーを削除してもよいが、値を0にしてもよい。この記事はOutlook Spport Team Japan Blogが消えたので、代替の英語版の詳細記事となります。

###実験結果
上記のコードをThisOutlookSessionにコピペしておく
レジストリを変える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/ab0cf275-351b-425c-b5ee-86a0d286847d.png)

成功すると次のように表示されるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/f517d6dc-0ab5-91a3-809b-227915870d22.png)

するとこのように表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/bca15b02-8d9d-260f-9a0a-4025b3f8de43.png)

ただしメールに有効なのは1つだけである。（もう一つはMeetingItemのため）
ここからカスタム仕分けルールでもあるし、自動仕分けルールに付加することもできることがわかる。

###カスタム仕分けルールアクションはなんに使えるか
今のように重要度が高いメールのみメッセージが表示されるという使い方ができる。

以前うまく行かなかったのはこの設定をしていなかったからのようだ。

###補足(2020/08/28追加)
####上記のような設定をしてもたまに動かない場合があり、回避方法がAnswers Microsoft Comに掲載されている
[[アプリケーションを開始する] および [スクリプトを実行する] の処理を実行する仕分けルールが動作しない、または作成できなくなる](https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC/b113864a-75da-417f-830c-10197a8edbac)
上記の処理をしても「スクリプトを実行する」が処理されない場合がある。
Version Outlook Version 1905 Built 11629.20246 Quick

####回避方法
>一度 Outlook の ファイル ＞ オプション ＞ 言語
>で すべての言語設定を 英語に変更してから Outlook を 再起動させて、
>Run a Script が表示されているのを確認してから、
>もう一度 日本語に設定を戻して スクリプトを実行が表示されるか確認してみてください。

###上記のブログの記事が消えたので

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Outlook Support Team Blog JAPAN（<a href="https://t.co/q0FIuM9PsQ">https://t.co/q0FIuM9PsQ</a>）は消滅しましたが、一部の記事は MSDN フォーラム（<a href="https://t.co/Ys5HKiesQP">https://t.co/Ys5HKiesQP</a>）に退避されているようです。 <a href="https://twitter.com/hashtag/o365jp?src=hash&amp;ref_src=twsrc%5Etfw">#o365jp</a> <a href="https://twitter.com/hashtag/Exchange?src=hash&amp;ref_src=twsrc%5Etfw">#Exchange</a> <a href="https://twitter.com/hashtag/Outlook?src=hash&amp;ref_src=twsrc%5Etfw">#Outlook</a></p>&mdash; Ota Hirofumi @ 外出自粛協力中 (@hrfmjp) <a href="https://twitter.com/hrfmjp/status/1110096030060576768?ref_src=twsrc%5Etfw">March 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

[突然消滅したMicrosoft TechNet／MSDNブログ（日本語）の捜索](https://www.atmarkit.co.jp/ait/articles/1906/04/news004.html)
>2019年3月までに、MicrosoftのTechNetブログやMSDNブログにあった各種製品やサポートチームの公式ブログの多くが突然閉鎖されました。本稿は先月（4月）そのことをお伝えするために書いたものですが、記事の完成直前、4月中旬に行方不明になっていた日本語ブログの多くが復元されたため、修正を加えて今回の記事としました。
2019年06月04日 05時00分 公開
[山市良，テクニカルライター]

Outlook Support Team Japan Blog以外も不完全な移行をしたものが多数ある。マイクロソフトにとって日本は対して重要なマーケットではないためないがしろにされていることがよくわかります。

[【お知らせ】Exchange & Outlook サポートチーム フォーラムについて ](https://social.msdn.microsoft.com/Forums/ja-JP/a829093a-95a1-47b0-b2c8-a2795df18aac/123041236230693124251237912305exchange-amp-outlook?forum=exchangeteamjp)
オンプレミス Exchange Server 、Exchange Online 及び Outlook を日々ご利用いただき誠にありがとうございます。

「Exchange & Outlook サポートチーム」フォーラムの新規運用についてお知らせします。
当フォーラムは、弊社技術サポート部門より、お問い合わせが多いExchange や Outlook に関連した情報をサポート トピックとして、皆様よりご要望が多い情報を配信します。
※ 情報発信専用のフォーラムとなるため、投稿したトピックに関する質疑応答ができない点について予めご了承ください。
Exchange & Outlook サポートチーム
2018年12月21日 3:15
と移行したのだが、記事の内容は全て移行したわけではない。一部は消滅している。

###代替記事はタイトルを完全に訂正して紹介
この表題はマイクロソフトの翻訳のアルゴリズムに深刻で致命的なエラーがあるとしか思えない。
[~~アプリケーションを起動または 2016 を Outlook でマクロを実行するルールの処理を制御する方法と、Outlook 2013~~Outlook 2016 Outlook 2013 で「アプリケーションを開始する」や「スクリプト（マクロ）を実行する」という仕分けルールアクションを作成、動作させる方法](https://support.microsoft.com/ja-jp/help/3191893/how-to-control-the-rule-actions-to-start-an-application-or-run-a-macro)
####英語
How to control the rule actions to start an application or run a macro in Outlook 2016 and Outlook 2013

###同じテーマを扱っているところをリンクします。
[Outlook 2016で仕分けルールでスクリプトを実行する - マゴトログ](https://blog.janjan.net/2018/09/18/outlook-2016-sort-rules-running-script/)
Microsoft Outlookで仕分けでVBAでカスタマイズしたルールを実行させる手順です。VisualBasicなどの言語の知識が多少必要になりますが、テンプレで用意されていない仕分けルールを実現できるようになります。

[Outlook 2016/2013 でルールによるアプリケーションやマクロの実行ができない 2017/07/08 OUtlook Lab](https://outlooklab.wordpress.com/2017/07/08/outlook-20162013-%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%84%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE/)