2017年1月5日木曜日

Outlook 2013 でメールを全部開封済みにするマクロを作成した

概要

メールの振り分け設定をしている環境で各ディレクトリごとに開封済みにするのが面倒でした
ということで、存在する全ディレクトリ (受信トレイを含む) 配下にあるメールを配信済みにするマクロを作成しました
今回のマクロでは 2 階層分まで対応しています

階層的には以下のようなディレクトリ構成を想定しています
これの受信トレイ配下のメールと ssubN 配下のメールを全部 UnRead にします

受信トレイ
├── sub1
│   ├── ssub1
│   ├── ssub2
│   └── ssub3
└── sub2
    ├── ssub1
    └── ssub2

環境

  • Windows7 64bit
  • Outlook 2013

マクロ

Sub allUnRead()
  Set myNamespace = Application.GetNamespace("MAPI")
  Set inbox = myNamespace.GetDefaultFolder(olFolderInbox)
  ' 受信トレイ配下のメールを UnRead する
  For Each mail In inbox.Items
    If (mail.Class = olMail) And (mail.UnRead) Then
      mail.UnRead = False
    End If
  Next
  Dim sum As Integer
  ' 受信トレイ直下のサブディレクトリ
  For i = 1 To inbox.Folders.Count
    Set subFolder = inbox.Folders.Item(i)
    ' サブディレクトリ直下のサブサブディレクトリ
    For j = 1 To subFolder.Folders.Count
      sum = sum + 1
      Set ssubFolder = subFolder.Folders.Item(j)
      ' それを UnRead する
      For Each mail In ssubFolder.Items
        If (mail.Class = olMail) And (mail.UnRead) Then
          mail.UnRead = False
        End If
      Next
    Next
  Next
  MsgBox sum
End Sub

簡単な説明

まずメールにアクセスするための準備をします

Set myNamespace = Application.GetNamespace("MAPI")

そして受信トレイのオブジェクトを取得します
olFolderInbox を指定することで受信トレイのオブジェクトが取得できます
ここで指定する値を変更すると連絡先や予定の情報も取得することができます
参考: https://msdn.microsoft.com/ja-jp/library/office/ff861868.aspx

Set inbox = myNamespace.GetDefaultFolder(olFolderInbox)

まずは受信トレイ直下にあるメールを全部 UnRead にします

For Each mail In inbox.Items
  If (mail.Class = olMail) And (mail.UnRead) Then
    mail.UnRead = False
  End If
Next

If 文の条件がないとすでに UnRead になっているメールに対しても再度 UnRead のフラグを立てようとしてしまいます
問題はないのですが、大量のメールがあるときに非常に重くなるので入れたほうが良いです

次に受信トレイ直下にあるサブディレクトリを取得します

For i = 1 To inbox.Folders.Count
  Set subFolder = inbox.Folders.Item(i)

そしてその後すぐにサブディレクトリ直下にあるサブサブディレクトリを取得します

For j = 1 To subFolder.Folders.Count
  Set ssubFolder = subFolder.Folders.Item(j)

あとはサブサブディレクトリ直下にあるメールをすべて UnRead にします

For Each mail In ssubFolder.Items
  If (mail.Class = olMail) And (mail.UnRead) Then
    mail.UnRead = False
  End If
Next

一応最後に終了したことを把握するためメッセージを表示します

MsgBox sum

これは取得したサブサブディレクトリの数を表示しています

マクロの登録

この記事の手順通りに実施しました

  1. 開発 -> マクロ -> マクロ
  2. 名前入力 (allUnRead) -> 作成
  3. 今回のスクリプトをコピペ
  4. 実行

でマクロを実行できます
再度実行したい場合は

開発 -> マクロ -> allUnRead

を選択すれば OK です

最後に

Outlook 2013 で階層化されているメールを全部 UnRead するマクロを作成しました
今回は Outlook のイベントを使っていないので普通のマクロとして作成しています
ThisOutlookSession 側のマクロではないのでそっちにコピペしないようにしてください

0 件のコメント:

コメントを投稿