🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

解決済

1回答

3407閲覧

outlook2013でのApplication.New MailExイベントの挙動について

culych

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

0クリップ

投稿2021/01/14 06:46

Outlook2013のマクロApplication.NewMailExイベントを使用してメール受信時処理を行なっています。
上記のイベントで、1回の受信で、複数件メールを受信した場合は引数にメールの件数分entryIDcollectionがカンマ区切りで設定されるらしいのですが、公式サイトでイベントについて確認したところoutlook2007以降は仕様が変わって複数件メールを受信したとしても引数に設定されるentryIDcollectionは最後に受信したメール分しか設定されないとの事でした。
outlook2007以前のように、複数件メールを受信した場合に1件ずつ処理を行う為に何かいい方法はありますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Outlook 2007 以降でもすべての受信メールについて NewMailEx イベントは実行されます。
日本語のドキュメントでは「このイベントは、Microsoft Outlook によって処理されたすべての受信アイテムに対して1回発生します」とあるので、すべてのメールにまとめて一回というような印象になってしまいますが、英語では「This event fires once for every received item that is processed by Microsoft Outlook. 」となっており、より正確に訳すなら「このイベントは、Microsoft Outlook によって処理されたすべての受信アイテムごとに1回ずつ発生します」となります。

ただし、NewMailEx イベントの処理時間が長く、処理中に別のメールを受信した場合に、NewMailEx イベントが発生しないことはあるようです。
そのため、もし処理に時間がかかるようなマクロを実行するのであれば、スクリプトとして切り出して別途実行するなどの工夫が必要になるかもしれません。

投稿2021/01/14 09:30

millefeuille

総合スコア226

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

culych

2021/01/15 00:52 編集

お返事が遅れて申し訳ございません。 そうなのですか。。。 ①マクロで上記のイベントを記載してブレイクポイントを設定 ②3通ほど対象のメールアドレスにメールを送信後、outlookの「すべてのフォルダーを送受信」押下 ③ブレイクポイントにてデバック発生、引数にはentryIdcollectionの値が設定されていますが、カンマ区切りにはなっていない ④③でどのメールのidを引数に設定しているか確認したところ、最後に送信したメールのものだった 上記の①〜④の流れで何かおかしい点はございますでしょうか。そもそも、②の「すべてのフォルダーを送受信」を押下していることがダメなのでしょうか。ブレイクポイントに到達時、裏では送信したメール全てがメールボックスに未読として到着していました。
millefeuille

2021/01/15 05:55

ブレイクポイントでマクロの動作が止まっている間に間に受信したメールについてはイベントが発生しません。 動作確認の際は Debug.Print EntryIDCollection でイミディエイトウィンドウに値を出力するようにして、マクロの実行を止めないようにしてください。
culych

2021/01/15 08:33 編集

ご回答ありがとうございます。 ①Debug.Print EntryIDCollectionを関数のすぐ下に配置 ②ブレイクポイントを全て外し、メッセージボックスによる出力も一旦コメントアウト メールを3通受信しました。 イミディエイトウィンドウには EntryIDCollectionが3行、同じ値で出力されていました。 恐らく3通分関数が動いているのだろうとは思うのですが、望んでいる動作(カンマ区切りでのID出力)ではありません。 マクロではなくoutlook側の設定で、望んだ動作にならない事もあるのでしょうか。。。 追記 どのメールが取れているかを確認する為に異なる件名をつけて、イミディエイトウィンドウに出力したところ、同一のId3行分と異なる件名3行分が取れていました。 別の方法で、各メールに1件ずつ添付ファイルをつけて受信したところ、今度は3件ではなく1件分の情報しかイミディエイトウィンドウに表示されませんでした。 ファイル自体は300バイトのテキストファイルなのですが、これだけでもPCがbusy状態になりマクロで1件しか処理がされないといった現象が起きているのでしょうか。
millefeuille

2021/01/15 12:25

EntryIDCollection がカンマ区切りとなるのは古いバージョンでの動作であり、Outlook 2010 以降はカンマ区切りとはなりません。 単純な処理でなら動作するようですので、やはりマクロでの処理に時間がかかっているということになると考えられます。
culych

2021/01/15 14:25

ご回答ありがとうございます。 添付ファイルの容量が小さくても、メールの量が複数になると処理に時間がかかってしまい、結果最後のメールしか処理できなくなっているということですかね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問