Outlook 2016/2013/2010 の累積的な修正プログラム 2019 年 2 月分がリリース

2/5 に Outlook 2016/2013/2010 の累積的な修正プログラムがリリースされました。

以下は各製品のそれぞれの KB へのリンクです。

Office 2016

Outlook 2016 の修正

Outlook 2016 (KB4462147) の更新プログラムを 2019 年 2 月 5日
8 件の不具合修正が行われています。

Word 2016 の修正

Word 2016 (KB4462145) の更新プログラムを 2019 年 2 月 5日
2 件の Outlook に関する不具合の修正が行われています。

Office 2013

Outlook 2013 の修正

Outlook 2013 (KB4462141) の更新プログラムを 2019 年 2 月 5日
1 件の不具合修正が行われています。

Office 2010

Outlook 2010 の修正

2019 年 2 月 5日は、Outlook 2010 (KB4462182) の更新します。
1 件の不具合修正が行われています。

広告

共有メールボックスに受信したメールの件名に連番を付与するマクロ

コメントにて以下のご要望をいただきました。


共有メールボックスに受信される「指定のメールボックス」に、受信したメールの件名に連番を自動で発番していくマクロはありますでしょうか。 そもそも、共有メールボックスにマクロを入れるのは不可能なのでしょうか。


共有メールボックスに受信したメールについてマクロを実行する方法については「共有メールボックスの受信トレイに追加されたメールの添付ファイルを保存するマクロ」で解説した通りです。

連番を自動で発番するとなると、発番済みの番号を管理する必要が出てきます。
VBA では SaveSetting ステートメントで VBA 固有のレジストリ キーに設定を保存し、GetSetting 関数で設定した値を読み込むことができます。
マクロは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。
' 共有フォルダーのイベントを取得するためのオブジェクト
Dim WithEvents sharedInboxItems As Items
'
Private Sub Application_Startup()
     ' 共有メールボックスの SMTP アドレスを指定
     Const SHARED_USER = "shareduser@example.com"
     Dim recShared As Recipient
     Dim fldSharedInbox As Folder
     ' 共有メールボックスのユーザー情報を取得
     Set recShared = Session.CreateRecipient(SHARED_USER)
     recShared.Resolve
     ' 共有メールボックスの受信トレイを取得
     Set fldSharedInbox = Session.GetSharedDefaultFolder(recShared, olFolderInbox)
     Set sharedInboxItems = fldSharedInbox.Items
End Sub
'
' 共有フォルダーの受信トレイにアイテムが追加された際に発生するイベント
Private Sub sharedInboxItems_ItemAdd(ByVal Item As Object)
     '
     Const APP_NAME = "OutlookLab"
     Const SEC_NAME = "SharedInboxCount"
     Const KEY_NAME = "LastCount"
     Dim iSeq As Integer
     Dim strPrefix As String
     '
     ' 必要に応じてここで条件指定
     '
     ' レジストリから連番を取得
     iSeq = CInt(GetSetting(APP_NAME, SEC_NAME, KEY_NAME, "0"))
     iSeq = iSeq + 1
     ' 件名に追加する文字列を生成
     strPrefix = "[" & iSeq & "] "
     ' 生成した文字列を懸命に追加
     Item.Subject = strPrefix & Item.Subject
     ' アイテムを保存
     Item.Save
     ' レジストリに連番を保存
     SaveSetting APP_NAME, SEC_NAME, KEY_NAME, iSeq
End Sub

マクロの登録方法やメニューへの追加について

選択されている複数のメールのメールヘッダー情報を Excel ファイルにエクスポートするマクロ

コメントにて以下のご要望をいただきました。


お世話になります。
  複数のメールのメールヘッダー情報をExcelへ一覧として出力する方法はありますでしょうか?

現在、一度に50件~100件のメールのメールヘッダー情報を手動で確認するという業務がありまして、
  1つ1つクリックしてヘッダー情報を確認するということが非常に手間でありますので、
なんとかこれを自動化したいと思い、Outlookマクロの勉強をはじめたのですが、
ネット上を探してもマクロでメールヘッダーを取り扱う際の情報があまりなく、
もしご存知でしたら、ご教示いただけないでしょうか?

お力添えいただけますと幸いです。


インターネットのメールヘッダーの情報は MAPI の PidTagTransportMessageHeaders というプロパティで取得が可能です。
このプロパティにアクセスするには、MailItem オブジェクトの PropertyAccessor プロパティの GetProperty メソッドに、PidTagTransportMessageHeaders を意味する “http:​//schemas.microsoft.com/mapi/proptag/0x007d001f” という文字列を渡します。
なお、この文字列は URL のように見えますが、実際にはこのような URL は存在せず、Outlook がこの URL にアクセスするようなこともありません。

これを使って、現在表示しているフォルダーで選択した複数のメールのメールヘッダーをまとめて Excel ファイルにエクスポートするマクロは以下のようになります。
なお、エクスポートする Excel ファイルはあらかじめ作成しておいてください。

' ここをトリプルクリックでマクロ全体を選択できます。

Public Sub ExportInternetHeaders()
     Const PidTagTransportMessageHeaders = "http:" & _
         "//schemas.microsoft.com/mapi/proptag/0x007d001f"
     ' Excel のファイル名を指定
     Const EXCEL_FILE = "c:\temp\headers.xlsx"
     Dim objBook As Object 'Excel.Workbook
     Dim objSheet As Object 'Excel.Worksheet
     Dim iRow As Integer
     Dim objMail As MailItem
     ' Excel ファイルを開く
     Set objBook = GetObject(EXCEL_FILE)
     objBook.Windows(1).Activate
     ' シート 1 を取得
     Set objSheet = objBook.Worksheets(1)
     ' データが入っていない行を検索
     iRow = 1
     While objSheet.Cells(iRow, 1) <> ""
         iRow = iRow + 1
     Wend
     ' 現在のフォルダーで選択されているアイテムについて実行
     For Each objMail In ActiveExplorer.Selection
         With objMail
             ' 差出人を 1 列目にコピー
             objSheet.Cells(iRow, 1) = .SenderName
             ' 件名を 2 列目にコピー
             objSheet.Cells(iRow, 2) = .Subject
             ' 受信日時を 3 列目にコピー
             objSheet.Cells(iRow, 3) = .ReceivedTime
             ' ヘッダーを 4 列目にコピー
             objSheet.Cells(iRow, 4) = _
                 .PropertyAccessor.GetProperty(PidTagTransportMessageHeaders)
         End With
         ' 次の行に移動
         iRow = iRow + 1
     Next
     ' Excel ファイルを保存
     objBook.Close True
End Sub

マクロの登録方法やメニューへの追加について

共有メールボックスの受信トレイに追加されたメールの添付ファイルを保存するマクロ

コメントにて以下のご要望をいただきました。


いつもこちらのサイトで勉強させて頂いております。

以下のマクロ(受信したメールの添付ファイルを自動保存するマクロ)を、共有メールフォルダーに対しても受信をトリガーに実行したいのですが、どのようにスクリプトを書けば良いでしょうか。

https://outlooklab.wordpress.com/2007/03/10/%E5%8F%97%E4%BF%A1%E3%81%97%E3%81%9F%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%87%AA%E5%8B%95%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%83%9E

なお、outlook 2010を使用しています。

どうぞよろしくお願い致します。


自分自身のメールボックスの受信トレイに受信したメールについては NewMailEx イベントを使用しますが、それ以外のフォルダーに関しては、そのフォルダーの Items プロパティの ItemAdd イベントを使用します。
ただ、このイベントを使用するためには、イベントが発生するフォルダーの Items を WithEvents 句付きでグローバル変数として定義し、Application_StartUp でそのグローバル変数に該当する Items オブジェクトを格納する必要があります。

マクロは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。

' 共有フォルダーのイベントを取得するためのオブジェクト
Dim WithEvents sharedInboxItems As Items
'
Private Sub Application_Startup()
     ' 共有メールボックスの SMTP アドレスを指定
     Const SHARED_USER = "shareduser@example.com"
     Dim recShared As Recipient
     Dim fldSharedInbox As Folder
     ' 共有メールボックスのユーザー情報を取得
     Set recShared = Session.CreateRecipient(SHARED_USER)
     recShared.Resolve
     ' 共有メールボックスの受信トレイを取得
     Set fldSharedInbox = Session.GetSharedDefaultFolder(recShared, olFolderInbox)
     Set sharedInboxItems = fldSharedInbox.Items
End Sub
'
' 共有フォルダーの受信トレイにアイテムが追加された際に発生するイベント
Private Sub sharedInboxItems_ItemAdd(ByVal Item As Object)
     Const SAVE_PATH = "C:\temp\"
     Dim objFSO As Object ' FileSystemObject
     Dim objAttach As Attachment
     Dim strFileName As String
     Dim c As Integer: c = 1
     '
     Set objFSO = CreateObject("Scripting.FileSystemObject")
     '
     ' 必要に応じてここで条件指定
     '
     For Each objAttach In Item.Attachments
         With objAttach
             strFileName = SAVE_PATH & objAttach.FileName
             While objFSO.FileExists(strFileName)
                 strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, ".") - 1) _
                     & "-" & c & Mid(.FileName, InStrRev(.FileName, "."))
                 c = c + 1
             Wend
             .SaveAsFile strFileName
         End With
     Next
     Set objMsg = Nothing
     Set objFSO = Nothing
End Sub

マクロの登録方法やメニューへの追加について

最後に返信をした日時を CSV ファイルにエクスポートするマクロ

コメントにて以下のご要望をいただきました。


outlookの受信トレイからメール返信を行ったものに対して、受信から48時間以内に
返信ができているかを確認し、集計する方法はあるのでしょうか。
返信をするとそのメールには「○月○日○時○分に返信しました」と表示されているのですが、
それが、ただ表示なのかデータとして移動できる項目なのかもわかりません。
Excelに貼り付けたりできれば、集計できるのではないかと考えているのですが、
そもそもそのようなことができるのか、他に良い方法があるのか、outlookの機能に
方法があるのかなどご存知でしたら、お教えいただけませんでしょうか。


Outlook で返信や転送を行った場合、以下のような MAPI プロパティに操作内容と日時が記録されます。

PidTagLastVerbExecuted – 最後に行った特定の操作
PidTagLastVerbExecutionTime – 最後に特定の操作を行った日時

そして、この情報をもとに Outlook は「○月○日○時○分に返信しました」というような情報を表示しています。
したがって、これらのプロパティの内容を CSV として書き出せば、集計は可能と考えられます。

ただし、このプロパティは最後に返信や転送を行った日時を記録するという点に注意が必要です。
例えば、一度全員に返信を行った後、同じメールを転送した場合、返信を行った記録は転送の記録で上書きされ、返信した日時が不明になります。
残念ながら、返信の履歴を追うようなことは困難です。

現在表示しているフォルダーのアイテムについて、返信を行ったメールの件名、受信日時、返信日時を CSV ファイルとしてエクスポートするマクロは以下のようなものになります。

' ここをトリプルクリックでマクロ全体を選択できます。

Public Sub ExportLastReplyDate()
     On Error Resume Next
     ' MAPI の定数定義
     Const PidTagLastVerbExecuted = "http:" & "//schemas.microsoft.com/mapi/proptag/0x10810003"
     Const PidTagLastVerbExecutionTime = "http:" & "//schemas.microsoft.com/mapi/proptag/0x10820040"
     Const NOTEIVERB_REPLYTOSENDER = 102
     Const NOTEIVERB_REPLYTOALL = 103
     ' エクスポート先の CSV ファイルのパスを指定
     Const CSV_FILE_NAME = "c:\temp\replyreport.csv"
     Dim fldCurrent As Folder
     Dim itmCurrent As Variant
     Dim iVerb As Integer
     Dim dtExec As Date
     ' CSV ファイルを開く
     Open CSV_FILE_NAME For Output As #1
     ' 1 行目を書き出し
     Print #1, "件名,受信日時,返信日時"
     ' 現在表示しているフォルダーを取得
     Set fldCurrent = ActiveExplorer.CurrentFolder
     ' フォルダーのすべてのアイテムを処理
     For Each itmCurrent In fldCurrent.Items
         With itmCurrent.PropertyAccessor
             ' 最後の実行した操作を取得
             iVerb = .GetProperty(PidTagLastVerbExecuted)
             ' 操作が返信の場合
             If iVerb = NOTEIVERB_REPLYTOSENDER _
             Or iVerb = NOTEIVERB_REPLYTOALL Then
                 ' 返信を実行した日時を取得
                 dtExec = .GetProperty(PidTagLastVerbExecutionTime)
                 ' CSV に件名と受信日時、返信を実行した日時を書き出す
                 Print #1, """" & itmCurrent.Subject & """," & _
                     itmCurrent.ReceivedTime & "," & dtExec
             End If
         End With
     Next
     ' ファイルを閉じる
     Close #1
End Sub

マクロの登録方法やメニューへの追加について

Outlook 2016/2013/2010 のセキュリティ修正プログラム 2019 年 1 月分がリリース

1/8 に Outlook 2016、Outlook 2013 および Outlook 2010 のセキュリティ修正プログラムがリリースされました。 以下は各製品のそれぞれの KB へのリンクです。

Office 2016

Outlook 2016 の修正

2016 の Outlook のセキュリティ更新プログラムの説明: 2019 年 1 月 8日 1 件のセキュリティ修正と 14 件のセキュリティ以外の修正が行われています。

Word 2016 の修正

2016 の Office のセキュリティ更新プログラムの説明: 2019 年 1 月 8日 2 件の Outlook に関する修正が行われています。

Office 2016 共通コンポーネントの修正

2016 の Word のセキュリティ更新プログラムの説明: 2019 年 1 月 8日 1 件の Outlook に関する修正が行われています。

Office 2013

Outlook 2013 の修正

Outlook 2013 のセキュリティ更新プログラムについて2018 年 12 月 12 日 1 件のセキュリティ修正と 4 件のセキュリティ以外の修正が行われています。

Office 2010

Outlook 2010 の修正

Outlook 2013 のセキュリティ更新プログラムについて2018 年 12 月 12 日 1 件のセキュリティ修正と 2 件のセキュリティ以外の修正が行われています。

12周年

2007 年にこのブログをはじめて、12 周年になりました。

昨年は残念ながら年間 100 万アクセスに到達することはできませんでしたが、今でも「Outlook マクロ」で検索するとトップで表示されており、これもひとえにコメントで様々なご要望をお寄せくださる読者の方々のおかげと感謝しております。

これからも、Outlook を活用してもらうべく、様々なマクロや Tips を紹介してまいりますので、よろしくお願いいたします。