質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.40%
Outlook

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

Q&A

解決済

1回答

415閲覧

outlook vba 分類項目の変更が保存されない

nmmtkybb

総合スコア15

Outlook

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

0グッド

0クリップ

投稿2024/06/09 05:25

編集2024/06/10 09:35

実現したいこと

outlook vbaで分類項目を変更してメールを保存したい

発生している問題・分からないこと

分類項目を変更して、メールを保存しようとするとエラーが表示されます。
分類項目の変更は、メール受信したイベントで行っています。

エラーメッセージ

error

1メッセージが変更されたために、機能は実行できません 2とエラーメッセージが表示されます

該当のソースコード

outlook

1Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 2Dim myItem As Outlook.Items 3Dim objId As Object 4 5Set myNamespace = GetNamespace("MAPI") 6Set objId = myNamespace.GetItemFromID(EntryIDCollection) 7 8objId.Categories = "test" 9objId.Save 10 11End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラーメッセージで調べましたが、解決する内容が見つかりませんでした

補足

※デバッグしたところ、エラーになる場合とならない場合がありました。
おおよそですが、4割ぐらいがエラーになっていました。メールは、大量の受信する場合もあって、仕分けルールも大量にあります。
application_NewMailexのイベントで、分類項目を変更していますが、その後、仕分けルールで格納フォルダを変更していたりとしています。なので、分類項目を保存する前に、仕分けルールによってメッセージが変更されて保存ができないということはありますでしょうか。

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

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

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

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

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

sk.exe

2024/06/11 04:29

> application_NewMailexのイベントで、分類項目を変更していますが、 > その後、仕分けルールで格納フォルダを変更していたりとしています。 > なので、分類項目を保存する前に、仕分けルールによってメッセージが > 変更されて保存ができないということはありますでしょうか。 Application.NewMailEx イベント (Outlook): https://learn.microsoft.com/ja-jp/office/vba/api/outlook.application.newmailex > クライアント コンピューターの設定によっては、新しいメッセージが > 受信トレイに配信された後に、迷惑メールのフィルター処理や、 > クライアント ルールによって新しいメッセージを受信トレイから > 別のフォルダーへ移動する処理などが、非同期に実行される場合もあります。 > これらのイベントが発生した後、受信トレイ内のアイテム数が常に 1 項目 > 増加すると想定しないでください。
guest

回答1

0

ベストアンサー

分類項目の変更は、メール受信したイベントで行っています。

vba

1'受信トレイに新しいアイテムを受信する時に発生するイベント 2Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 3 4 Dim varEntryIDs As Variant 5 Dim objItem As Object 6 Dim i As Long 7 8 '受信したアイテムのエントリIDを1次元配列に変換 9 varEntryIDs = Split(EntryIDCollection, ",") 10 11 '全てのエントリIDを1つずつ走査 12 For i = LBound(varEntryIDs) To UBound(varEntryIDs) 13 '受信したアイテムを参照 14 Set objItem = Application.Session.GetItemFromID(varEntryIDs(i)) 15 'メールアイテムの分類処理 16 Call CategorizeMail(objItem) 17 '参照解放 18 Set objItem = Nothing 19 Next 20 21End Sub 22 23'メールアイテムの分類処理 24Sub CategorizeMail(Target As Object) 25 26 If Target Is Nothing Then 27 Exit Sub 28 End If 29 30 '以下の条件のいずれかに該当する場合は分類しない 31 32 'アイテムの種類がメールアイテムではない場合 33 If Not TypeOf Target Is Outlook.MailItem Then 34 Exit Sub 35 End If 36 37 With Target 38 39 '特定の送信者アドレスと一致していない 40 If .SenderEmailAddress <> "アカウント@ドメイン" Then 41 Exit Sub 42 End If 43 44 '本文に特定のキーワードが含まれていない 45 If Not .Body Like "*キーワード*" Then 46 Exit Sub 47 End If 48 49 '分類項目の設定 50 .Categories = "分類項目 オレンジ" 51 .Save 52 53 Debug.Print "受信日時:" & Format(.ReceivedTime, "yyyy/mm/dd hh:nn:ss") 54 Debug.Print "件名:" & .Subject 55 56 End With 57 58End Sub

別解

Outlook.Application オブジェクトの NewMailEx イベントではなく、Outlook.Items オブジェクトの ItemAdd イベントを使用する場合。

vba

1'ThisOutlookSession モジュール 2Option Explicit 3 4'WithEvents 変数の宣言 5Private WithEvents MyInboxItems As Outlook.Items 6 7'Outlook アプリケーションの起動時イベント 8Private Sub Application_Startup() 9 10 '受信トレイのアイテムコレクションへの参照を WithEvents 変数に渡す 11 Set MyInboxItems = Application.Session.GetDefaultFolder(olFolderInbox).Items 12 13End Sub 14 15'Outlook アプリケーションの終了時イベント 16Private Sub Application_Quit() 17 18 '参照解放 19 Set MyInboxItems = Nothing 20 21End Sub 22 23'変数 MyInboxItems が参照するアイテムコレクションに 1 つ以上のアイテムが追加される時に発生するイベント 24Private Sub MyInboxItems_ItemAdd(ByVal Item As Object) 25 26 '追加されたアイテムの分類処理 27 Call CategorizeMail(Item) 28 29End Sub 30 31'メールアイテムの分類処理 32Sub CategorizeMail(Target As Object) 33 34 If Target Is Nothing Then 35 Exit Sub 36 End If 37 38 '以下の条件のいずれかに該当する場合は分類しない 39 40 'アイテムの種類がメールアイテムではない場合 41 If Not TypeOf Target Is Outlook.MailItem Then 42 Exit Sub 43 End If 44 45 With Target 46 47 '既読メッセージである場合 48 If .UnRead = False Then 49 Exit Sub 50 End If 51 52 '特定の送信者アドレスと一致していない 53 If .SenderEmailAddress <> "アカウント@ドメイン" Then 54 Exit Sub 55 End If 56 57 '本文に特定のキーワードが含まれていない 58 If Not .Body Like "*キーワード*" Then 59 Exit Sub 60 End If 61 62 '分類項目の設定 63 .Categories = "分類項目 オレンジ" 64 .Save 65 66 Debug.Print "受信日時:" & Format(.ReceivedTime, "yyyy/mm/dd hh:nn:ss") 67 Debug.Print "件名:" & .Subject 68 69 End With 70 71End Sub

投稿2024/06/10 02:20

編集2024/06/11 04:46
sk.exe

総合スコア894

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

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

nmmtkybb

2024/06/11 09:26

回答ありがとうございます。 MyInboxItems_ItemAddイベントで行えるか試してみたいと思います 
sk.exe

2024/06/12 01:06

ItemAdd イベントに関してはあくまで NewMailEx の代替イベントとして例示したに過ぎず、「受信トレイに配信された後に、迷惑メールのフィルター処理や、クライアント ルールによって新しいメッセージを受信トレイから別のフォルダーへ移動する処理などが、非同期に実行される」よりも早く実行されることを必ずしも保証するものではありません。 非同期実行された仕分け処理の方が先に実行されることにより、受信トレイの Items の ItemAdd イベントが発生しないことも充分にあり得ます。 そもそも「ある条件に該当する受信メールに対して任意の分類項目を設定する」という処理自体は、そういう処理を自動実行する仕分けルールを作成し、「受信メールを任意のフォルダに移動する」処理を実行するルールよりも優先度を高くしておけば充分でしょう。 その実行条件がよほど(仕分けルールでは設定不可能なほどに)特殊でない限りは、無理にVBAによって同様の処理を実行しようとしなくてもよいはずです。
nmmtkybb

2024/06/15 10:18 編集

回答ありがとうございます。もう一度、見直してみます。 仕分けルールで設定がわからなかったため、vbaで組み合わせてみてはと考えて質問させていただきました。 受信日時が本日の場合のみ、仕分けルールによって、デスクトップ通知させようと考えていました。 仕分けルールでは、デスクトップ通知ができていますが、受信日時が過去分のものも、デスクトップ通知されてしまっていました。よって、受信日時が本日の場合は、分類項目の設定を行って、仕分けルールに条件を追加させてデスクトップ通知しようと考えていました。時々しかパソコンを触れないので、今の設定を変えずに考えていました。いろいろと見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問